framefields 2.0.10 → 2.0.11

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 (238) hide show
  1. package/README.md +17 -6
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BxA0sL9z.d.mts → audio-BHanw8Jb.d.mts} +3 -3
  5. package/dist/{audio-BxA0sL9z.d.mts.map → audio-BHanw8Jb.d.mts.map} +1 -1
  6. package/dist/{audio-B7Al-W_0.mjs → audio-COOMNwL5.mjs} +4 -4
  7. package/dist/{audio-B7Al-W_0.mjs.map → audio-COOMNwL5.mjs.map} +1 -1
  8. package/dist/{dist-BFjSQP7i.mjs → dist-BAVZdFEJ.mjs} +3 -3
  9. package/dist/{dist-BFjSQP7i.mjs.map → dist-BAVZdFEJ.mjs.map} +1 -1
  10. package/dist/{dist-DzUJmIHt.mjs → dist-BYqNNwsl.mjs} +2 -2
  11. package/dist/{dist-DzUJmIHt.mjs.map → dist-BYqNNwsl.mjs.map} +1 -1
  12. package/dist/{dist-B9Afsv83.mjs → dist-CbG3QxDw.mjs} +651 -2
  13. package/dist/dist-CbG3QxDw.mjs.map +1 -0
  14. package/dist/{dist-B9PkqWnN.mjs → dist-Cxi68OuY.mjs} +5322 -3274
  15. package/dist/dist-Cxi68OuY.mjs.map +1 -0
  16. package/dist/effects/index.d.mts +4 -4
  17. package/dist/effects/index.mjs +25 -25
  18. package/dist/{effects-CREopCyP.mjs → effects-DzbjFhyA.mjs} +3 -3
  19. package/dist/{effects-CREopCyP.mjs.map → effects-DzbjFhyA.mjs.map} +1 -1
  20. package/dist/fonts/index.d.mts +2 -2
  21. package/dist/fonts/index.mjs +1 -1
  22. package/dist/{fonts-DhEQ5h6E.mjs → fonts-C0W6TgJk.mjs} +52 -5
  23. package/dist/fonts-C0W6TgJk.mjs.map +1 -0
  24. package/dist/{index-J9CIK_nu.d.mts → index-9B8CJowc.d.mts} +2 -2
  25. package/dist/{index-J9CIK_nu.d.mts.map → index-9B8CJowc.d.mts.map} +1 -1
  26. package/dist/{index-CvDVpaKn.d.mts → index-CDoTrMs1.d.mts} +4 -4
  27. package/dist/{index-CvDVpaKn.d.mts.map → index-CDoTrMs1.d.mts.map} +1 -1
  28. package/dist/{index-BXNNJVs8.d.mts → index-CYGpSVsf.d.mts} +2 -2
  29. package/dist/{index-BXNNJVs8.d.mts.map → index-CYGpSVsf.d.mts.map} +1 -1
  30. package/dist/{index-D1zaOwEU.d.mts → index-DDEPvMww.d.mts} +520 -71
  31. package/dist/index-DDEPvMww.d.mts.map +1 -0
  32. package/dist/{index-oodg5k9K.d.mts → index-DGJp1d30.d.mts} +3 -3
  33. package/dist/{index-oodg5k9K.d.mts.map → index-DGJp1d30.d.mts.map} +1 -1
  34. package/dist/{index-fo4E7A6C.d.mts → index-DRZu3ezy.d.mts} +3 -3
  35. package/dist/{index-fo4E7A6C.d.mts.map → index-DRZu3ezy.d.mts.map} +1 -1
  36. package/dist/{index-CQcdKyxF.d.mts → index-DnWsbbuZ.d.mts} +54 -2
  37. package/dist/index-DnWsbbuZ.d.mts.map +1 -0
  38. package/dist/index.d.mts +398 -18
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +633 -57
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/preview/index.d.mts +2 -2
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-9ifxywUM.mjs → preview-BV2C4Fk6.mjs} +2 -2
  45. package/dist/{preview-9ifxywUM.mjs.map → preview-BV2C4Fk6.mjs.map} +1 -1
  46. package/dist/preview-engine/{chunk-VVLM6LZ3.mjs → chunk-6256GQFP.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-YG35X5R5.mjs → chunk-AWTH2WZO.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-7DIAFPQP.mjs → chunk-ECPP3UG6.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-5JD65JSJ.mjs → chunk-FGHOHCFG.mjs} +1 -1
  50. package/dist/preview-engine/chunk-IMV5SBQV.mjs +1 -0
  51. package/dist/preview-engine/chunk-IQKIHFNZ.mjs +1 -0
  52. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +474 -0
  53. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +3 -0
  54. package/dist/preview-engine/chunk-NFAGEP43.mjs +1448 -0
  55. package/dist/preview-engine/{chunk-AG5JNZYQ.mjs → chunk-Q66QQI6N.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-JAOXXYXG.mjs → chunk-QYRDQMNB.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-XCYFPA34.mjs → chunk-RJUAM52F.mjs} +1 -1
  58. package/dist/preview-engine/chunk-VRGREB3V.mjs +1 -0
  59. package/dist/preview-engine/{chunk-AW7HNZKR.mjs → chunk-Y6HWYPKX.mjs} +1 -1
  60. package/dist/preview-engine/effects.mjs +1 -1
  61. package/dist/preview-engine/fonts.mjs +1 -1
  62. package/dist/preview-engine/framefields.mjs +27 -27
  63. package/dist/preview-engine/player.mjs +1 -1
  64. package/dist/preview-engine/renderers-5BV6JGTU.mjs +248 -0
  65. package/dist/preview-engine/renderers-7X2W6QWX.mjs +1 -0
  66. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +1 -0
  67. package/dist/preview-engine/renderers-G5KQISVL.mjs +1 -0
  68. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +1 -0
  69. package/dist/preview-engine/renderers-TVTQ2R74.mjs +1 -0
  70. package/dist/preview-engine/renderers-ZIMBODX6.mjs +1 -0
  71. package/dist/{program-xRfFoPxe.mjs → program-BmNKgzja.mjs} +281 -23
  72. package/dist/program-BmNKgzja.mjs.map +1 -0
  73. package/dist/renderer/index.d.mts +2 -2
  74. package/dist/renderer/index.mjs +2 -2
  75. package/dist/{renderer-D-4Yh-RK.mjs → renderer-1VuQTY1Z.mjs} +2 -2
  76. package/dist/{renderer-D-4Yh-RK.mjs.map → renderer-1VuQTY1Z.mjs.map} +1 -1
  77. package/dist/renderer-6oMSare3.mjs +3 -0
  78. package/dist/renderer-B1ComPb2.mjs +3 -0
  79. package/dist/{renderer-CgmFh6MY.mjs → renderer-B1YMwl2B.mjs} +1 -1
  80. package/dist/{renderer-BtRfKx5N.mjs → renderer-B2ieylQ3.mjs} +2 -2
  81. package/dist/{renderer-BtRfKx5N.mjs.map → renderer-B2ieylQ3.mjs.map} +1 -1
  82. package/dist/{renderer-DYm4duFr.mjs → renderer-B8-kzZdP.mjs} +2 -2
  83. package/dist/{renderer-DYm4duFr.mjs.map → renderer-B8-kzZdP.mjs.map} +1 -1
  84. package/dist/{renderer-Dju9CaeL.mjs → renderer-B8UaFNqb.mjs} +3 -3
  85. package/dist/{renderer-Dju9CaeL.mjs.map → renderer-B8UaFNqb.mjs.map} +1 -1
  86. package/dist/{renderer-BA8YwBRQ.mjs → renderer-BDbTWSpP.mjs} +3 -3
  87. package/dist/{renderer-BA8YwBRQ.mjs.map → renderer-BDbTWSpP.mjs.map} +1 -1
  88. package/dist/{renderer-DxtHmyAa.mjs → renderer-BIIWCg_J.mjs} +3 -3
  89. package/dist/{renderer-DxtHmyAa.mjs.map → renderer-BIIWCg_J.mjs.map} +1 -1
  90. package/dist/{renderer-CJNyhr_S.mjs → renderer-BJ1aTkZf.mjs} +3 -3
  91. package/dist/{renderer-CJNyhr_S.mjs.map → renderer-BJ1aTkZf.mjs.map} +1 -1
  92. package/dist/renderer-BQ5Bz5D0.mjs +3 -0
  93. package/dist/{renderer-DBlPbsgi.mjs → renderer-BSaYG8aw.mjs} +1 -1
  94. package/dist/{renderer-2NQWaZd7.d.mts → renderer-BTdOMMEx.d.mts} +2 -2
  95. package/dist/{renderer-2NQWaZd7.d.mts.map → renderer-BTdOMMEx.d.mts.map} +1 -1
  96. package/dist/renderer-BZcn_iBl.mjs +3 -0
  97. package/dist/{renderer-CroHPOsX.mjs → renderer-Bc04fivZ.mjs} +3 -3
  98. package/dist/{renderer-CroHPOsX.mjs.map → renderer-Bc04fivZ.mjs.map} +1 -1
  99. package/dist/{renderer-xKOVmd2O.mjs → renderer-BfAWZziM.mjs} +193 -12
  100. package/dist/renderer-BfAWZziM.mjs.map +1 -0
  101. package/dist/{renderer-DTvfYkI9.mjs → renderer-Bfgd4N0O.mjs} +3 -3
  102. package/dist/{renderer-DTvfYkI9.mjs.map → renderer-Bfgd4N0O.mjs.map} +1 -1
  103. package/dist/{renderer-b6sZN90h.mjs → renderer-BhZZEyFX.mjs} +2 -2
  104. package/dist/{renderer-b6sZN90h.mjs.map → renderer-BhZZEyFX.mjs.map} +1 -1
  105. package/dist/{renderer-wVldKtFU.mjs → renderer-Bhdf90Zq.mjs} +2 -2
  106. package/dist/{renderer-wVldKtFU.mjs.map → renderer-Bhdf90Zq.mjs.map} +1 -1
  107. package/dist/renderer-Bp6sDMa6.mjs +3 -0
  108. package/dist/renderer-Bt7_sb_Y.mjs +3 -0
  109. package/dist/{renderer-BiSALMQy.mjs → renderer-Bv21DbWy.mjs} +1 -1
  110. package/dist/{renderer-CoZKST2Y.mjs → renderer-Bv6q84TU.mjs} +2 -2
  111. package/dist/{renderer-CoZKST2Y.mjs.map → renderer-Bv6q84TU.mjs.map} +1 -1
  112. package/dist/renderer-C606ZPUn.mjs +3 -0
  113. package/dist/renderer-C9jyKn1i.mjs +3 -0
  114. package/dist/renderer-CERfcxgv.mjs +3 -0
  115. package/dist/renderer-CG5PzNkv.mjs +3 -0
  116. package/dist/{renderer-BGXbGqY4.mjs → renderer-CI7sG_cv.mjs} +2 -2
  117. package/dist/{renderer-BGXbGqY4.mjs.map → renderer-CI7sG_cv.mjs.map} +1 -1
  118. package/dist/renderer-CPoIMVdk.mjs +3 -0
  119. package/dist/{renderer-DCkSR2Ne.mjs → renderer-CWTpc4ff.mjs} +2 -2
  120. package/dist/{renderer-DCkSR2Ne.mjs.map → renderer-CWTpc4ff.mjs.map} +1 -1
  121. package/dist/{renderer-D7ztfQHX.mjs → renderer-CXn5HAnK.mjs} +3 -3
  122. package/dist/{renderer-D7ztfQHX.mjs.map → renderer-CXn5HAnK.mjs.map} +1 -1
  123. package/dist/{renderer-DjTiNeAp.mjs → renderer-C_TPMHiH.mjs} +2 -2
  124. package/dist/{renderer-DjTiNeAp.mjs.map → renderer-C_TPMHiH.mjs.map} +1 -1
  125. package/dist/renderer-Ca7L1EOp.mjs +3 -0
  126. package/dist/{renderer-DAMJZNtX.mjs → renderer-CaaOKMSd.mjs} +2 -2
  127. package/dist/{renderer-DAMJZNtX.mjs.map → renderer-CaaOKMSd.mjs.map} +1 -1
  128. package/dist/{renderer-CIYcdZuZ.mjs → renderer-CdciwwMI.mjs} +3 -3
  129. package/dist/{renderer-CIYcdZuZ.mjs.map → renderer-CdciwwMI.mjs.map} +1 -1
  130. package/dist/{renderer-BZmfKIom.mjs → renderer-CfC_aiew.mjs} +3 -3
  131. package/dist/{renderer-BZmfKIom.mjs.map → renderer-CfC_aiew.mjs.map} +1 -1
  132. package/dist/{renderer-8qpGxSSO.mjs → renderer-ChdLYS-G.mjs} +3 -3
  133. package/dist/{renderer-8qpGxSSO.mjs.map → renderer-ChdLYS-G.mjs.map} +1 -1
  134. package/dist/renderer-Cl6GkeHx.mjs +3 -0
  135. package/dist/renderer-ClcjrFyo.mjs +3 -0
  136. package/dist/{renderer-BgdkEFmv.mjs → renderer-CnXW28b9.mjs} +2 -2
  137. package/dist/{renderer-BgdkEFmv.mjs.map → renderer-CnXW28b9.mjs.map} +1 -1
  138. package/dist/{renderer-6GeDT4Mx.mjs → renderer-Ctk2zzfy.mjs} +3 -3
  139. package/dist/{renderer-6GeDT4Mx.mjs.map → renderer-Ctk2zzfy.mjs.map} +1 -1
  140. package/dist/{renderer-But0u-xi.mjs → renderer-CtyD_Xju.mjs} +2 -2
  141. package/dist/{renderer-But0u-xi.mjs.map → renderer-CtyD_Xju.mjs.map} +1 -1
  142. package/dist/renderer-CySUP_wk.mjs +3 -0
  143. package/dist/renderer-D2l_Odyg.mjs +3 -0
  144. package/dist/{renderer-BJ6Y-7ke.mjs → renderer-D2nCGcjv.mjs} +2 -2
  145. package/dist/{renderer-BJ6Y-7ke.mjs.map → renderer-D2nCGcjv.mjs.map} +1 -1
  146. package/dist/renderer-DCPCYySt.mjs +3 -0
  147. package/dist/{renderer-BnvqEqvE.mjs → renderer-DIgsilTw.mjs} +3 -3
  148. package/dist/{renderer-BnvqEqvE.mjs.map → renderer-DIgsilTw.mjs.map} +1 -1
  149. package/dist/renderer-DIkpJEOZ.mjs +3 -0
  150. package/dist/{renderer-BpCxKWQm.mjs → renderer-DML9qpmS.mjs} +2 -2
  151. package/dist/{renderer-BpCxKWQm.mjs.map → renderer-DML9qpmS.mjs.map} +1 -1
  152. package/dist/renderer-DNSXPkf_.mjs +3 -0
  153. package/dist/renderer-DP-CvZ_Z.mjs +3 -0
  154. package/dist/renderer-DeXb8R6h.mjs +3 -0
  155. package/dist/renderer-DezO-ZaP.mjs +4 -0
  156. package/dist/renderer-DhXe04fC.mjs +3 -0
  157. package/dist/{renderer-jkZ_IQnW.mjs → renderer-DirxsOjq.mjs} +2 -2
  158. package/dist/{renderer-jkZ_IQnW.mjs.map → renderer-DirxsOjq.mjs.map} +1 -1
  159. package/dist/{renderer-CfeoxM_3.mjs → renderer-Djlb4TLO.mjs} +3 -3
  160. package/dist/{renderer-CfeoxM_3.mjs.map → renderer-Djlb4TLO.mjs.map} +1 -1
  161. package/dist/renderer-DnH3SI7w.mjs +3 -0
  162. package/dist/{renderer-DdVBt8Rz.mjs → renderer-DpGc-N3G.mjs} +3 -3
  163. package/dist/{renderer-DdVBt8Rz.mjs.map → renderer-DpGc-N3G.mjs.map} +1 -1
  164. package/dist/renderer-Dpw4oi33.mjs +3 -0
  165. package/dist/{renderer-CcU7dVn9.mjs → renderer-DxTs4Iyi.mjs} +2 -2
  166. package/dist/{renderer-CcU7dVn9.mjs.map → renderer-DxTs4Iyi.mjs.map} +1 -1
  167. package/dist/{renderer-CNF10fCq.mjs → renderer-Dy0utCl7.mjs} +3 -3
  168. package/dist/{renderer-CNF10fCq.mjs.map → renderer-Dy0utCl7.mjs.map} +1 -1
  169. package/dist/renderer-Md-ytU0v.mjs +3 -0
  170. package/dist/{renderer-CStktK20.mjs → renderer-RKsXlF_0.mjs} +43 -43
  171. package/dist/{renderer-CStktK20.mjs.map → renderer-RKsXlF_0.mjs.map} +1 -1
  172. package/dist/renderer-U-bhWO9Q.mjs +3 -0
  173. package/dist/{renderer-5h0llpx7.mjs → renderer-WSGuj_V6.mjs} +2 -2
  174. package/dist/{renderer-5h0llpx7.mjs.map → renderer-WSGuj_V6.mjs.map} +1 -1
  175. package/dist/{renderer-_bygZSKk.mjs → renderer-bsWnRNpJ.mjs} +2 -2
  176. package/dist/{renderer-_bygZSKk.mjs.map → renderer-bsWnRNpJ.mjs.map} +1 -1
  177. package/dist/{renderer-DNNqpK7t.mjs → renderer-cgxO2xN6.mjs} +3 -3
  178. package/dist/{renderer-DNNqpK7t.mjs.map → renderer-cgxO2xN6.mjs.map} +1 -1
  179. package/dist/{renderer-DryPrxYc.mjs → renderer-dncoIVdd.mjs} +1 -1
  180. package/dist/{renderer-DffynBHa.mjs → renderer-kwmlLQOO.mjs} +3 -3
  181. package/dist/{renderer-DffynBHa.mjs.map → renderer-kwmlLQOO.mjs.map} +1 -1
  182. package/dist/{renderer-9wp5R7PL.mjs → renderer-vqkKWqa5.mjs} +2 -2
  183. package/dist/{renderer-9wp5R7PL.mjs.map → renderer-vqkKWqa5.mjs.map} +1 -1
  184. package/dist/renderer-zA5okHds.mjs +3 -0
  185. package/dist/{renderers-CP8CFWDs-BLgwUYX2.mjs → renderers-CP8CFWDs-DwQTx8S7.mjs} +3 -3
  186. package/dist/{renderers-CP8CFWDs-BLgwUYX2.mjs.map → renderers-CP8CFWDs-DwQTx8S7.mjs.map} +1 -1
  187. package/dist/signals/index.d.mts +5 -5
  188. package/dist/signals/index.mjs +6 -6
  189. package/dist/{signals-CsxqD2AA.mjs → signals-Bv1OweKd.mjs} +3 -3
  190. package/dist/{signals-CsxqD2AA.mjs.map → signals-Bv1OweKd.mjs.map} +1 -1
  191. package/package.json +55 -55
  192. package/dist/dist-B9Afsv83.mjs.map +0 -1
  193. package/dist/dist-B9PkqWnN.mjs.map +0 -1
  194. package/dist/fonts-DhEQ5h6E.mjs.map +0 -1
  195. package/dist/index-CQcdKyxF.d.mts.map +0 -1
  196. package/dist/index-D1zaOwEU.d.mts.map +0 -1
  197. package/dist/preview-engine/chunk-CNSHAFEA.mjs +0 -1
  198. package/dist/preview-engine/chunk-QTKJXDIW.mjs +0 -997
  199. package/dist/preview-engine/chunk-RNOO4UR5.mjs +0 -3
  200. package/dist/preview-engine/chunk-T6CC2KCZ.mjs +0 -418
  201. package/dist/preview-engine/chunk-UC7CSW2A.mjs +0 -1
  202. package/dist/preview-engine/renderers-32PIFHPS.mjs +0 -1
  203. package/dist/preview-engine/renderers-3Y3EMRDJ.mjs +0 -1
  204. package/dist/preview-engine/renderers-7HNVXNAI.mjs +0 -248
  205. package/dist/preview-engine/renderers-CHJWUJVI.mjs +0 -1
  206. package/dist/preview-engine/renderers-CI2GXWLP.mjs +0 -1
  207. package/dist/preview-engine/renderers-EE2GFG7J.mjs +0 -1
  208. package/dist/preview-engine/renderers-UGZUPONY.mjs +0 -1
  209. package/dist/program-xRfFoPxe.mjs.map +0 -1
  210. package/dist/renderer-B4F6wL68.mjs +0 -3
  211. package/dist/renderer-B4i1jmiT.mjs +0 -3
  212. package/dist/renderer-B5ylY3uM.mjs +0 -3
  213. package/dist/renderer-BPw23wiR.mjs +0 -3
  214. package/dist/renderer-BghW-bSZ.mjs +0 -3
  215. package/dist/renderer-Bw3oZ9YT.mjs +0 -3
  216. package/dist/renderer-C2009W-_.mjs +0 -3
  217. package/dist/renderer-C36yoGXG.mjs +0 -3
  218. package/dist/renderer-CL3evUmF.mjs +0 -3
  219. package/dist/renderer-CM1_2ZWA.mjs +0 -3
  220. package/dist/renderer-CWlzudP8.mjs +0 -3
  221. package/dist/renderer-Cd5vzrGs.mjs +0 -3
  222. package/dist/renderer-CeJ_vDXI.mjs +0 -3
  223. package/dist/renderer-CjY77sB_.mjs +0 -3
  224. package/dist/renderer-D5Z6mda5.mjs +0 -3
  225. package/dist/renderer-DCJa7OGk.mjs +0 -3
  226. package/dist/renderer-DGwSl7g1.mjs +0 -3
  227. package/dist/renderer-DNoRNfMm.mjs +0 -3
  228. package/dist/renderer-DOZ8bpyY.mjs +0 -3
  229. package/dist/renderer-DRHyRNU8.mjs +0 -3
  230. package/dist/renderer-DlD85Xoi.mjs +0 -3
  231. package/dist/renderer-Dr0bgOrW.mjs +0 -3
  232. package/dist/renderer-DurtG-Hc.mjs +0 -3
  233. package/dist/renderer-eFv9HBmL.mjs +0 -3
  234. package/dist/renderer-iuV6wQoL.mjs +0 -4
  235. package/dist/renderer-n-uuWPF4.mjs +0 -3
  236. package/dist/renderer-rzccTFuY.mjs +0 -3
  237. package/dist/renderer-xKOVmd2O.mjs.map +0 -1
  238. package/dist/renderer-y9eGFPFL.mjs +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DYm4duFr.mjs","names":[],"sources":["../../../nodes/node-film-grain/dist/renderers-yx-E93C7.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst FILM_GRAIN_SHADER = `\nstruct FilmUniforms {\n strength : f32,\n size : f32,\n monochrome : f32,\n animated : f32,\n\n frameIndex : f32, // discrete per-output-frame counter (speed-scaled), NOT continuous time\n shadows : f32,\n midtones : f32,\n highlights : f32,\n\n hasSignal : f32,\n _pad0 : f32,\n _pad1 : f32,\n _pad2 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : FilmUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var signalTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn hash2D(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn smoothNoise(p: vec2<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n\n // Quintic interpolation\n let w = pf * pf * pf * (pf * (pf * 6.0 - 15.0) + 10.0);\n\n let h00 = hash2D(pi + vec2<f32>(0.0, 0.0));\n let h10 = hash2D(pi + vec2<f32>(1.0, 0.0));\n let h01 = hash2D(pi + vec2<f32>(0.0, 1.0));\n let h11 = hash2D(pi + vec2<f32>(1.0, 1.0));\n\n let n0 = mix(h00, h10, w.x);\n let n1 = mix(h01, h11, w.x);\n\n return mix(n0, n1, w.y);\n}\n\n// Produces a pseudo-random, NON-directional offset that changes once per\n// output frame. This replaces the old time * constant translation, which\n// smoothly scrolled the noise lattice in a fixed direction (17.31, 43.19)\n// every frame -- that's why grain visibly drifted instead of flickering.\n//\n// The frame index is wrapped into a bounded range before hashing so the\n// pattern stays high quality over long renders (f32 precision degrades on\n// very large hash inputs); the wrap period is long enough that any repeat\n// is imperceptible in grain.\nfn frameJitter(frameIndex: f32) -> vec2<f32> {\n let raw = floor(frameIndex);\n let n = raw - floor(raw / 4096.0) * 4096.0;\n let hx = hash2D(vec2<f32>(n, n * 1.6180339887));\n let hy = hash2D(vec2<f32>(n * 3.14159265, n + 91.7));\n return vec2<f32>(hx, hy) * 1024.0;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n var color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n var strength = u.strength;\n if (u.hasSignal > 0.5) {\n let sigVal = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n strength = sigVal;\n }\n\n if (strength <= 0.0) {\n return color;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let grainCoord = (in.uv * dimensions) / u.size;\n\n let jitter = select(vec2<f32>(0.0), frameJitter(u.frameIndex), u.animated > 0.5);\n\n let luminance = dot(color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n // Luminance response curve logic\n let shadowFactor = exp(-luminance * luminance / 0.1);\n let highlightFactor = exp(-(1.0 - luminance) * (1.0 - luminance) / 0.1);\n let midtoneFactor = max(0.0, 1.0 - shadowFactor - highlightFactor);\n\n let response = (u.shadows * shadowFactor) + (u.midtones * midtoneFactor) + (u.highlights * highlightFactor);\n let finalGrainStrength = (strength / 100.0) * response * 0.15; // Normalized scale\n\n if (u.monochrome > 0.5) {\n let seed = grainCoord + jitter;\n let noiseVal = smoothNoise(seed);\n let grain = (noiseVal - 0.5) * finalGrainStrength;\n color.r += grain;\n color.g += grain;\n color.b += grain;\n } else {\n // Fixed per-channel spatial offsets (unrelated to time) keep the\n // R/G/B lattices decorrelated from each other; temporal variation\n // comes entirely from jitter now.\n let seedR = grainCoord + jitter;\n let seedG = grainCoord + jitter + vec2<f32>(173.3, 281.9);\n let seedB = grainCoord + jitter + vec2<f32>(391.7, 127.1);\n\n let noiseR = smoothNoise(seedR);\n let noiseG = smoothNoise(seedG);\n let noiseB = smoothNoise(seedB);\n\n color.r += (noiseR - 0.5) * finalGrainStrength;\n color.g += (noiseG - 0.5) * finalGrainStrength;\n color.b += (noiseB - 0.5) * finalGrainStrength;\n }\n\n return clamp(color, vec4<f32>(0.0), vec4<f32>(1.0));\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst filmGrainUniformData = new Float32Array(12);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tfilmUniformLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] }),\n\t\tsingleTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tsignalTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getFilmGrainResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `filmgrain_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst filmModule = device.createShaderModule({\n\t\t\tlabel: `filmgrain_${format}.wgsl`,\n\t\t\tcode: FILM_GRAIN_SHADER\n\t\t});\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: `FilmGrainPipeline_${format}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tlayouts.filmUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: filmModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: filmModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tfilmPipeline: pipeline,\n\t\tfilmUniformLayout: layouts.filmUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst FilmGrainWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = 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 !== \"FilmGrain\" || !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 dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst signalInput = op.strengthHandleId ? op.inputs?.[op.strengthHandleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && (signalInput.outputItem?.type === \"Signal\" || signalInput.outputItem?.type === \"Numeric\"));\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tconst resolveVal = (val, fallback) => {\n\t\tif (val === void 0 || val === null) return fallback;\n\t\tif (typeof val === \"object\" && val !== null) {\n\t\t\tif (\"get\" in val && typeof val.get === \"function\") val = val.get({\n\t\t\t\tframe: compositionFrame,\n\t\t\t\tfps\n\t\t\t});\n\t\t\telse if (\"value\" in val) val = val.value;\n\t\t} else if (typeof val === \"function\") val = val(compositionFrame, fps);\n\t\tconst n = Number(val);\n\t\treturn Number.isFinite(n) ? n : fallback;\n\t};\n\tlet strength = 0;\n\tlet hasStaticSignal = false;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") strength = Math.max(0, Number(signalInput.outputItem.data ?? 0));\n\telse strength = Math.max(0, resolveVal(op.strength, 15));\n\telse if (sd) {\n\t\tstrength = Math.max(0, Number(sd.offset ?? 0));\n\t\thasStaticSignal = true;\n\t}\n\tconst tmpTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpView = tmpTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia\n\t}, tmpView, tmpTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\targs.pass.end();\n\tconst { filmPipeline: pipeline, filmUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getFilmGrainResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tlet signalView;\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tif (hasStaticSignal && sd) signalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, sd.nodeId ?? \"filmgrain_strength_sig\", elapsedSeconds, durationSeconds, sd, width, height, props.renderId, frame, fps);\n\telse signalView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst size = Math.max(.5, resolveVal(op.size, 1.5)) * dpiScale;\n\tconst animated = op.animated ?? true;\n\tconst grainFrameIndex = frame * (resolveVal(op.speed, 50) / 50);\n\tfilmGrainUniformData[0] = strength;\n\tfilmGrainUniformData[1] = size;\n\tfilmGrainUniformData[2] = op.monochrome ?? true ? 1 : 0;\n\tfilmGrainUniformData[3] = animated ? 1 : 0;\n\tfilmGrainUniformData[4] = grainFrameIndex;\n\tfilmGrainUniformData[5] = resolveVal(op.shadows, .2);\n\tfilmGrainUniformData[6] = resolveVal(op.midtones, 1);\n\tfilmGrainUniformData[7] = resolveVal(op.highlights, .2);\n\tfilmGrainUniformData[8] = hasStaticSignal ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(filmGrainUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst filmPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\tfilmPass.setPipeline(pipeline);\n\tfilmPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tfilmPass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler));\n\tfilmPass.setBindGroup(2, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: signalView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t}));\n\tfilmPass.draw(4);\n\tfilmPass.end();\n\tconst finalPass = 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(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: resolveVal(op.opacity, 1) });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: FilmGrainWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-yx-E93C7.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-B8-kzZdP.mjs","names":[],"sources":["../../../nodes/node-film-grain/dist/renderers-yx-E93C7.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst FILM_GRAIN_SHADER = `\nstruct FilmUniforms {\n strength : f32,\n size : f32,\n monochrome : f32,\n animated : f32,\n\n frameIndex : f32, // discrete per-output-frame counter (speed-scaled), NOT continuous time\n shadows : f32,\n midtones : f32,\n highlights : f32,\n\n hasSignal : f32,\n _pad0 : f32,\n _pad1 : f32,\n _pad2 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : FilmUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var signalTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn hash2D(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn smoothNoise(p: vec2<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n\n // Quintic interpolation\n let w = pf * pf * pf * (pf * (pf * 6.0 - 15.0) + 10.0);\n\n let h00 = hash2D(pi + vec2<f32>(0.0, 0.0));\n let h10 = hash2D(pi + vec2<f32>(1.0, 0.0));\n let h01 = hash2D(pi + vec2<f32>(0.0, 1.0));\n let h11 = hash2D(pi + vec2<f32>(1.0, 1.0));\n\n let n0 = mix(h00, h10, w.x);\n let n1 = mix(h01, h11, w.x);\n\n return mix(n0, n1, w.y);\n}\n\n// Produces a pseudo-random, NON-directional offset that changes once per\n// output frame. This replaces the old time * constant translation, which\n// smoothly scrolled the noise lattice in a fixed direction (17.31, 43.19)\n// every frame -- that's why grain visibly drifted instead of flickering.\n//\n// The frame index is wrapped into a bounded range before hashing so the\n// pattern stays high quality over long renders (f32 precision degrades on\n// very large hash inputs); the wrap period is long enough that any repeat\n// is imperceptible in grain.\nfn frameJitter(frameIndex: f32) -> vec2<f32> {\n let raw = floor(frameIndex);\n let n = raw - floor(raw / 4096.0) * 4096.0;\n let hx = hash2D(vec2<f32>(n, n * 1.6180339887));\n let hy = hash2D(vec2<f32>(n * 3.14159265, n + 91.7));\n return vec2<f32>(hx, hy) * 1024.0;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n var color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n var strength = u.strength;\n if (u.hasSignal > 0.5) {\n let sigVal = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n strength = sigVal;\n }\n\n if (strength <= 0.0) {\n return color;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let grainCoord = (in.uv * dimensions) / u.size;\n\n let jitter = select(vec2<f32>(0.0), frameJitter(u.frameIndex), u.animated > 0.5);\n\n let luminance = dot(color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n // Luminance response curve logic\n let shadowFactor = exp(-luminance * luminance / 0.1);\n let highlightFactor = exp(-(1.0 - luminance) * (1.0 - luminance) / 0.1);\n let midtoneFactor = max(0.0, 1.0 - shadowFactor - highlightFactor);\n\n let response = (u.shadows * shadowFactor) + (u.midtones * midtoneFactor) + (u.highlights * highlightFactor);\n let finalGrainStrength = (strength / 100.0) * response * 0.15; // Normalized scale\n\n if (u.monochrome > 0.5) {\n let seed = grainCoord + jitter;\n let noiseVal = smoothNoise(seed);\n let grain = (noiseVal - 0.5) * finalGrainStrength;\n color.r += grain;\n color.g += grain;\n color.b += grain;\n } else {\n // Fixed per-channel spatial offsets (unrelated to time) keep the\n // R/G/B lattices decorrelated from each other; temporal variation\n // comes entirely from jitter now.\n let seedR = grainCoord + jitter;\n let seedG = grainCoord + jitter + vec2<f32>(173.3, 281.9);\n let seedB = grainCoord + jitter + vec2<f32>(391.7, 127.1);\n\n let noiseR = smoothNoise(seedR);\n let noiseG = smoothNoise(seedG);\n let noiseB = smoothNoise(seedB);\n\n color.r += (noiseR - 0.5) * finalGrainStrength;\n color.g += (noiseG - 0.5) * finalGrainStrength;\n color.b += (noiseB - 0.5) * finalGrainStrength;\n }\n\n return clamp(color, vec4<f32>(0.0), vec4<f32>(1.0));\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst filmGrainUniformData = new Float32Array(12);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tfilmUniformLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] }),\n\t\tsingleTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tsignalTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getFilmGrainResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `filmgrain_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst filmModule = device.createShaderModule({\n\t\t\tlabel: `filmgrain_${format}.wgsl`,\n\t\t\tcode: FILM_GRAIN_SHADER\n\t\t});\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: `FilmGrainPipeline_${format}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tlayouts.filmUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: filmModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: filmModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tfilmPipeline: pipeline,\n\t\tfilmUniformLayout: layouts.filmUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst FilmGrainWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = 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 !== \"FilmGrain\" || !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 dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst signalInput = op.strengthHandleId ? op.inputs?.[op.strengthHandleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && (signalInput.outputItem?.type === \"Signal\" || signalInput.outputItem?.type === \"Numeric\"));\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tconst resolveVal = (val, fallback) => {\n\t\tif (val === void 0 || val === null) return fallback;\n\t\tif (typeof val === \"object\" && val !== null) {\n\t\t\tif (\"get\" in val && typeof val.get === \"function\") val = val.get({\n\t\t\t\tframe: compositionFrame,\n\t\t\t\tfps\n\t\t\t});\n\t\t\telse if (\"value\" in val) val = val.value;\n\t\t} else if (typeof val === \"function\") val = val(compositionFrame, fps);\n\t\tconst n = Number(val);\n\t\treturn Number.isFinite(n) ? n : fallback;\n\t};\n\tlet strength = 0;\n\tlet hasStaticSignal = false;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") strength = Math.max(0, Number(signalInput.outputItem.data ?? 0));\n\telse strength = Math.max(0, resolveVal(op.strength, 15));\n\telse if (sd) {\n\t\tstrength = Math.max(0, Number(sd.offset ?? 0));\n\t\thasStaticSignal = true;\n\t}\n\tconst tmpTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpView = tmpTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia\n\t}, tmpView, tmpTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\targs.pass.end();\n\tconst { filmPipeline: pipeline, filmUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getFilmGrainResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tlet signalView;\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tif (hasStaticSignal && sd) signalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, sd.nodeId ?? \"filmgrain_strength_sig\", elapsedSeconds, durationSeconds, sd, width, height, props.renderId, frame, fps);\n\telse signalView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst size = Math.max(.5, resolveVal(op.size, 1.5)) * dpiScale;\n\tconst animated = op.animated ?? true;\n\tconst grainFrameIndex = frame * (resolveVal(op.speed, 50) / 50);\n\tfilmGrainUniformData[0] = strength;\n\tfilmGrainUniformData[1] = size;\n\tfilmGrainUniformData[2] = op.monochrome ?? true ? 1 : 0;\n\tfilmGrainUniformData[3] = animated ? 1 : 0;\n\tfilmGrainUniformData[4] = grainFrameIndex;\n\tfilmGrainUniformData[5] = resolveVal(op.shadows, .2);\n\tfilmGrainUniformData[6] = resolveVal(op.midtones, 1);\n\tfilmGrainUniformData[7] = resolveVal(op.highlights, .2);\n\tfilmGrainUniformData[8] = hasStaticSignal ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(filmGrainUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst filmPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\tfilmPass.setPipeline(pipeline);\n\tfilmPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tfilmPass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler));\n\tfilmPass.setBindGroup(2, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: signalView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t}));\n\tfilmPass.draw(4);\n\tfilmPass.end();\n\tconst finalPass = 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(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: resolveVal(op.opacity, 1) });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: FilmGrainWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-yx-E93C7.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
2
- import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DzUJmIHt.mjs";
3
- import { nt as signalRegistry } from "./dist-B9PkqWnN.mjs";
2
+ import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BYqNNwsl.mjs";
3
+ import { rt as signalRegistry } from "./dist-Cxi68OuY.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-patch-heal/dist/renderers-L2KSWX-w.mjs
@@ -708,4 +708,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer
708
708
 
709
709
  //#endregion
710
710
  export { renderers_default as n, PatchHealWebGPURenderer as t };
711
- //# sourceMappingURL=renderer-Dju9CaeL.mjs.map
711
+ //# sourceMappingURL=renderer-B8UaFNqb.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Dju9CaeL.mjs","names":[],"sources":["../../../nodes/node-patch-heal/dist/renderers-L2KSWX-w.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 500;\nconst MAX_FEATHER = 100;\nconst MAX_OFFSET = 4096;\nconst PatchItemSchema = z.object({\n\tid: z.string().default(\"patch\"),\n\tcenterX: z.number().min(0).max(1).default(.5),\n\tcenterY: z.number().min(0).max(1).default(.5),\n\toffsetX: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50),\n\toffsetY: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0),\n\tradius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tsourceRadius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tfeather: z.number().min(0).max(MAX_FEATHER).default(50),\n\topacity: z.number().min(0).max(1).default(1),\n\tmode: z.enum([\n\t\t\"Clone\",\n\t\t\"SeamlessHeal\",\n\t\t\"TextureTransfer\"\n\t]).default(\"SeamlessHeal\")\n});\nconst patchHealConfig = configBuilder().field(\"patches\", z.array(PatchItemSchema).optional(), {\n\tlabel: \"Patches\",\n\tdescription: \"List of patch healing operations applied sequentially.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"Horizontal normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"Vertical normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"offsetX\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset X Signal\",\n\tdescription: \"Horizontal pixel distance from destination to sample source patch.\"\n}).field(\"offsetY\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset Y Signal\",\n\tdescription: \"Vertical pixel distance from destination to sample source patch.\"\n}).field(\"radius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Target Radius Signal\",\n\tdescription: \"Radius of the destination circular patch in pixels (used when no explicit Mask input is connected).\"\n}).field(\"sourceRadius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Radius Signal\",\n\tdescription: \"Radius of the source sample circular patch in pixels.\"\n}).field(\"feather\", z.number().min(0).max(MAX_FEATHER).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Feather Signal\",\n\tdescription: \"Softness edge falloff percentage (0–100%).\"\n}).field(\"opacity\", z.number().min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Opacity Signal\",\n\tdescription: \"Blending opacity of the healed patch (0.0–1.0).\"\n}).field(\"mode\", z.enum([\n\t\"Clone\",\n\t\"SeamlessHeal\",\n\t\"TextureTransfer\"\n]).default(\"SeamlessHeal\"), {\n\tlabel: \"Healing Mode\",\n\tdescription: \"Healing algorithm: Clone (direct stamp), SeamlessHeal (Poisson color/lighting blend), TextureTransfer (luminance structure matching).\"\n}).build();\nconst PatchHealNodeConfigSchema = patchHealConfig.schema;\nfunction normalizePatches(config) {\n\tif (config?.patches && config.patches.length > 0) return config.patches.map((p, idx) => ({\n\t\tid: p.id || `patch-${idx + 1}`,\n\t\tcenterX: p.centerX ?? .5,\n\t\tcenterY: p.centerY ?? .5,\n\t\toffsetX: p.offsetX ?? 50,\n\t\toffsetY: p.offsetY ?? 0,\n\t\tradius: p.radius ?? 25,\n\t\tsourceRadius: p.sourceRadius ?? p.radius ?? 25,\n\t\tfeather: p.feather ?? 50,\n\t\topacity: p.opacity ?? 1,\n\t\tmode: p.mode ?? \"SeamlessHeal\"\n\t}));\n\tconst fallbackRadius = config?.radius ?? 25;\n\treturn [{\n\t\tid: \"patch-1\",\n\t\tcenterX: config?.centerX ?? .5,\n\t\tcenterY: config?.centerY ?? .5,\n\t\toffsetX: config?.offsetX ?? 50,\n\t\toffsetY: config?.offsetY ?? 0,\n\t\tradius: fallbackRadius,\n\t\tsourceRadius: config?.sourceRadius ?? fallbackRadius,\n\t\tfeather: config?.feather ?? 50,\n\t\topacity: config?.opacity ?? 1,\n\t\tmode: config?.mode ?? \"SeamlessHeal\"\n\t}];\n}\nconst PatchHealResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst PATCH_HEAL_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FULLSCREEN_VS = `\nstruct VertexOutput {\n @builtin(position) position : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0)\n );\n var uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n var output : VertexOutput;\n output.position = vec4<f32>(pos[vertexIndex], 0.0, 1.0);\n output.uv = uvs[vertexIndex];\n return output;\n}\n`;\nconst WGSL_PATCHHEAL_FS = `\n\nstruct PatchHealUniforms {\n offsetX : f32,\n offsetY : f32,\n centerX : f32,\n centerY : f32,\n\n radius : f32,\n sourceRadius : f32,\n feather : f32,\n opacity : f32,\n\n mode : f32,\n hasMask : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n hasRadiusSig : f32,\n hasSourceRadSig : f32,\n\n hasFeatherSig : f32,\n hasOpacitySig : f32,\n pad0 : f32,\n pad1 : f32,\n};\n\n\n@group(0) @binding(0) var<uniform> u : PatchHealUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var maskTex : texture_2d<f32>;\n@group(1) @binding(2) 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 centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var sourceRadSigTex : texture_2d<f32>;\n@group(2) @binding(6) var featherSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nfn getLuminance(c : vec3<f32>) -> f32 {\n return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn sampleBoxBlur(tex : texture_2d<f32>, smp : sampler, centerUv : vec2<f32>, blurPx : f32, dims : vec2<f32>) -> vec4<f32> {\n let texel = 1.0 / dims;\n let stepSize = max(1.0, blurPx / 3.0);\n var accum = vec4<f32>(0.0);\n var count = 0.0;\n\n for (var y = -2; y <= 2; y++) {\n for (var x = -2; x <= 2; x++) {\n let offset = vec2<f32>(f32(x) * stepSize, f32(y) * stepSize) * texel;\n let sampleUv = clamp(centerUv + offset, vec2<f32>(0.0), vec2<f32>(1.0));\n accum += textureSampleLevel(tex, smp, sampleUv, 0.0);\n count += 1.0;\n }\n }\n return accum / count;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {\n let dimensions = vec2<f32>(textureDimensions(srcTex));\n\n var offsetX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n offsetX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var offsetY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n offsetY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var sourceRadius = u.sourceRadius;\n if (u.hasSourceRadSig > 0.5) {\n sourceRadius = textureSampleLevel(sourceRadSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var feather = u.feather;\n if (u.hasFeatherSig > 0.5) {\n feather = textureSampleLevel(featherSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var opacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n opacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dstCol = textureSampleLevel(srcTex, samp, in.uv, 0.0);\n\n // Calculate mask weight (either from explicit mask or procedural circular patch)\n var maskWeight = 0.0;\n let targetCenterUV = vec2<f32>(centerX, centerY);\n\n if (u.hasMask > 0.5) {\n let maskCol = textureSampleLevel(maskTex, samp, in.uv, 0.0);\n maskWeight = max(maskCol.a, max(maskCol.r, max(maskCol.g, maskCol.b)));\n } else {\n let distPx = length((in.uv - targetCenterUV) * dimensions);\n let innerRadius = radius * max(0.0, 1.0 - feather / 100.0);\n maskWeight = 1.0 - smoothstep(innerRadius, max(innerRadius + 0.001, radius), distPx);\n }\n\n let blendWeight = clamp(maskWeight * opacity, 0.0, 1.0);\n if (blendWeight < 1e-4) {\n return dstCol;\n }\n\n // Compute source sample coordinate (scaling from sourceRadius to target radius if different)\n let sourceCenterUV = targetCenterUV + vec2<f32>(offsetX, offsetY) / dimensions;\n let srcScale = max(1.0, sourceRadius) / max(1.0, radius);\n let uvFromTargetCenter = in.uv - targetCenterUV;\n let srcUV = clamp(sourceCenterUV + uvFromTargetCenter * srcScale, vec2<f32>(0.0), vec2<f32>(1.0));\n let srcCol = textureSampleLevel(srcTex, samp, srcUV, 0.0);\n\n var healedCol = srcCol;\n\n if (u.mode > 0.5 && u.mode < 1.5) {\n // Mode 1: Seamless Heal (Poisson gradient / local illumination matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n let dstBlur = sampleBoxBlur(srcTex, samp, in.uv, blurRadius, dimensions);\n\n let srcDetail = srcCol.rgb - srcBlur.rgb;\n let healedRgb = dstBlur.rgb + srcDetail;\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(srcCol.a));\n healedCol = vec4<f32>(clampedRgb, srcCol.a);\n } else if (u.mode >= 1.5) {\n // Mode 2: Texture Transfer (Luminance structure matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n\n let lumaSrc = getLuminance(srcCol.rgb);\n let lumaSrcBlur = getLuminance(srcBlur.rgb);\n let lumaDelta = lumaSrc - lumaSrcBlur;\n\n let healedRgb = dstCol.rgb + vec3<f32>(lumaDelta);\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(dstCol.a));\n healedCol = vec4<f32>(clampedRgb, dstCol.a);\n }\n\n return mix(dstCol, healedCol, blendWeight);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tbuffer: { type: \"uniform\" }\n\t}] });\n\tconst textureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}\n\t] });\n\tconst signalTextureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 3,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 4,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 5,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 6,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 7,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 8,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}\n\t] });\n\tconst shaderModule = device.createShaderModule({ code: `${WGSL_FULLSCREEN_VS}\\n${WGSL_PATCHHEAL_FS}` });\n\tconst pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout\n\t] });\n\tres = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlayout: pipelineLayout,\n\t\t\tvertex: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"vs_main\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"fs_main\",\n\t\t\t\ttargets: [{\n\t\t\t\t\tformat,\n\t\t\t\t\tblend: {\n\t\t\t\t\t\tcolor: {\n\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\talpha: {\n\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\t\t\toperation: \"add\"\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\tprimitive: { topology: \"triangle-strip\" }\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst PatchHealWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"PatchHeal\" || !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 frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"patch_heal_node\";\n\tconst signalRegistry$1 = signalRegistry;\n\tconst tmpSrcTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpSrcView = tmpSrcTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpSrcView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-src`,\n\t\texcludeTextures: [...props.excludeTextures || [], tmpSrcTex]\n\t}, tmpSrcView, tmpSrcTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tlet maskTex = null;\n\tif (op.maskMedia) {\n\t\tmaskTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\t...props.excludeTextures || [],\n\t\t\ttargetTexture,\n\t\t\ttmpSrcTex\n\t\t]);\n\t\tconst maskView = maskTex.createView();\n\t\tctx.renderer.beginFrame(encoder, maskView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, width, height, \"clear\").end();\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(op.maskMedia, {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskMedia,\n\t\t\trenderId: `${props.renderId}-mask`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttmpSrcTex,\n\t\t\t\tmaskTex\n\t\t\t]\n\t\t}, maskView, maskTex, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t}\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getDeviceResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tconst patches = normalizePatches(op);\n\tconst resolveBindable = (configKey, fallbackVal, minVal, maxVal) => {\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 = fallbackVal;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst numVal = typeof input.outputItem.data === \"number\" ? input.outputItem.data : input.outputItem.data?.value ?? fallbackVal;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(numVal)));\n\t\t} else {\n\t\t\tlet rawVal = fallbackVal;\n\t\t\tif (rawVal !== void 0 && rawVal !== null) {\n\t\t\t\tif (typeof rawVal === \"object\") {\n\t\t\t\t\tif (\"get\" in rawVal && typeof rawVal.get === \"function\") rawVal = rawVal.get({\n\t\t\t\t\t\tframe: compositionFrame,\n\t\t\t\t\t\tfps\n\t\t\t\t\t});\n\t\t\t\t\telse if (\"value\" in rawVal) rawVal = rawVal.value;\n\t\t\t\t} else if (typeof rawVal === \"function\") rawVal = rawVal(compositionFrame, fps);\n\t\t\t}\n\t\t\tconst numVal = Number(rawVal ?? fallbackVal);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? fallbackVal : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, 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 dummyMaskView = maskTex ? maskTex.createView() : tmpSrcView;\n\tlet currentInputTex = tmpSrcTex;\n\tconst pingTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst pongTex = patches.length > 1 ? ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\tpingTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]) : pingTex;\n\tfor (let i = 0; i < patches.length; i++) {\n\t\tconst patch = patches[i];\n\t\tconst isFirstPatch = i === 0;\n\t\tconst centerXRes = isFirstPatch ? resolveBindable(\"centerX\", patch.centerX, 0, 1) : {\n\t\t\tval: patch.centerX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst centerYRes = isFirstPatch ? resolveBindable(\"centerY\", patch.centerY, 0, 1) : {\n\t\t\tval: patch.centerY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetXRes = isFirstPatch ? resolveBindable(\"offsetX\", patch.offsetX, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetYRes = isFirstPatch ? resolveBindable(\"offsetY\", patch.offsetY, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst radiusRes = isFirstPatch ? resolveBindable(\"radius\", patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst sourceRadiusRes = isFirstPatch ? resolveBindable(\"sourceRadius\", patch.sourceRadius ?? patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.sourceRadius ?? patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst featherRes = isFirstPatch ? resolveBindable(\"feather\", patch.feather, 0, MAX_FEATHER) : {\n\t\t\tval: patch.feather,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst opacityRes = isFirstPatch ? resolveBindable(\"opacity\", patch.opacity, 0, 1) : {\n\t\t\tval: patch.opacity,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst getSignalView = (res, suffix) => {\n\t\t\tif (res.hasStaticSig && res.sd && signalRegistry$1) return signalRegistry$1.getOrCreate2DTextureView(ctx.device, encoder, res.sd.nodeId ?? `${nodeId}_${suffix}`, elapsedSeconds, durationSeconds, res.sd, width, height, props.renderId, frame, fps);\n\t\t\treturn signalRegistry$1 ? signalRegistry$1.getDummy1x1TextureView(ctx.device) : tmpSrcView;\n\t\t};\n\t\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\t\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\t\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\t\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\t\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\t\tconst sourceRadiusView = getSignalView(sourceRadiusRes, \"sourceRadius_sig\");\n\t\tconst featherView = getSignalView(featherRes, \"feather_sig\");\n\t\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\t\tconst modeNum = patch.mode === \"Clone\" ? 0 : patch.mode === \"TextureTransfer\" ? 2 : 1;\n\t\tconst patchData = new Float32Array(20);\n\t\tpatchData[0] = offsetXRes.val;\n\t\tpatchData[1] = offsetYRes.val;\n\t\tpatchData[2] = centerXRes.val;\n\t\tpatchData[3] = centerYRes.val;\n\t\tpatchData[4] = radiusRes.val;\n\t\tpatchData[5] = sourceRadiusRes.val;\n\t\tpatchData[6] = featherRes.val;\n\t\tpatchData[7] = opacityRes.val;\n\t\tpatchData[8] = modeNum;\n\t\tpatchData[9] = maskTex ? 1 : 0;\n\t\tpatchData[10] = offsetXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[11] = offsetYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[12] = centerXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[13] = centerYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[14] = radiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[15] = sourceRadiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[16] = featherRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[17] = opacityRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[18] = 0;\n\t\tpatchData[19] = 0;\n\t\tconst uBuffer = ctx.renderer.getTemporaryBuffer(patchData);\n\t\tconst destinationTex = i % 2 === 0 ? pingTex : pongTex;\n\t\tconst texBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: tLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: currentInputTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyMaskView\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\tconst sigBindGroup = ctx.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: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sourceRadiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: featherView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst healPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\t\tview: destinationTex.createView(),\n\t\t\tloadOp: \"clear\",\n\t\t\tstoreOp: \"store\",\n\t\t\tclearValue: {\n\t\t\t\tr: 0,\n\t\t\t\tg: 0,\n\t\t\t\tb: 0,\n\t\t\t\ta: 0\n\t\t\t}\n\t\t}] });\n\t\thealPass.setPipeline(pipeline);\n\t\thealPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t}]\n\t\t}));\n\t\thealPass.setBindGroup(1, texBindGroup);\n\t\thealPass.setBindGroup(2, sigBindGroup);\n\t\thealPass.draw(4);\n\t\thealPass.end();\n\t\tcurrentInputTex = destinationTex;\n\t}\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"load\");\n\tctx.renderer.drawTexture(finalPass, currentInputTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t}, { opacity: 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, PatchHealResultSchema as c, patchHealConfig as d, MAX_OFFSET as i, PatchItemSchema as l, PatchHealWebGPURenderer as n, PATCH_HEAL_OUTPUT_TYPE_MAP as o, MAX_FEATHER as r, PatchHealNodeConfigSchema as s, renderers_default as t, normalizePatches as u };\n//# sourceMappingURL=renderers-L2KSWX-w.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-B8UaFNqb.mjs","names":[],"sources":["../../../nodes/node-patch-heal/dist/renderers-L2KSWX-w.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 500;\nconst MAX_FEATHER = 100;\nconst MAX_OFFSET = 4096;\nconst PatchItemSchema = z.object({\n\tid: z.string().default(\"patch\"),\n\tcenterX: z.number().min(0).max(1).default(.5),\n\tcenterY: z.number().min(0).max(1).default(.5),\n\toffsetX: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50),\n\toffsetY: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0),\n\tradius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tsourceRadius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tfeather: z.number().min(0).max(MAX_FEATHER).default(50),\n\topacity: z.number().min(0).max(1).default(1),\n\tmode: z.enum([\n\t\t\"Clone\",\n\t\t\"SeamlessHeal\",\n\t\t\"TextureTransfer\"\n\t]).default(\"SeamlessHeal\")\n});\nconst patchHealConfig = configBuilder().field(\"patches\", z.array(PatchItemSchema).optional(), {\n\tlabel: \"Patches\",\n\tdescription: \"List of patch healing operations applied sequentially.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"Horizontal normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"Vertical normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"offsetX\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset X Signal\",\n\tdescription: \"Horizontal pixel distance from destination to sample source patch.\"\n}).field(\"offsetY\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset Y Signal\",\n\tdescription: \"Vertical pixel distance from destination to sample source patch.\"\n}).field(\"radius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Target Radius Signal\",\n\tdescription: \"Radius of the destination circular patch in pixels (used when no explicit Mask input is connected).\"\n}).field(\"sourceRadius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Radius Signal\",\n\tdescription: \"Radius of the source sample circular patch in pixels.\"\n}).field(\"feather\", z.number().min(0).max(MAX_FEATHER).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Feather Signal\",\n\tdescription: \"Softness edge falloff percentage (0–100%).\"\n}).field(\"opacity\", z.number().min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Opacity Signal\",\n\tdescription: \"Blending opacity of the healed patch (0.0–1.0).\"\n}).field(\"mode\", z.enum([\n\t\"Clone\",\n\t\"SeamlessHeal\",\n\t\"TextureTransfer\"\n]).default(\"SeamlessHeal\"), {\n\tlabel: \"Healing Mode\",\n\tdescription: \"Healing algorithm: Clone (direct stamp), SeamlessHeal (Poisson color/lighting blend), TextureTransfer (luminance structure matching).\"\n}).build();\nconst PatchHealNodeConfigSchema = patchHealConfig.schema;\nfunction normalizePatches(config) {\n\tif (config?.patches && config.patches.length > 0) return config.patches.map((p, idx) => ({\n\t\tid: p.id || `patch-${idx + 1}`,\n\t\tcenterX: p.centerX ?? .5,\n\t\tcenterY: p.centerY ?? .5,\n\t\toffsetX: p.offsetX ?? 50,\n\t\toffsetY: p.offsetY ?? 0,\n\t\tradius: p.radius ?? 25,\n\t\tsourceRadius: p.sourceRadius ?? p.radius ?? 25,\n\t\tfeather: p.feather ?? 50,\n\t\topacity: p.opacity ?? 1,\n\t\tmode: p.mode ?? \"SeamlessHeal\"\n\t}));\n\tconst fallbackRadius = config?.radius ?? 25;\n\treturn [{\n\t\tid: \"patch-1\",\n\t\tcenterX: config?.centerX ?? .5,\n\t\tcenterY: config?.centerY ?? .5,\n\t\toffsetX: config?.offsetX ?? 50,\n\t\toffsetY: config?.offsetY ?? 0,\n\t\tradius: fallbackRadius,\n\t\tsourceRadius: config?.sourceRadius ?? fallbackRadius,\n\t\tfeather: config?.feather ?? 50,\n\t\topacity: config?.opacity ?? 1,\n\t\tmode: config?.mode ?? \"SeamlessHeal\"\n\t}];\n}\nconst PatchHealResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst PATCH_HEAL_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FULLSCREEN_VS = `\nstruct VertexOutput {\n @builtin(position) position : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0)\n );\n var uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n var output : VertexOutput;\n output.position = vec4<f32>(pos[vertexIndex], 0.0, 1.0);\n output.uv = uvs[vertexIndex];\n return output;\n}\n`;\nconst WGSL_PATCHHEAL_FS = `\n\nstruct PatchHealUniforms {\n offsetX : f32,\n offsetY : f32,\n centerX : f32,\n centerY : f32,\n\n radius : f32,\n sourceRadius : f32,\n feather : f32,\n opacity : f32,\n\n mode : f32,\n hasMask : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n hasRadiusSig : f32,\n hasSourceRadSig : f32,\n\n hasFeatherSig : f32,\n hasOpacitySig : f32,\n pad0 : f32,\n pad1 : f32,\n};\n\n\n@group(0) @binding(0) var<uniform> u : PatchHealUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var maskTex : texture_2d<f32>;\n@group(1) @binding(2) 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 centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var sourceRadSigTex : texture_2d<f32>;\n@group(2) @binding(6) var featherSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nfn getLuminance(c : vec3<f32>) -> f32 {\n return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn sampleBoxBlur(tex : texture_2d<f32>, smp : sampler, centerUv : vec2<f32>, blurPx : f32, dims : vec2<f32>) -> vec4<f32> {\n let texel = 1.0 / dims;\n let stepSize = max(1.0, blurPx / 3.0);\n var accum = vec4<f32>(0.0);\n var count = 0.0;\n\n for (var y = -2; y <= 2; y++) {\n for (var x = -2; x <= 2; x++) {\n let offset = vec2<f32>(f32(x) * stepSize, f32(y) * stepSize) * texel;\n let sampleUv = clamp(centerUv + offset, vec2<f32>(0.0), vec2<f32>(1.0));\n accum += textureSampleLevel(tex, smp, sampleUv, 0.0);\n count += 1.0;\n }\n }\n return accum / count;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {\n let dimensions = vec2<f32>(textureDimensions(srcTex));\n\n var offsetX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n offsetX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var offsetY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n offsetY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var sourceRadius = u.sourceRadius;\n if (u.hasSourceRadSig > 0.5) {\n sourceRadius = textureSampleLevel(sourceRadSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var feather = u.feather;\n if (u.hasFeatherSig > 0.5) {\n feather = textureSampleLevel(featherSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var opacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n opacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dstCol = textureSampleLevel(srcTex, samp, in.uv, 0.0);\n\n // Calculate mask weight (either from explicit mask or procedural circular patch)\n var maskWeight = 0.0;\n let targetCenterUV = vec2<f32>(centerX, centerY);\n\n if (u.hasMask > 0.5) {\n let maskCol = textureSampleLevel(maskTex, samp, in.uv, 0.0);\n maskWeight = max(maskCol.a, max(maskCol.r, max(maskCol.g, maskCol.b)));\n } else {\n let distPx = length((in.uv - targetCenterUV) * dimensions);\n let innerRadius = radius * max(0.0, 1.0 - feather / 100.0);\n maskWeight = 1.0 - smoothstep(innerRadius, max(innerRadius + 0.001, radius), distPx);\n }\n\n let blendWeight = clamp(maskWeight * opacity, 0.0, 1.0);\n if (blendWeight < 1e-4) {\n return dstCol;\n }\n\n // Compute source sample coordinate (scaling from sourceRadius to target radius if different)\n let sourceCenterUV = targetCenterUV + vec2<f32>(offsetX, offsetY) / dimensions;\n let srcScale = max(1.0, sourceRadius) / max(1.0, radius);\n let uvFromTargetCenter = in.uv - targetCenterUV;\n let srcUV = clamp(sourceCenterUV + uvFromTargetCenter * srcScale, vec2<f32>(0.0), vec2<f32>(1.0));\n let srcCol = textureSampleLevel(srcTex, samp, srcUV, 0.0);\n\n var healedCol = srcCol;\n\n if (u.mode > 0.5 && u.mode < 1.5) {\n // Mode 1: Seamless Heal (Poisson gradient / local illumination matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n let dstBlur = sampleBoxBlur(srcTex, samp, in.uv, blurRadius, dimensions);\n\n let srcDetail = srcCol.rgb - srcBlur.rgb;\n let healedRgb = dstBlur.rgb + srcDetail;\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(srcCol.a));\n healedCol = vec4<f32>(clampedRgb, srcCol.a);\n } else if (u.mode >= 1.5) {\n // Mode 2: Texture Transfer (Luminance structure matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n\n let lumaSrc = getLuminance(srcCol.rgb);\n let lumaSrcBlur = getLuminance(srcBlur.rgb);\n let lumaDelta = lumaSrc - lumaSrcBlur;\n\n let healedRgb = dstCol.rgb + vec3<f32>(lumaDelta);\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(dstCol.a));\n healedCol = vec4<f32>(clampedRgb, dstCol.a);\n }\n\n return mix(dstCol, healedCol, blendWeight);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tbuffer: { type: \"uniform\" }\n\t}] });\n\tconst textureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}\n\t] });\n\tconst signalTextureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 3,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 4,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 5,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 6,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 7,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 8,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}\n\t] });\n\tconst shaderModule = device.createShaderModule({ code: `${WGSL_FULLSCREEN_VS}\\n${WGSL_PATCHHEAL_FS}` });\n\tconst pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout\n\t] });\n\tres = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlayout: pipelineLayout,\n\t\t\tvertex: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"vs_main\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"fs_main\",\n\t\t\t\ttargets: [{\n\t\t\t\t\tformat,\n\t\t\t\t\tblend: {\n\t\t\t\t\t\tcolor: {\n\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\talpha: {\n\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\t\t\toperation: \"add\"\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\tprimitive: { topology: \"triangle-strip\" }\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst PatchHealWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"PatchHeal\" || !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 frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"patch_heal_node\";\n\tconst signalRegistry$1 = signalRegistry;\n\tconst tmpSrcTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpSrcView = tmpSrcTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpSrcView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-src`,\n\t\texcludeTextures: [...props.excludeTextures || [], tmpSrcTex]\n\t}, tmpSrcView, tmpSrcTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tlet maskTex = null;\n\tif (op.maskMedia) {\n\t\tmaskTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\t...props.excludeTextures || [],\n\t\t\ttargetTexture,\n\t\t\ttmpSrcTex\n\t\t]);\n\t\tconst maskView = maskTex.createView();\n\t\tctx.renderer.beginFrame(encoder, maskView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, width, height, \"clear\").end();\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(op.maskMedia, {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskMedia,\n\t\t\trenderId: `${props.renderId}-mask`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttmpSrcTex,\n\t\t\t\tmaskTex\n\t\t\t]\n\t\t}, maskView, maskTex, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t}\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getDeviceResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tconst patches = normalizePatches(op);\n\tconst resolveBindable = (configKey, fallbackVal, minVal, maxVal) => {\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 = fallbackVal;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst numVal = typeof input.outputItem.data === \"number\" ? input.outputItem.data : input.outputItem.data?.value ?? fallbackVal;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(numVal)));\n\t\t} else {\n\t\t\tlet rawVal = fallbackVal;\n\t\t\tif (rawVal !== void 0 && rawVal !== null) {\n\t\t\t\tif (typeof rawVal === \"object\") {\n\t\t\t\t\tif (\"get\" in rawVal && typeof rawVal.get === \"function\") rawVal = rawVal.get({\n\t\t\t\t\t\tframe: compositionFrame,\n\t\t\t\t\t\tfps\n\t\t\t\t\t});\n\t\t\t\t\telse if (\"value\" in rawVal) rawVal = rawVal.value;\n\t\t\t\t} else if (typeof rawVal === \"function\") rawVal = rawVal(compositionFrame, fps);\n\t\t\t}\n\t\t\tconst numVal = Number(rawVal ?? fallbackVal);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? fallbackVal : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, 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 dummyMaskView = maskTex ? maskTex.createView() : tmpSrcView;\n\tlet currentInputTex = tmpSrcTex;\n\tconst pingTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst pongTex = patches.length > 1 ? ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\tpingTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]) : pingTex;\n\tfor (let i = 0; i < patches.length; i++) {\n\t\tconst patch = patches[i];\n\t\tconst isFirstPatch = i === 0;\n\t\tconst centerXRes = isFirstPatch ? resolveBindable(\"centerX\", patch.centerX, 0, 1) : {\n\t\t\tval: patch.centerX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst centerYRes = isFirstPatch ? resolveBindable(\"centerY\", patch.centerY, 0, 1) : {\n\t\t\tval: patch.centerY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetXRes = isFirstPatch ? resolveBindable(\"offsetX\", patch.offsetX, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetYRes = isFirstPatch ? resolveBindable(\"offsetY\", patch.offsetY, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst radiusRes = isFirstPatch ? resolveBindable(\"radius\", patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst sourceRadiusRes = isFirstPatch ? resolveBindable(\"sourceRadius\", patch.sourceRadius ?? patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.sourceRadius ?? patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst featherRes = isFirstPatch ? resolveBindable(\"feather\", patch.feather, 0, MAX_FEATHER) : {\n\t\t\tval: patch.feather,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst opacityRes = isFirstPatch ? resolveBindable(\"opacity\", patch.opacity, 0, 1) : {\n\t\t\tval: patch.opacity,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst getSignalView = (res, suffix) => {\n\t\t\tif (res.hasStaticSig && res.sd && signalRegistry$1) return signalRegistry$1.getOrCreate2DTextureView(ctx.device, encoder, res.sd.nodeId ?? `${nodeId}_${suffix}`, elapsedSeconds, durationSeconds, res.sd, width, height, props.renderId, frame, fps);\n\t\t\treturn signalRegistry$1 ? signalRegistry$1.getDummy1x1TextureView(ctx.device) : tmpSrcView;\n\t\t};\n\t\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\t\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\t\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\t\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\t\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\t\tconst sourceRadiusView = getSignalView(sourceRadiusRes, \"sourceRadius_sig\");\n\t\tconst featherView = getSignalView(featherRes, \"feather_sig\");\n\t\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\t\tconst modeNum = patch.mode === \"Clone\" ? 0 : patch.mode === \"TextureTransfer\" ? 2 : 1;\n\t\tconst patchData = new Float32Array(20);\n\t\tpatchData[0] = offsetXRes.val;\n\t\tpatchData[1] = offsetYRes.val;\n\t\tpatchData[2] = centerXRes.val;\n\t\tpatchData[3] = centerYRes.val;\n\t\tpatchData[4] = radiusRes.val;\n\t\tpatchData[5] = sourceRadiusRes.val;\n\t\tpatchData[6] = featherRes.val;\n\t\tpatchData[7] = opacityRes.val;\n\t\tpatchData[8] = modeNum;\n\t\tpatchData[9] = maskTex ? 1 : 0;\n\t\tpatchData[10] = offsetXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[11] = offsetYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[12] = centerXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[13] = centerYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[14] = radiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[15] = sourceRadiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[16] = featherRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[17] = opacityRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[18] = 0;\n\t\tpatchData[19] = 0;\n\t\tconst uBuffer = ctx.renderer.getTemporaryBuffer(patchData);\n\t\tconst destinationTex = i % 2 === 0 ? pingTex : pongTex;\n\t\tconst texBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: tLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: currentInputTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyMaskView\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\tconst sigBindGroup = ctx.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: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sourceRadiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: featherView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst healPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\t\tview: destinationTex.createView(),\n\t\t\tloadOp: \"clear\",\n\t\t\tstoreOp: \"store\",\n\t\t\tclearValue: {\n\t\t\t\tr: 0,\n\t\t\t\tg: 0,\n\t\t\t\tb: 0,\n\t\t\t\ta: 0\n\t\t\t}\n\t\t}] });\n\t\thealPass.setPipeline(pipeline);\n\t\thealPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t}]\n\t\t}));\n\t\thealPass.setBindGroup(1, texBindGroup);\n\t\thealPass.setBindGroup(2, sigBindGroup);\n\t\thealPass.draw(4);\n\t\thealPass.end();\n\t\tcurrentInputTex = destinationTex;\n\t}\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"load\");\n\tctx.renderer.drawTexture(finalPass, currentInputTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t}, { opacity: 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, PatchHealResultSchema as c, patchHealConfig as d, MAX_OFFSET as i, PatchItemSchema as l, PatchHealWebGPURenderer as n, PATCH_HEAL_OUTPUT_TYPE_MAP as o, MAX_FEATHER as r, PatchHealNodeConfigSchema as s, renderers_default as t, normalizePatches as u };\n//# sourceMappingURL=renderers-L2KSWX-w.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DzUJmIHt.mjs";
2
- import { nt as signalRegistry } from "./dist-B9PkqWnN.mjs";
1
+ import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BYqNNwsl.mjs";
2
+ import { rt as signalRegistry } from "./dist-Cxi68OuY.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region ../../nodes/node-shadows-highlights/dist/renderers-Bhlcw5SC.mjs
@@ -674,4 +674,4 @@ var renderers_default = { WebGPURenderer };
674
674
 
675
675
  //#endregion
676
676
  export { renderers_default as n, WebGPURenderer as t };
677
- //# sourceMappingURL=renderer-BA8YwBRQ.mjs.map
677
+ //# sourceMappingURL=renderer-BDbTWSpP.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BA8YwBRQ.mjs","names":[],"sources":["../../../nodes/node-shadows-highlights/dist/renderers-Bhlcw5SC.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst MIN_RADIUS = 1;\nconst MAX_AMOUNT = 100;\nconst shadowsHighlightsConfig = configBuilder().field(\"shadowAmount\", z.number().min(0).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Shadow Boost (%)\",\n\tdescription: \"Percentage to lift and recover crushed shadow details (0–100%).\"\n}).field(\"shadowTonalWidth\", z.number().min(0).max(100).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Shadow Range (%)\",\n\tdescription: \"Range of dark tones affected by shadow adjustments (0–100%).\"\n}).field(\"shadowRadius\", z.number().min(1).max(250).default(30), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Shadow Radius (px)\",\n\tdescription: \"Local neighborhood radius in pixels to determine shadow illumination (1–250px).\"\n}).field(\"highlightAmount\", z.number().min(0).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Highlight Suppression (%)\",\n\tdescription: \"Percentage to suppress and recover blown highlight details (0–100%).\"\n}).field(\"highlightTonalWidth\", z.number().min(0).max(100).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Highlight Range (%)\",\n\tdescription: \"Range of bright tones affected by highlight adjustments (0–100%).\"\n}).field(\"highlightRadius\", z.number().min(1).max(250).default(30), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Highlight Radius (px)\",\n\tdescription: \"Local neighborhood radius in pixels to determine highlight exposure (1–250px).\"\n}).field(\"colorCorrection\", z.number().min(-100).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Color Correction (%)\",\n\tdescription: \"Fine-tunes color saturation in recovered shadow/highlight zones (-100 to +100%).\"\n}).field(\"midtoneContrast\", z.number().min(-100).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Midtone Contrast (%)\",\n\tdescription: \"Adjusts contrast centered on the midtones (-100 to +100%).\"\n}).build();\nconst ShadowsHighlightsNodeConfigSchema = shadowsHighlightsConfig.schema;\nconst ShadowsHighlightsResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ShadowsHighlightsOperationSchema = ShadowsHighlightsNodeConfigSchema.extend({\n\top: z.literal(\"ShadowsHighlights\"),\n\tmetadata: z.unknown().optional()\n});\nconst defaultShadowsHighlightsConfig = ShadowsHighlightsNodeConfigSchema.parse({});\nconst SHADOWS_HIGHLIGHTS_PRESETS = [\n\t{\n\t\tid: \"default\",\n\t\tname: \"Default (Neutral)\",\n\t\tdescription: \"Zero adjustments across dynamic range\",\n\t\tconfig: {\n\t\t\tshadowAmount: 0,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 30,\n\t\t\thighlightAmount: 0,\n\t\t\thighlightTonalWidth: 50,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 0,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t},\n\t{\n\t\tid: \"shadow-lift\",\n\t\tname: \"Shadow Detail Lift\",\n\t\tdescription: \"Gently opens up underexposed shadows without bleaching midtones\",\n\t\tconfig: {\n\t\t\tshadowAmount: 40,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 35,\n\t\t\thighlightAmount: 0,\n\t\t\thighlightTonalWidth: 50,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 10,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t},\n\t{\n\t\tid: \"highlight-recovery\",\n\t\tname: \"Highlight Recovery\",\n\t\tdescription: \"Pulls back blown sky, cloud, and specular highlight clipping\",\n\t\tconfig: {\n\t\t\tshadowAmount: 0,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 30,\n\t\t\thighlightAmount: 45,\n\t\t\thighlightTonalWidth: 40,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: -5,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t},\n\t{\n\t\tid: \"hdr-balance\",\n\t\tname: \"HDR Dynamic Range\",\n\t\tdescription: \"Balanced recovery expanding visible dynamic range in high contrast scenes\",\n\t\tconfig: {\n\t\t\tshadowAmount: 35,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 40,\n\t\t\thighlightAmount: 35,\n\t\t\thighlightTonalWidth: 50,\n\t\t\thighlightRadius: 40,\n\t\t\tcolorCorrection: 15,\n\t\t\tmidtoneContrast: 10\n\t\t}\n\t},\n\t{\n\t\tid: \"backlight-correction\",\n\t\tname: \"Backlight Correction\",\n\t\tdescription: \"Compensates for harsh backlighting illuminating silhouetted subjects\",\n\t\tconfig: {\n\t\t\tshadowAmount: 60,\n\t\t\tshadowTonalWidth: 60,\n\t\t\tshadowRadius: 50,\n\t\t\thighlightAmount: 20,\n\t\t\thighlightTonalWidth: 35,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 20,\n\t\t\tmidtoneContrast: 5\n\t\t}\n\t},\n\t{\n\t\tid: \"dramatic-punch\",\n\t\tname: \"Dramatic Contrast & Clarity\",\n\t\tdescription: \"Deepens shadows, compresses highlights, and boosts midtone punch\",\n\t\tconfig: {\n\t\t\tshadowAmount: 10,\n\t\t\tshadowTonalWidth: 30,\n\t\t\tshadowRadius: 25,\n\t\t\thighlightAmount: 30,\n\t\t\thighlightTonalWidth: 55,\n\t\t\thighlightRadius: 25,\n\t\t\tcolorCorrection: 5,\n\t\t\tmidtoneContrast: 25\n\t\t}\n\t},\n\t{\n\t\tid: \"gentle-fill\",\n\t\tname: \"Gentle Fill Light\",\n\t\tdescription: \"Subtle lift to low-light areas preserving photographic atmosphere\",\n\t\tconfig: {\n\t\t\tshadowAmount: 20,\n\t\t\tshadowTonalWidth: 40,\n\t\t\tshadowRadius: 30,\n\t\t\thighlightAmount: 15,\n\t\t\thighlightTonalWidth: 40,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 5,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t}\n];\nconst SHADOWS_HIGHLIGHTS_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_SHADOWS_HIGHLIGHTS_UNIFORMS = `\nstruct ShadowsHighlightsUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tshadowRadius : f32,\n\thighlightRadius : f32,\n\n\tshadowAmount : f32,\n\tshadowTonalWidth : f32,\n\thighlightAmount : f32,\n\thighlightTonalWidth : f32,\n\n\tcolorCorrection : f32,\n\tmidtoneContrast : f32,\n\tisSecondPass : f32,\n\t_pad0 : f32,\n\n\thasShadowAmountSig : f32,\n\thasShadowTonalWidthSig : f32,\n\thasShadowRadiusSig : f32,\n\thasHighlightAmountSig : f32,\n\n\thasHighlightTonalWidthSig : f32,\n\thasHighlightRadiusSig : f32,\n\thasColorCorrectionSig : f32,\n\thasMidtoneContrastSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ShadowsHighlightsUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var shadowAmountSigTex : texture_2d<f32>;\n@group(2) @binding(1) var shadowTonalWidthSigTex : texture_2d<f32>;\n@group(2) @binding(2) var shadowRadiusSigTex : texture_2d<f32>;\n@group(2) @binding(3) var highlightAmountSigTex : texture_2d<f32>;\n@group(2) @binding(4) var highlightTonalWidthSigTex : texture_2d<f32>;\n@group(2) @binding(5) var highlightRadiusSigTex : texture_2d<f32>;\n@group(2) @binding(6) var colorCorrectionSigTex : texture_2d<f32>;\n@group(2) @binding(7) var midtoneContrastSigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn get_luminance(c: vec3<f32>) -> f32 {\n\treturn dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet origCol = textureSampleLevel(origTex, samp, in.uv, 0.0);\n\n\tvar sAmount = u.shadowAmount;\n\tif (u.hasShadowAmountSig > 0.5) {\n\t\tsAmount = textureSampleLevel(shadowAmountSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tsAmount = clamp(sAmount, 0.0, 100.0);\n\n\tvar sTonalWidthVal = u.shadowTonalWidth;\n\tif (u.hasShadowTonalWidthSig > 0.5) {\n\t\tsTonalWidthVal = textureSampleLevel(shadowTonalWidthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tsTonalWidthVal = clamp(sTonalWidthVal, 0.0, 100.0);\n\n\tvar sRadius = u.shadowRadius;\n\tif (u.hasShadowRadiusSig > 0.5) {\n\t\tsRadius = textureSampleLevel(shadowRadiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tsRadius = clamp(sRadius, 1.0, 250.0);\n\n\tvar hAmount = u.highlightAmount;\n\tif (u.hasHighlightAmountSig > 0.5) {\n\t\thAmount = textureSampleLevel(highlightAmountSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\thAmount = clamp(hAmount, 0.0, 100.0);\n\n\tvar hTonalWidthVal = u.highlightTonalWidth;\n\tif (u.hasHighlightTonalWidthSig > 0.5) {\n\t\thTonalWidthVal = textureSampleLevel(highlightTonalWidthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\thTonalWidthVal = clamp(hTonalWidthVal, 0.0, 100.0);\n\n\tvar hRadius = u.highlightRadius;\n\tif (u.hasHighlightRadiusSig > 0.5) {\n\t\thRadius = textureSampleLevel(highlightRadiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\thRadius = clamp(hRadius, 1.0, 250.0);\n\n\tvar colCorrVal = u.colorCorrection;\n\tif (u.hasColorCorrectionSig > 0.5) {\n\t\tcolCorrVal = textureSampleLevel(colorCorrectionSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolCorrVal = clamp(colCorrVal, -100.0, 100.0);\n\n\tvar midContrastVal = u.midtoneContrast;\n\tif (u.hasMidtoneContrastSig > 0.5) {\n\t\tmidContrastVal = textureSampleLevel(midtoneContrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tmidContrastVal = clamp(midContrastVal, -100.0, 100.0);\n\n\tif (sAmount <= 0.0 && hAmount <= 0.0 && abs(midContrastVal) <= 0.0) {\n\t\tif (u.isSecondPass > 0.5) {\n\t\t\treturn origCol;\n\t\t}\n\t\treturn origCol;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tlet lumaOrig = get_luminance(origCol.rgb / max(origCol.a, 1e-5));\n\n\t// Shadow blur parameters\n\tlet sSpatialSigma = sRadius;\n\tlet stepScaleS = max(1.0, sSpatialSigma / 20.0);\n\tlet effectiveSigmaS = sSpatialSigma / stepScaleS;\n\tlet sampleRadiusS = min(i32(ceil(3.0 * effectiveSigmaS)), 64);\n\n\t// Highlight blur parameters\n\tlet hSpatialSigma = hRadius;\n\tlet stepScaleH = max(1.0, hSpatialSigma / 20.0);\n\tlet effectiveSigmaH = hSpatialSigma / stepScaleH;\n\tlet sampleRadiusH = min(i32(ceil(3.0 * effectiveSigmaH)), 64);\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// PASS 1: Horizontal blur of luminance from origTex\n\t\t// Output packed channels: R = sLumaPass1, G = hLumaPass1, B = sAlphaPass1, A = hAlphaPass1\n\t\tvar sSum = 0.0;\n\t\tvar sWeightSum = 0.0;\n\t\tvar sAlphaSum = 0.0;\n\t\tvar sKernelSum = 0.0;\n\n\t\tfor (var i = -sampleRadiusS; i <= sampleRadiusS; i++) {\n\t\t\tlet offset = vec2<f32>(f32(i) * stepScaleS) * direction * texelSize;\n\t\t\tlet x = f32(i) * stepScaleS;\n\t\t\tlet weight = exp(-0.5 * (x / sSpatialSigma) * (x / sSpatialSigma));\n\t\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\tlet sampleAlpha = sampleCol.a;\n\t\t\tlet sampleLuma = get_luminance(sampleCol.rgb / max(sampleAlpha, 1e-5));\n\t\t\tsSum += sampleLuma * weight * sampleAlpha;\n\t\t\tsWeightSum += weight * sampleAlpha;\n\t\t\tsAlphaSum += sampleAlpha * weight;\n\t\t\tsKernelSum += weight;\n\t\t}\n\n\t\tvar hSum = 0.0;\n\t\tvar hWeightSum = 0.0;\n\t\tvar hAlphaSum = 0.0;\n\t\tvar hKernelSum = 0.0;\n\n\t\tfor (var i = -sampleRadiusH; i <= sampleRadiusH; i++) {\n\t\t\tlet offset = vec2<f32>(f32(i) * stepScaleH) * direction * texelSize;\n\t\t\tlet x = f32(i) * stepScaleH;\n\t\t\tlet weight = exp(-0.5 * (x / hSpatialSigma) * (x / hSpatialSigma));\n\t\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\tlet sampleAlpha = sampleCol.a;\n\t\t\tlet sampleLuma = get_luminance(sampleCol.rgb / max(sampleAlpha, 1e-5));\n\t\t\thSum += sampleLuma * weight * sampleAlpha;\n\t\t\thWeightSum += weight * sampleAlpha;\n\t\t\thAlphaSum += sampleAlpha * weight;\n\t\t\thKernelSum += weight;\n\t\t}\n\n\t\tlet sLumaPass1 = select(lumaOrig, sSum / sWeightSum, sWeightSum > 1e-5);\n\t\tlet sAlphaPass1 = sAlphaSum / max(sKernelSum, 1e-5);\n\t\tlet hLumaPass1 = select(lumaOrig, hSum / hWeightSum, hWeightSum > 1e-5);\n\t\tlet hAlphaPass1 = hAlphaSum / max(hKernelSum, 1e-5);\n\n\t\treturn vec4<f32>(sLumaPass1, hLumaPass1, sAlphaPass1, hAlphaPass1);\n\t}\n\n\t// PASS 2: Vertical blur of Pass 1 + Dynamic Range Recovery\n\tif (origCol.a < 1e-5) {\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t}\n\n\tvar sSum = 0.0;\n\tvar sWeightSum = 0.0;\n\n\tfor (var i = -sampleRadiusS; i <= sampleRadiusS; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScaleS) * direction * texelSize;\n\t\tlet x = f32(i) * stepScaleS;\n\t\tlet weight = exp(-0.5 * (x / sSpatialSigma) * (x / sSpatialSigma));\n\t\tlet samplePass1 = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tlet sampleAlpha = samplePass1.b;\n\t\tlet sampleLuma = samplePass1.r;\n\t\tsSum += sampleLuma * weight * sampleAlpha;\n\t\tsWeightSum += weight * sampleAlpha;\n\t}\n\n\tvar hSum = 0.0;\n\tvar hWeightSum = 0.0;\n\n\tfor (var i = -sampleRadiusH; i <= sampleRadiusH; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScaleH) * direction * texelSize;\n\t\tlet x = f32(i) * stepScaleH;\n\t\tlet weight = exp(-0.5 * (x / hSpatialSigma) * (x / hSpatialSigma));\n\t\tlet samplePass1 = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tlet sampleAlpha = samplePass1.a;\n\t\tlet sampleLuma = samplePass1.g;\n\t\thSum += sampleLuma * weight * sampleAlpha;\n\t\thWeightSum += weight * sampleAlpha;\n\t}\n\n\tlet sLumaBlur = select(lumaOrig, sSum / sWeightSum, sWeightSum > 1e-5);\n\tlet hLumaBlur = select(lumaOrig, hSum / hWeightSum, hWeightSum > 1e-5);\n\n\tlet alpha = origCol.a;\n\tlet rgb = origCol.rgb / alpha;\n\n\tlet sAmountNorm = sAmount / 100.0;\n\tlet hAmountNorm = hAmount / 100.0;\n\tlet sTonalWidth = clamp(sTonalWidthVal / 100.0, 0.01, 1.0);\n\tlet hTonalWidth = clamp(hTonalWidthVal / 100.0, 0.01, 1.0);\n\tlet colCorrNorm = colCorrVal / 100.0;\n\tlet midContrastNorm = midContrastVal / 100.0;\n\n\tlet sEvalLuma = 0.65 * sLumaBlur + 0.35 * lumaOrig;\n\tlet hEvalLuma = 0.65 * hLumaBlur + 0.35 * lumaOrig;\n\n\tlet wShadow = 1.0 - smoothstep(0.0, sTonalWidth, sEvalLuma);\n\tlet wHighlight = smoothstep(1.0 - hTonalWidth, 1.0, hEvalLuma);\n\n\tlet shadowBoost = sAmountNorm * wShadow * (1.0 - lumaOrig) * (1.0 - sqrt(clamp(sLumaBlur, 0.0, 1.0)));\n\tlet highlightSuppression = hAmountNorm * wHighlight * lumaOrig * sqrt(clamp(hLumaBlur, 0.0, 1.0));\n\n\tvar targetLuma = clamp(lumaOrig + shadowBoost - highlightSuppression, 0.0, 1.0);\n\n\tif (abs(midContrastNorm) > 0.001) {\n\t\tlet midDiff = targetLuma - 0.5;\n\t\tlet sCurve = midDiff * (1.0 - 4.0 * midDiff * midDiff);\n\t\ttargetLuma = clamp(targetLuma + midContrastNorm * sCurve * 0.4, 0.0, 1.0);\n\t}\n\n\tvar adjustedRgb = rgb * ((targetLuma + 1e-4) / (lumaOrig + 1e-4));\n\n\tlet effectIntensity = sAmountNorm * wShadow + hAmountNorm * wHighlight;\n\tlet satFactor = clamp(1.0 + colCorrNorm * effectIntensity * 1.5, 0.0, 3.0);\n\tadjustedRgb = mix(vec3<f32>(targetLuma), adjustedRgb, satFactor);\n\n\tlet finalRgb = clamp(adjustedRgb, vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst shadowsHighlightsUniformData = new Float32Array(20);\nfunction getShadowsHighlightsResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tbuffer: { type: \"uniform\" }\n\t}] });\n\tconst textureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}\n\t] });\n\tconst signalTextureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 3,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 4,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 5,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 6,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 7,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 8,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}\n\t] });\n\tconst shaderModule = device.createShaderModule({ code: WGSL_SHADOWS_HIGHLIGHTS_UNIFORMS });\n\tconst pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout\n\t] });\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlayout: pipelineLayout,\n\t\t\tvertex: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: targetFormat }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ShadowsHighlights\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = (props.virtualMedia?.metadata)?.id || (op.inputs ? Object.keys(op.inputs)[0] : null) || props.renderId || \"shadowshighlights_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => {\n\t\tif (handleId && op.inputs?.[handleId]?.connectionValid) {\n\t\t\tconst outputItem = op.inputs[handleId].outputItem;\n\t\t\tif (outputItem?.type === \"Number\") {\n\t\t\t\tconst numVal = typeof outputItem.data === \"number\" ? outputItem.data : outputItem.data?.value ?? fallbackVal;\n\t\t\t\treturn {\n\t\t\t\t\tval: Math.max(clampMin, Math.min(clampMax, numVal)),\n\t\t\t\t\thasStaticSig: false,\n\t\t\t\t\tsd: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (outputItem?.type === \"Signal\" && outputItem.data) return {\n\t\t\t\tval: fallbackVal,\n\t\t\t\thasStaticSig: true,\n\t\t\t\tsd: outputItem.data\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tval: Math.max(clampMin, Math.min(clampMax, fallbackVal)),\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t};\n\tconst shadowAmountRes = resolveField(op.shadowAmountHandleId, Number(op.shadowAmount ?? 0), 0, MAX_AMOUNT);\n\tconst shadowTonalWidthRes = resolveField(op.shadowTonalWidthHandleId, Number(op.shadowTonalWidth ?? 50), 0, 100);\n\tconst shadowRadiusRes = resolveField(op.shadowRadiusHandleId, Number(op.shadowRadius ?? 30), MIN_RADIUS, MAX_RADIUS);\n\tconst highlightAmountRes = resolveField(op.highlightAmountHandleId, Number(op.highlightAmount ?? 0), 0, MAX_AMOUNT);\n\tconst highlightTonalWidthRes = resolveField(op.highlightTonalWidthHandleId, Number(op.highlightTonalWidth ?? 50), 0, 100);\n\tconst highlightRadiusRes = resolveField(op.highlightRadiusHandleId, Number(op.highlightRadius ?? 30), MIN_RADIUS, MAX_RADIUS);\n\tconst colorCorrectionRes = resolveField(op.colorCorrectionHandleId, Number(op.colorCorrection ?? 0), -100, 100);\n\tconst midtoneContrastRes = resolveField(op.midtoneContrastHandleId, Number(op.midtoneContrast ?? 0), -100, 100);\n\tconst tmpTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpView = tmpTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia\n\t}, tmpView, tmpTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tif (shadowAmountRes.val <= 0 && !shadowAmountRes.hasStaticSig && highlightAmountRes.val <= 0 && !highlightAmountRes.hasStaticSig && midtoneContrastRes.val === 0 && !midtoneContrastRes.hasStaticSig) {\n\t\tconst finalPass$1 = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tctx.renderer.drawTexture(finalPass$1, tmpTex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t}, { opacity: op.opacity ?? 1 });\n\t\targs.pass = finalPass$1;\n\t\treturn;\n\t}\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getShadowsHighlightsResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tconst getSignalView = (res, suffix) => {\n\t\tif (res.hasStaticSig && res.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, res.sd.nodeId ?? `${nodeId}_${suffix}`, elapsedSeconds, durationSeconds, res.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst shadowAmountView = getSignalView(shadowAmountRes, \"shadow_amount_sig\");\n\tconst shadowTonalWidthView = getSignalView(shadowTonalWidthRes, \"shadow_tonal_width_sig\");\n\tconst shadowRadiusView = getSignalView(shadowRadiusRes, \"shadow_radius_sig\");\n\tconst highlightAmountView = getSignalView(highlightAmountRes, \"highlight_amount_sig\");\n\tconst highlightTonalWidthView = getSignalView(highlightTonalWidthRes, \"highlight_tonal_width_sig\");\n\tconst highlightRadiusView = getSignalView(highlightRadiusRes, \"highlight_radius_sig\");\n\tconst colorCorrectionView = getSignalView(colorCorrectionRes, \"color_correction_sig\");\n\tconst midtoneContrastView = getSignalView(midtoneContrastRes, \"midtone_contrast_sig\");\n\tconst createBindGroup = (inputTex, origTexture) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTexture.createView()\n\t\t\t}\n\t\t]\n\t});\n\tshadowsHighlightsUniformData[2] = shadowRadiusRes.val;\n\tshadowsHighlightsUniformData[3] = highlightRadiusRes.val;\n\tshadowsHighlightsUniformData[4] = shadowAmountRes.val;\n\tshadowsHighlightsUniformData[5] = shadowTonalWidthRes.val;\n\tshadowsHighlightsUniformData[6] = highlightAmountRes.val;\n\tshadowsHighlightsUniformData[7] = highlightTonalWidthRes.val;\n\tshadowsHighlightsUniformData[8] = colorCorrectionRes.val;\n\tshadowsHighlightsUniformData[9] = midtoneContrastRes.val;\n\tshadowsHighlightsUniformData[10] = 0;\n\tshadowsHighlightsUniformData[11] = 0;\n\tshadowsHighlightsUniformData[12] = shadowAmountRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[13] = shadowTonalWidthRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[14] = shadowRadiusRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[15] = highlightAmountRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[16] = highlightTonalWidthRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[17] = highlightRadiusRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[18] = colorCorrectionRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[19] = midtoneContrastRes.hasStaticSig ? 1 : 0;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: shadowAmountView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: shadowTonalWidthView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: shadowRadiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: highlightAmountView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: highlightTonalWidthView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: highlightRadiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: colorCorrectionView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tresource: midtoneContrastView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tshadowsHighlightsUniformData[0] = 1;\n\tshadowsHighlightsUniformData[1] = 0;\n\tshadowsHighlightsUniformData[10] = 0;\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(shadowsHighlightsUniformData);\n\tconst hPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex1.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\thPass.setPipeline(pipeline);\n\thPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: hBuffer }\n\t\t}]\n\t}));\n\thPass.setBindGroup(1, createBindGroup(tmpTex, tmpTex));\n\thPass.setBindGroup(2, sigBindGroup);\n\thPass.draw(4);\n\thPass.end();\n\tshadowsHighlightsUniformData[0] = 0;\n\tshadowsHighlightsUniformData[1] = 1;\n\tshadowsHighlightsUniformData[10] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(shadowsHighlightsUniformData);\n\tconst vPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex2.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\tvPass.setPipeline(pipeline);\n\tvPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: vBuffer }\n\t\t}]\n\t}));\n\tvPass.setBindGroup(1, createBindGroup(outTex1, tmpTex));\n\tvPass.setBindGroup(2, sigBindGroup);\n\tvPass.draw(4);\n\tvPass.end();\n\tconst finalPass = 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(finalPass, outTex2, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: op.opacity ?? 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer };\n\n//#endregion\nexport { MIN_RADIUS as a, ShadowsHighlightsNodeConfigSchema as c, defaultShadowsHighlightsConfig as d, shadowsHighlightsConfig as f, MAX_RADIUS as i, ShadowsHighlightsOperationSchema as l, WebGPURenderer as n, SHADOWS_HIGHLIGHTS_OUTPUT_TYPE_MAP as o, MAX_AMOUNT as r, SHADOWS_HIGHLIGHTS_PRESETS as s, renderers_default as t, ShadowsHighlightsResultSchema as u };\n//# sourceMappingURL=renderers-Bhlcw5SC.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BDbTWSpP.mjs","names":[],"sources":["../../../nodes/node-shadows-highlights/dist/renderers-Bhlcw5SC.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst MIN_RADIUS = 1;\nconst MAX_AMOUNT = 100;\nconst shadowsHighlightsConfig = configBuilder().field(\"shadowAmount\", z.number().min(0).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Shadow Boost (%)\",\n\tdescription: \"Percentage to lift and recover crushed shadow details (0–100%).\"\n}).field(\"shadowTonalWidth\", z.number().min(0).max(100).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Shadow Range (%)\",\n\tdescription: \"Range of dark tones affected by shadow adjustments (0–100%).\"\n}).field(\"shadowRadius\", z.number().min(1).max(250).default(30), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Shadow Radius (px)\",\n\tdescription: \"Local neighborhood radius in pixels to determine shadow illumination (1–250px).\"\n}).field(\"highlightAmount\", z.number().min(0).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Highlight Suppression (%)\",\n\tdescription: \"Percentage to suppress and recover blown highlight details (0–100%).\"\n}).field(\"highlightTonalWidth\", z.number().min(0).max(100).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Highlight Range (%)\",\n\tdescription: \"Range of bright tones affected by highlight adjustments (0–100%).\"\n}).field(\"highlightRadius\", z.number().min(1).max(250).default(30), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Highlight Radius (px)\",\n\tdescription: \"Local neighborhood radius in pixels to determine highlight exposure (1–250px).\"\n}).field(\"colorCorrection\", z.number().min(-100).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Color Correction (%)\",\n\tdescription: \"Fine-tunes color saturation in recovered shadow/highlight zones (-100 to +100%).\"\n}).field(\"midtoneContrast\", z.number().min(-100).max(100).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Midtone Contrast (%)\",\n\tdescription: \"Adjusts contrast centered on the midtones (-100 to +100%).\"\n}).build();\nconst ShadowsHighlightsNodeConfigSchema = shadowsHighlightsConfig.schema;\nconst ShadowsHighlightsResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ShadowsHighlightsOperationSchema = ShadowsHighlightsNodeConfigSchema.extend({\n\top: z.literal(\"ShadowsHighlights\"),\n\tmetadata: z.unknown().optional()\n});\nconst defaultShadowsHighlightsConfig = ShadowsHighlightsNodeConfigSchema.parse({});\nconst SHADOWS_HIGHLIGHTS_PRESETS = [\n\t{\n\t\tid: \"default\",\n\t\tname: \"Default (Neutral)\",\n\t\tdescription: \"Zero adjustments across dynamic range\",\n\t\tconfig: {\n\t\t\tshadowAmount: 0,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 30,\n\t\t\thighlightAmount: 0,\n\t\t\thighlightTonalWidth: 50,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 0,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t},\n\t{\n\t\tid: \"shadow-lift\",\n\t\tname: \"Shadow Detail Lift\",\n\t\tdescription: \"Gently opens up underexposed shadows without bleaching midtones\",\n\t\tconfig: {\n\t\t\tshadowAmount: 40,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 35,\n\t\t\thighlightAmount: 0,\n\t\t\thighlightTonalWidth: 50,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 10,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t},\n\t{\n\t\tid: \"highlight-recovery\",\n\t\tname: \"Highlight Recovery\",\n\t\tdescription: \"Pulls back blown sky, cloud, and specular highlight clipping\",\n\t\tconfig: {\n\t\t\tshadowAmount: 0,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 30,\n\t\t\thighlightAmount: 45,\n\t\t\thighlightTonalWidth: 40,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: -5,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t},\n\t{\n\t\tid: \"hdr-balance\",\n\t\tname: \"HDR Dynamic Range\",\n\t\tdescription: \"Balanced recovery expanding visible dynamic range in high contrast scenes\",\n\t\tconfig: {\n\t\t\tshadowAmount: 35,\n\t\t\tshadowTonalWidth: 50,\n\t\t\tshadowRadius: 40,\n\t\t\thighlightAmount: 35,\n\t\t\thighlightTonalWidth: 50,\n\t\t\thighlightRadius: 40,\n\t\t\tcolorCorrection: 15,\n\t\t\tmidtoneContrast: 10\n\t\t}\n\t},\n\t{\n\t\tid: \"backlight-correction\",\n\t\tname: \"Backlight Correction\",\n\t\tdescription: \"Compensates for harsh backlighting illuminating silhouetted subjects\",\n\t\tconfig: {\n\t\t\tshadowAmount: 60,\n\t\t\tshadowTonalWidth: 60,\n\t\t\tshadowRadius: 50,\n\t\t\thighlightAmount: 20,\n\t\t\thighlightTonalWidth: 35,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 20,\n\t\t\tmidtoneContrast: 5\n\t\t}\n\t},\n\t{\n\t\tid: \"dramatic-punch\",\n\t\tname: \"Dramatic Contrast & Clarity\",\n\t\tdescription: \"Deepens shadows, compresses highlights, and boosts midtone punch\",\n\t\tconfig: {\n\t\t\tshadowAmount: 10,\n\t\t\tshadowTonalWidth: 30,\n\t\t\tshadowRadius: 25,\n\t\t\thighlightAmount: 30,\n\t\t\thighlightTonalWidth: 55,\n\t\t\thighlightRadius: 25,\n\t\t\tcolorCorrection: 5,\n\t\t\tmidtoneContrast: 25\n\t\t}\n\t},\n\t{\n\t\tid: \"gentle-fill\",\n\t\tname: \"Gentle Fill Light\",\n\t\tdescription: \"Subtle lift to low-light areas preserving photographic atmosphere\",\n\t\tconfig: {\n\t\t\tshadowAmount: 20,\n\t\t\tshadowTonalWidth: 40,\n\t\t\tshadowRadius: 30,\n\t\t\thighlightAmount: 15,\n\t\t\thighlightTonalWidth: 40,\n\t\t\thighlightRadius: 30,\n\t\t\tcolorCorrection: 5,\n\t\t\tmidtoneContrast: 0\n\t\t}\n\t}\n];\nconst SHADOWS_HIGHLIGHTS_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_SHADOWS_HIGHLIGHTS_UNIFORMS = `\nstruct ShadowsHighlightsUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tshadowRadius : f32,\n\thighlightRadius : f32,\n\n\tshadowAmount : f32,\n\tshadowTonalWidth : f32,\n\thighlightAmount : f32,\n\thighlightTonalWidth : f32,\n\n\tcolorCorrection : f32,\n\tmidtoneContrast : f32,\n\tisSecondPass : f32,\n\t_pad0 : f32,\n\n\thasShadowAmountSig : f32,\n\thasShadowTonalWidthSig : f32,\n\thasShadowRadiusSig : f32,\n\thasHighlightAmountSig : f32,\n\n\thasHighlightTonalWidthSig : f32,\n\thasHighlightRadiusSig : f32,\n\thasColorCorrectionSig : f32,\n\thasMidtoneContrastSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ShadowsHighlightsUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var shadowAmountSigTex : texture_2d<f32>;\n@group(2) @binding(1) var shadowTonalWidthSigTex : texture_2d<f32>;\n@group(2) @binding(2) var shadowRadiusSigTex : texture_2d<f32>;\n@group(2) @binding(3) var highlightAmountSigTex : texture_2d<f32>;\n@group(2) @binding(4) var highlightTonalWidthSigTex : texture_2d<f32>;\n@group(2) @binding(5) var highlightRadiusSigTex : texture_2d<f32>;\n@group(2) @binding(6) var colorCorrectionSigTex : texture_2d<f32>;\n@group(2) @binding(7) var midtoneContrastSigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn get_luminance(c: vec3<f32>) -> f32 {\n\treturn dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet origCol = textureSampleLevel(origTex, samp, in.uv, 0.0);\n\n\tvar sAmount = u.shadowAmount;\n\tif (u.hasShadowAmountSig > 0.5) {\n\t\tsAmount = textureSampleLevel(shadowAmountSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tsAmount = clamp(sAmount, 0.0, 100.0);\n\n\tvar sTonalWidthVal = u.shadowTonalWidth;\n\tif (u.hasShadowTonalWidthSig > 0.5) {\n\t\tsTonalWidthVal = textureSampleLevel(shadowTonalWidthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tsTonalWidthVal = clamp(sTonalWidthVal, 0.0, 100.0);\n\n\tvar sRadius = u.shadowRadius;\n\tif (u.hasShadowRadiusSig > 0.5) {\n\t\tsRadius = textureSampleLevel(shadowRadiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tsRadius = clamp(sRadius, 1.0, 250.0);\n\n\tvar hAmount = u.highlightAmount;\n\tif (u.hasHighlightAmountSig > 0.5) {\n\t\thAmount = textureSampleLevel(highlightAmountSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\thAmount = clamp(hAmount, 0.0, 100.0);\n\n\tvar hTonalWidthVal = u.highlightTonalWidth;\n\tif (u.hasHighlightTonalWidthSig > 0.5) {\n\t\thTonalWidthVal = textureSampleLevel(highlightTonalWidthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\thTonalWidthVal = clamp(hTonalWidthVal, 0.0, 100.0);\n\n\tvar hRadius = u.highlightRadius;\n\tif (u.hasHighlightRadiusSig > 0.5) {\n\t\thRadius = textureSampleLevel(highlightRadiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\thRadius = clamp(hRadius, 1.0, 250.0);\n\n\tvar colCorrVal = u.colorCorrection;\n\tif (u.hasColorCorrectionSig > 0.5) {\n\t\tcolCorrVal = textureSampleLevel(colorCorrectionSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tcolCorrVal = clamp(colCorrVal, -100.0, 100.0);\n\n\tvar midContrastVal = u.midtoneContrast;\n\tif (u.hasMidtoneContrastSig > 0.5) {\n\t\tmidContrastVal = textureSampleLevel(midtoneContrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tmidContrastVal = clamp(midContrastVal, -100.0, 100.0);\n\n\tif (sAmount <= 0.0 && hAmount <= 0.0 && abs(midContrastVal) <= 0.0) {\n\t\tif (u.isSecondPass > 0.5) {\n\t\t\treturn origCol;\n\t\t}\n\t\treturn origCol;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tlet lumaOrig = get_luminance(origCol.rgb / max(origCol.a, 1e-5));\n\n\t// Shadow blur parameters\n\tlet sSpatialSigma = sRadius;\n\tlet stepScaleS = max(1.0, sSpatialSigma / 20.0);\n\tlet effectiveSigmaS = sSpatialSigma / stepScaleS;\n\tlet sampleRadiusS = min(i32(ceil(3.0 * effectiveSigmaS)), 64);\n\n\t// Highlight blur parameters\n\tlet hSpatialSigma = hRadius;\n\tlet stepScaleH = max(1.0, hSpatialSigma / 20.0);\n\tlet effectiveSigmaH = hSpatialSigma / stepScaleH;\n\tlet sampleRadiusH = min(i32(ceil(3.0 * effectiveSigmaH)), 64);\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// PASS 1: Horizontal blur of luminance from origTex\n\t\t// Output packed channels: R = sLumaPass1, G = hLumaPass1, B = sAlphaPass1, A = hAlphaPass1\n\t\tvar sSum = 0.0;\n\t\tvar sWeightSum = 0.0;\n\t\tvar sAlphaSum = 0.0;\n\t\tvar sKernelSum = 0.0;\n\n\t\tfor (var i = -sampleRadiusS; i <= sampleRadiusS; i++) {\n\t\t\tlet offset = vec2<f32>(f32(i) * stepScaleS) * direction * texelSize;\n\t\t\tlet x = f32(i) * stepScaleS;\n\t\t\tlet weight = exp(-0.5 * (x / sSpatialSigma) * (x / sSpatialSigma));\n\t\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\tlet sampleAlpha = sampleCol.a;\n\t\t\tlet sampleLuma = get_luminance(sampleCol.rgb / max(sampleAlpha, 1e-5));\n\t\t\tsSum += sampleLuma * weight * sampleAlpha;\n\t\t\tsWeightSum += weight * sampleAlpha;\n\t\t\tsAlphaSum += sampleAlpha * weight;\n\t\t\tsKernelSum += weight;\n\t\t}\n\n\t\tvar hSum = 0.0;\n\t\tvar hWeightSum = 0.0;\n\t\tvar hAlphaSum = 0.0;\n\t\tvar hKernelSum = 0.0;\n\n\t\tfor (var i = -sampleRadiusH; i <= sampleRadiusH; i++) {\n\t\t\tlet offset = vec2<f32>(f32(i) * stepScaleH) * direction * texelSize;\n\t\t\tlet x = f32(i) * stepScaleH;\n\t\t\tlet weight = exp(-0.5 * (x / hSpatialSigma) * (x / hSpatialSigma));\n\t\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\tlet sampleAlpha = sampleCol.a;\n\t\t\tlet sampleLuma = get_luminance(sampleCol.rgb / max(sampleAlpha, 1e-5));\n\t\t\thSum += sampleLuma * weight * sampleAlpha;\n\t\t\thWeightSum += weight * sampleAlpha;\n\t\t\thAlphaSum += sampleAlpha * weight;\n\t\t\thKernelSum += weight;\n\t\t}\n\n\t\tlet sLumaPass1 = select(lumaOrig, sSum / sWeightSum, sWeightSum > 1e-5);\n\t\tlet sAlphaPass1 = sAlphaSum / max(sKernelSum, 1e-5);\n\t\tlet hLumaPass1 = select(lumaOrig, hSum / hWeightSum, hWeightSum > 1e-5);\n\t\tlet hAlphaPass1 = hAlphaSum / max(hKernelSum, 1e-5);\n\n\t\treturn vec4<f32>(sLumaPass1, hLumaPass1, sAlphaPass1, hAlphaPass1);\n\t}\n\n\t// PASS 2: Vertical blur of Pass 1 + Dynamic Range Recovery\n\tif (origCol.a < 1e-5) {\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t}\n\n\tvar sSum = 0.0;\n\tvar sWeightSum = 0.0;\n\n\tfor (var i = -sampleRadiusS; i <= sampleRadiusS; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScaleS) * direction * texelSize;\n\t\tlet x = f32(i) * stepScaleS;\n\t\tlet weight = exp(-0.5 * (x / sSpatialSigma) * (x / sSpatialSigma));\n\t\tlet samplePass1 = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tlet sampleAlpha = samplePass1.b;\n\t\tlet sampleLuma = samplePass1.r;\n\t\tsSum += sampleLuma * weight * sampleAlpha;\n\t\tsWeightSum += weight * sampleAlpha;\n\t}\n\n\tvar hSum = 0.0;\n\tvar hWeightSum = 0.0;\n\n\tfor (var i = -sampleRadiusH; i <= sampleRadiusH; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScaleH) * direction * texelSize;\n\t\tlet x = f32(i) * stepScaleH;\n\t\tlet weight = exp(-0.5 * (x / hSpatialSigma) * (x / hSpatialSigma));\n\t\tlet samplePass1 = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tlet sampleAlpha = samplePass1.a;\n\t\tlet sampleLuma = samplePass1.g;\n\t\thSum += sampleLuma * weight * sampleAlpha;\n\t\thWeightSum += weight * sampleAlpha;\n\t}\n\n\tlet sLumaBlur = select(lumaOrig, sSum / sWeightSum, sWeightSum > 1e-5);\n\tlet hLumaBlur = select(lumaOrig, hSum / hWeightSum, hWeightSum > 1e-5);\n\n\tlet alpha = origCol.a;\n\tlet rgb = origCol.rgb / alpha;\n\n\tlet sAmountNorm = sAmount / 100.0;\n\tlet hAmountNorm = hAmount / 100.0;\n\tlet sTonalWidth = clamp(sTonalWidthVal / 100.0, 0.01, 1.0);\n\tlet hTonalWidth = clamp(hTonalWidthVal / 100.0, 0.01, 1.0);\n\tlet colCorrNorm = colCorrVal / 100.0;\n\tlet midContrastNorm = midContrastVal / 100.0;\n\n\tlet sEvalLuma = 0.65 * sLumaBlur + 0.35 * lumaOrig;\n\tlet hEvalLuma = 0.65 * hLumaBlur + 0.35 * lumaOrig;\n\n\tlet wShadow = 1.0 - smoothstep(0.0, sTonalWidth, sEvalLuma);\n\tlet wHighlight = smoothstep(1.0 - hTonalWidth, 1.0, hEvalLuma);\n\n\tlet shadowBoost = sAmountNorm * wShadow * (1.0 - lumaOrig) * (1.0 - sqrt(clamp(sLumaBlur, 0.0, 1.0)));\n\tlet highlightSuppression = hAmountNorm * wHighlight * lumaOrig * sqrt(clamp(hLumaBlur, 0.0, 1.0));\n\n\tvar targetLuma = clamp(lumaOrig + shadowBoost - highlightSuppression, 0.0, 1.0);\n\n\tif (abs(midContrastNorm) > 0.001) {\n\t\tlet midDiff = targetLuma - 0.5;\n\t\tlet sCurve = midDiff * (1.0 - 4.0 * midDiff * midDiff);\n\t\ttargetLuma = clamp(targetLuma + midContrastNorm * sCurve * 0.4, 0.0, 1.0);\n\t}\n\n\tvar adjustedRgb = rgb * ((targetLuma + 1e-4) / (lumaOrig + 1e-4));\n\n\tlet effectIntensity = sAmountNorm * wShadow + hAmountNorm * wHighlight;\n\tlet satFactor = clamp(1.0 + colCorrNorm * effectIntensity * 1.5, 0.0, 3.0);\n\tadjustedRgb = mix(vec3<f32>(targetLuma), adjustedRgb, satFactor);\n\n\tlet finalRgb = clamp(adjustedRgb, vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst shadowsHighlightsUniformData = new Float32Array(20);\nfunction getShadowsHighlightsResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tbuffer: { type: \"uniform\" }\n\t}] });\n\tconst textureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}\n\t] });\n\tconst signalTextureLayout = device.createBindGroupLayout({ entries: [\n\t\t{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 2,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 3,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 4,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 5,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 6,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 7,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t},\n\t\t{\n\t\t\tbinding: 8,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}\n\t] });\n\tconst shaderModule = device.createShaderModule({ code: WGSL_SHADOWS_HIGHLIGHTS_UNIFORMS });\n\tconst pipelineLayout = device.createPipelineLayout({ bindGroupLayouts: [\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout\n\t] });\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlayout: pipelineLayout,\n\t\t\tvertex: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: targetFormat }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ShadowsHighlights\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = (props.virtualMedia?.metadata)?.id || (op.inputs ? Object.keys(op.inputs)[0] : null) || props.renderId || \"shadowshighlights_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => {\n\t\tif (handleId && op.inputs?.[handleId]?.connectionValid) {\n\t\t\tconst outputItem = op.inputs[handleId].outputItem;\n\t\t\tif (outputItem?.type === \"Number\") {\n\t\t\t\tconst numVal = typeof outputItem.data === \"number\" ? outputItem.data : outputItem.data?.value ?? fallbackVal;\n\t\t\t\treturn {\n\t\t\t\t\tval: Math.max(clampMin, Math.min(clampMax, numVal)),\n\t\t\t\t\thasStaticSig: false,\n\t\t\t\t\tsd: null\n\t\t\t\t};\n\t\t\t}\n\t\t\tif (outputItem?.type === \"Signal\" && outputItem.data) return {\n\t\t\t\tval: fallbackVal,\n\t\t\t\thasStaticSig: true,\n\t\t\t\tsd: outputItem.data\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tval: Math.max(clampMin, Math.min(clampMax, fallbackVal)),\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t};\n\tconst shadowAmountRes = resolveField(op.shadowAmountHandleId, Number(op.shadowAmount ?? 0), 0, MAX_AMOUNT);\n\tconst shadowTonalWidthRes = resolveField(op.shadowTonalWidthHandleId, Number(op.shadowTonalWidth ?? 50), 0, 100);\n\tconst shadowRadiusRes = resolveField(op.shadowRadiusHandleId, Number(op.shadowRadius ?? 30), MIN_RADIUS, MAX_RADIUS);\n\tconst highlightAmountRes = resolveField(op.highlightAmountHandleId, Number(op.highlightAmount ?? 0), 0, MAX_AMOUNT);\n\tconst highlightTonalWidthRes = resolveField(op.highlightTonalWidthHandleId, Number(op.highlightTonalWidth ?? 50), 0, 100);\n\tconst highlightRadiusRes = resolveField(op.highlightRadiusHandleId, Number(op.highlightRadius ?? 30), MIN_RADIUS, MAX_RADIUS);\n\tconst colorCorrectionRes = resolveField(op.colorCorrectionHandleId, Number(op.colorCorrection ?? 0), -100, 100);\n\tconst midtoneContrastRes = resolveField(op.midtoneContrastHandleId, Number(op.midtoneContrast ?? 0), -100, 100);\n\tconst tmpTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpView = tmpTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia\n\t}, tmpView, tmpTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tif (shadowAmountRes.val <= 0 && !shadowAmountRes.hasStaticSig && highlightAmountRes.val <= 0 && !highlightAmountRes.hasStaticSig && midtoneContrastRes.val === 0 && !midtoneContrastRes.hasStaticSig) {\n\t\tconst finalPass$1 = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"load\");\n\t\tctx.renderer.drawTexture(finalPass$1, tmpTex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t}, { opacity: op.opacity ?? 1 });\n\t\targs.pass = finalPass$1;\n\t\treturn;\n\t}\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getShadowsHighlightsResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tconst getSignalView = (res, suffix) => {\n\t\tif (res.hasStaticSig && res.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, res.sd.nodeId ?? `${nodeId}_${suffix}`, elapsedSeconds, durationSeconds, res.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst shadowAmountView = getSignalView(shadowAmountRes, \"shadow_amount_sig\");\n\tconst shadowTonalWidthView = getSignalView(shadowTonalWidthRes, \"shadow_tonal_width_sig\");\n\tconst shadowRadiusView = getSignalView(shadowRadiusRes, \"shadow_radius_sig\");\n\tconst highlightAmountView = getSignalView(highlightAmountRes, \"highlight_amount_sig\");\n\tconst highlightTonalWidthView = getSignalView(highlightTonalWidthRes, \"highlight_tonal_width_sig\");\n\tconst highlightRadiusView = getSignalView(highlightRadiusRes, \"highlight_radius_sig\");\n\tconst colorCorrectionView = getSignalView(colorCorrectionRes, \"color_correction_sig\");\n\tconst midtoneContrastView = getSignalView(midtoneContrastRes, \"midtone_contrast_sig\");\n\tconst createBindGroup = (inputTex, origTexture) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTexture.createView()\n\t\t\t}\n\t\t]\n\t});\n\tshadowsHighlightsUniformData[2] = shadowRadiusRes.val;\n\tshadowsHighlightsUniformData[3] = highlightRadiusRes.val;\n\tshadowsHighlightsUniformData[4] = shadowAmountRes.val;\n\tshadowsHighlightsUniformData[5] = shadowTonalWidthRes.val;\n\tshadowsHighlightsUniformData[6] = highlightAmountRes.val;\n\tshadowsHighlightsUniformData[7] = highlightTonalWidthRes.val;\n\tshadowsHighlightsUniformData[8] = colorCorrectionRes.val;\n\tshadowsHighlightsUniformData[9] = midtoneContrastRes.val;\n\tshadowsHighlightsUniformData[10] = 0;\n\tshadowsHighlightsUniformData[11] = 0;\n\tshadowsHighlightsUniformData[12] = shadowAmountRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[13] = shadowTonalWidthRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[14] = shadowRadiusRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[15] = highlightAmountRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[16] = highlightTonalWidthRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[17] = highlightRadiusRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[18] = colorCorrectionRes.hasStaticSig ? 1 : 0;\n\tshadowsHighlightsUniformData[19] = midtoneContrastRes.hasStaticSig ? 1 : 0;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: shadowAmountView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: shadowTonalWidthView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: shadowRadiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: highlightAmountView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: highlightTonalWidthView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: highlightRadiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: colorCorrectionView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tresource: midtoneContrastView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tshadowsHighlightsUniformData[0] = 1;\n\tshadowsHighlightsUniformData[1] = 0;\n\tshadowsHighlightsUniformData[10] = 0;\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(shadowsHighlightsUniformData);\n\tconst hPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex1.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\thPass.setPipeline(pipeline);\n\thPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: hBuffer }\n\t\t}]\n\t}));\n\thPass.setBindGroup(1, createBindGroup(tmpTex, tmpTex));\n\thPass.setBindGroup(2, sigBindGroup);\n\thPass.draw(4);\n\thPass.end();\n\tshadowsHighlightsUniformData[0] = 0;\n\tshadowsHighlightsUniformData[1] = 1;\n\tshadowsHighlightsUniformData[10] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(shadowsHighlightsUniformData);\n\tconst vPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex2.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\tvPass.setPipeline(pipeline);\n\tvPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: vBuffer }\n\t\t}]\n\t}));\n\tvPass.setBindGroup(1, createBindGroup(outTex1, tmpTex));\n\tvPass.setBindGroup(2, sigBindGroup);\n\tvPass.draw(4);\n\tvPass.end();\n\tconst finalPass = 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(finalPass, outTex2, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: op.opacity ?? 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer };\n\n//#endregion\nexport { MIN_RADIUS as a, ShadowsHighlightsNodeConfigSchema as c, defaultShadowsHighlightsConfig as d, shadowsHighlightsConfig as f, MAX_RADIUS as i, ShadowsHighlightsOperationSchema as l, WebGPURenderer as n, SHADOWS_HIGHLIGHTS_OUTPUT_TYPE_MAP as o, MAX_AMOUNT as r, SHADOWS_HIGHLIGHTS_PRESETS as s, renderers_default as t, ShadowsHighlightsResultSchema as u };\n//# sourceMappingURL=renderers-Bhlcw5SC.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { It as resolveNumber } from "./dist-B9Afsv83.mjs";
1
+ import { Jt as resolveNumber } from "./dist-CbG3QxDw.mjs";
2
2
  import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
3
- import { C as WebGPUAudioProcessor } from "./dist-B9PkqWnN.mjs";
3
+ import { C as WebGPUAudioProcessor } from "./dist-Cxi68OuY.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-compressor/dist/renderers-SLJHsmbM.mjs
6
6
  const PARAM_ORDER = [
@@ -255,4 +255,4 @@ var renderers_default = defineRenderer({ audioProcessor: compressorAudioProcesso
255
255
 
256
256
  //#endregion
257
257
  export { renderers_default as t };
258
- //# sourceMappingURL=renderer-DxtHmyAa.mjs.map
258
+ //# sourceMappingURL=renderer-BIIWCg_J.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DxtHmyAa.mjs","names":[],"sources":["../../../nodes/node-audio-compressor/dist/renderers-SLJHsmbM.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"ratio\",\n\t\"attack\",\n\t\"release\",\n\t\"knee\",\n\t\"makeupGain\"\n];\nconst COMPRESSOR_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n ratio : f32,\n attack : f32,\n release : f32,\n knee : f32,\n makeupGain : f32,\n hasThresholdSig : f32,\n hasRatioSig : f32,\n hasAttackSig : f32,\n hasReleaseSig : f32,\n hasKneeSig : f32,\n hasMakeupGainSig : 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>; // state[0] = envelope\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> ratioSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> kneeSignal : array<f32>;\n@group(0) @binding(9) var<storage, read> makeupGainSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\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\n var envelope = state[0];\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effRatio = u.ratio;\n if (u.hasRatioSig > 0.5f) {\n effRatio = ratioSignal[index];\n }\n effRatio = clamp(effRatio, 1.0f, 100.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.001f, 10.0f);\n\n var effKnee = u.knee;\n if (u.hasKneeSig > 0.5f) {\n effKnee = kneeSignal[index];\n }\n effKnee = clamp(effKnee, 0.0f, 40.0f);\n\n var effMakeupGain = u.makeupGain;\n if (u.hasMakeupGainSig > 0.5f) {\n effMakeupGain = makeupGainSignal[index];\n }\n effMakeupGain = clamp(effMakeupGain, -60.0f, 36.0f);\n\n // 2. Safe Attack / Release Coefficients\n let attackCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effAttack)), 0.00001f, 1.0f);\n let releaseCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effRelease)), 0.00001f, 1.0f);\n\n // 3. Peak Detection with NaN / Inf sanitization\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) {\n val = 0.0f;\n }\n if (val > peak) {\n peak = val;\n }\n }\n \n // 4. Convert Peak to dBFS\n let dB = 20.0f * log10(max(peak, 1e-9f));\n\n // 5. Compute target reduction (soft-knee & ratio)\n var targetReductiondB = 0.0f;\n if (effKnee > 0.0f) {\n let x = dB - effThreshold;\n if (x <= -effKnee / 2.0f) {\n targetReductiondB = 0.0f;\n } else if (x >= effKnee / 2.0f) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n } else {\n let kneeTerm = x + effKnee / 2.0f;\n targetReductiondB = ((kneeTerm * kneeTerm) / (2.0f * effKnee)) * (1.0f - 1.0f / effRatio);\n }\n } else {\n if (dB > effThreshold) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n }\n }\n\n targetReductiondB = clamp(targetReductiondB, 0.0f, 120.0f);\n\n // 6. Envelope Smoothing\n let targetGaindB = -targetReductiondB;\n if (targetGaindB < envelope) {\n envelope += (targetGaindB - envelope) * attackCoeff;\n } else {\n envelope += (targetGaindB - envelope) * releaseCoeff;\n }\n\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\n envelope = clamp(envelope, -120.0f, 0.0f);\n\n // 7. Apply linear gain and soft clipping\n let totalGaindB = clamp(envelope + effMakeupGain, -120.0f, 36.0f);\n let gainLinear = clamp(pow(10.0f, totalGaindB / 20.0f), 0.0f, 63.1f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) {\n inVal = 0.0f;\n }\n\n var outVal = inVal * gainLinear;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n \n // Soft clipping at ±1.0 with smooth tanh transition starting at ±0.9\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n \n outputChannels[sampleIndex] = outVal;\n }\n }\n\n if (is_nan_or_inf(envelope)) {\n state[0] = 0.0f;\n } else {\n state[0] = clamp(envelope, -120.0f, 0.0f);\n }\n}\n`;\nconst compressorAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Dynamics Compressor.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst threshold = resolveNumber(op.threshold, -24);\n\tconst ratio = resolveNumber(op.ratio, 4);\n\tconst attack = resolveNumber(op.attack, .003);\n\tconst release = resolveNumber(op.release, .25);\n\tconst knee = resolveNumber(op.knee, 6);\n\tconst makeupGain = resolveNumber(op.makeupGain, 0);\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasThresholdSig = isHandleConnected(\"thresholdHandleId\") ? 1 : 0;\n\tconst hasRatioSig = isHandleConnected(\"ratioHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(\"attackHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(\"releaseHandleId\") ? 1 : 0;\n\tconst hasKneeSig = isHandleConnected(\"kneeHandleId\") ? 1 : 0;\n\tconst hasMakeupGainSig = isHandleConnected(\"makeupGainHandleId\") ? 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-compressor\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, COMPRESSOR_SHADER_TEMPLATE, (t) => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tratio,\n\t\tattack,\n\t\trelease,\n\t\tknee,\n\t\tmakeupGain,\n\t\thasThresholdSig,\n\t\thasRatioSig,\n\t\thasAttackSig,\n\t\thasReleaseSig,\n\t\thasKneeSig,\n\t\thasMakeupGainSig,\n\t\tt,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 20, 1, 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: compressorAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-SLJHsmbM.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4LzC,MAAM,2BAA2B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACnF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,wDAAwD;CAC1F,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,QAAQ,cAAc,GAAG,OAAO,EAAE;CACxC,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,UAAU,cAAc,GAAG,SAAS,IAAI;CAC9C,MAAM,OAAO,cAAc,GAAG,MAAM,EAAE;CACtC,MAAM,aAAa,cAAc,GAAG,YAAY,EAAE;CAClD,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,cAAc,kBAAkB,gBAAgB,GAAG,IAAI;CAC7D,MAAM,eAAe,kBAAkB,iBAAiB,GAAG,IAAI;CAC/D,MAAM,gBAAgB,kBAAkB,kBAAkB,GAAG,IAAI;CACjE,MAAM,aAAa,kBAAkB,eAAe,GAAG,IAAI;CAC3D,MAAM,mBAAmB,kBAAkB,qBAAqB,GAAG,IAAI;CACvE,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;AACvB,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B,MAAM;EACzI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,0BAA0B,CAAC"}
1
+ {"version":3,"file":"renderer-BIIWCg_J.mjs","names":[],"sources":["../../../nodes/node-audio-compressor/dist/renderers-SLJHsmbM.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"ratio\",\n\t\"attack\",\n\t\"release\",\n\t\"knee\",\n\t\"makeupGain\"\n];\nconst COMPRESSOR_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n ratio : f32,\n attack : f32,\n release : f32,\n knee : f32,\n makeupGain : f32,\n hasThresholdSig : f32,\n hasRatioSig : f32,\n hasAttackSig : f32,\n hasReleaseSig : f32,\n hasKneeSig : f32,\n hasMakeupGainSig : 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>; // state[0] = envelope\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> ratioSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> kneeSignal : array<f32>;\n@group(0) @binding(9) var<storage, read> makeupGainSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\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\n var envelope = state[0];\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effRatio = u.ratio;\n if (u.hasRatioSig > 0.5f) {\n effRatio = ratioSignal[index];\n }\n effRatio = clamp(effRatio, 1.0f, 100.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.001f, 10.0f);\n\n var effKnee = u.knee;\n if (u.hasKneeSig > 0.5f) {\n effKnee = kneeSignal[index];\n }\n effKnee = clamp(effKnee, 0.0f, 40.0f);\n\n var effMakeupGain = u.makeupGain;\n if (u.hasMakeupGainSig > 0.5f) {\n effMakeupGain = makeupGainSignal[index];\n }\n effMakeupGain = clamp(effMakeupGain, -60.0f, 36.0f);\n\n // 2. Safe Attack / Release Coefficients\n let attackCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effAttack)), 0.00001f, 1.0f);\n let releaseCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effRelease)), 0.00001f, 1.0f);\n\n // 3. Peak Detection with NaN / Inf sanitization\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) {\n val = 0.0f;\n }\n if (val > peak) {\n peak = val;\n }\n }\n \n // 4. Convert Peak to dBFS\n let dB = 20.0f * log10(max(peak, 1e-9f));\n\n // 5. Compute target reduction (soft-knee & ratio)\n var targetReductiondB = 0.0f;\n if (effKnee > 0.0f) {\n let x = dB - effThreshold;\n if (x <= -effKnee / 2.0f) {\n targetReductiondB = 0.0f;\n } else if (x >= effKnee / 2.0f) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n } else {\n let kneeTerm = x + effKnee / 2.0f;\n targetReductiondB = ((kneeTerm * kneeTerm) / (2.0f * effKnee)) * (1.0f - 1.0f / effRatio);\n }\n } else {\n if (dB > effThreshold) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n }\n }\n\n targetReductiondB = clamp(targetReductiondB, 0.0f, 120.0f);\n\n // 6. Envelope Smoothing\n let targetGaindB = -targetReductiondB;\n if (targetGaindB < envelope) {\n envelope += (targetGaindB - envelope) * attackCoeff;\n } else {\n envelope += (targetGaindB - envelope) * releaseCoeff;\n }\n\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\n envelope = clamp(envelope, -120.0f, 0.0f);\n\n // 7. Apply linear gain and soft clipping\n let totalGaindB = clamp(envelope + effMakeupGain, -120.0f, 36.0f);\n let gainLinear = clamp(pow(10.0f, totalGaindB / 20.0f), 0.0f, 63.1f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) {\n inVal = 0.0f;\n }\n\n var outVal = inVal * gainLinear;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n \n // Soft clipping at ±1.0 with smooth tanh transition starting at ±0.9\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n \n outputChannels[sampleIndex] = outVal;\n }\n }\n\n if (is_nan_or_inf(envelope)) {\n state[0] = 0.0f;\n } else {\n state[0] = clamp(envelope, -120.0f, 0.0f);\n }\n}\n`;\nconst compressorAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Dynamics Compressor.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst threshold = resolveNumber(op.threshold, -24);\n\tconst ratio = resolveNumber(op.ratio, 4);\n\tconst attack = resolveNumber(op.attack, .003);\n\tconst release = resolveNumber(op.release, .25);\n\tconst knee = resolveNumber(op.knee, 6);\n\tconst makeupGain = resolveNumber(op.makeupGain, 0);\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasThresholdSig = isHandleConnected(\"thresholdHandleId\") ? 1 : 0;\n\tconst hasRatioSig = isHandleConnected(\"ratioHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(\"attackHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(\"releaseHandleId\") ? 1 : 0;\n\tconst hasKneeSig = isHandleConnected(\"kneeHandleId\") ? 1 : 0;\n\tconst hasMakeupGainSig = isHandleConnected(\"makeupGainHandleId\") ? 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-compressor\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, COMPRESSOR_SHADER_TEMPLATE, (t) => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tratio,\n\t\tattack,\n\t\trelease,\n\t\tknee,\n\t\tmakeupGain,\n\t\thasThresholdSig,\n\t\thasRatioSig,\n\t\thasAttackSig,\n\t\thasReleaseSig,\n\t\thasKneeSig,\n\t\thasMakeupGainSig,\n\t\tt,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 20, 1, 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: compressorAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-SLJHsmbM.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4LzC,MAAM,2BAA2B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACnF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,wDAAwD;CAC1F,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,QAAQ,cAAc,GAAG,OAAO,EAAE;CACxC,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,UAAU,cAAc,GAAG,SAAS,IAAI;CAC9C,MAAM,OAAO,cAAc,GAAG,MAAM,EAAE;CACtC,MAAM,aAAa,cAAc,GAAG,YAAY,EAAE;CAClD,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,cAAc,kBAAkB,gBAAgB,GAAG,IAAI;CAC7D,MAAM,eAAe,kBAAkB,iBAAiB,GAAG,IAAI;CAC/D,MAAM,gBAAgB,kBAAkB,kBAAkB,GAAG,IAAI;CACjE,MAAM,aAAa,kBAAkB,eAAe,GAAG,IAAI;CAC3D,MAAM,mBAAmB,kBAAkB,qBAAqB,GAAG,IAAI;CACvE,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;AACvB,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B,MAAM;EACzI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,0BAA0B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
2
- import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DzUJmIHt.mjs";
3
- import { nt as signalRegistry } from "./dist-B9PkqWnN.mjs";
2
+ import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BYqNNwsl.mjs";
3
+ import { rt as signalRegistry } from "./dist-Cxi68OuY.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-mask-math/dist/renderers-B_QRX8uG.mjs
@@ -768,4 +768,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
768
768
 
769
769
  //#endregion
770
770
  export { renderers_default as n, WebGPURenderer as t };
771
- //# sourceMappingURL=renderer-CJNyhr_S.mjs.map
771
+ //# sourceMappingURL=renderer-BJ1aTkZf.mjs.map