framefields 2.13.1 → 2.14.0

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 (288) hide show
  1. package/dist/audio/index.d.mts +5 -5
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-C4B9p_yq.d.mts → audio-CdCuGK5d.d.mts} +3 -3
  4. package/dist/{audio-C4B9p_yq.d.mts.map → audio-CdCuGK5d.d.mts.map} +1 -1
  5. package/dist/{audio-DIvi6hTD.mjs → audio-DFwRbID_.mjs} +3 -3
  6. package/dist/{audio-DIvi6hTD.mjs.map → audio-DFwRbID_.mjs.map} +1 -1
  7. package/dist/cli/check-worker.mjs +43 -43
  8. package/dist/components/index.d.mts +13 -13
  9. package/dist/components/index.mjs +42 -42
  10. package/dist/{dist-DtPPPsZV.mjs → dist--Uu5bQ_6.mjs} +557 -212
  11. package/dist/dist--Uu5bQ_6.mjs.map +1 -0
  12. package/dist/{dist-CCrYOkcc.mjs → dist-B8Nby2CU.mjs} +2 -2
  13. package/dist/{dist-CCrYOkcc.mjs.map → dist-B8Nby2CU.mjs.map} +1 -1
  14. package/dist/effects/index.d.mts +5 -5
  15. package/dist/effects/index.mjs +34 -34
  16. package/dist/{effects-B-L3rLs6.mjs → effects-WMgv8ZaD.mjs} +2 -2
  17. package/dist/{effects-B-L3rLs6.mjs.map → effects-WMgv8ZaD.mjs.map} +1 -1
  18. package/dist/fonts/index.mjs +2 -2
  19. package/dist/{fonts-k5ll8NTE.mjs → fonts-OW3yAfO5.mjs} +2 -2
  20. package/dist/{fonts-k5ll8NTE.mjs.map → fonts-OW3yAfO5.mjs.map} +1 -1
  21. package/dist/{gpu-D2HT3KcE.mjs → gpu-R4T2Tndu.mjs} +2 -2
  22. package/dist/{gpu-D2HT3KcE.mjs.map → gpu-R4T2Tndu.mjs.map} +1 -1
  23. package/dist/{index-CtKUQ2VG.d.mts → index-9xte4JgL.d.mts} +109 -60
  24. package/dist/index-9xte4JgL.d.mts.map +1 -0
  25. package/dist/{index-BGlaws7-.d.mts → index-B0Vq8Bwf.d.mts} +3 -3
  26. package/dist/{index-BGlaws7-.d.mts.map → index-B0Vq8Bwf.d.mts.map} +1 -1
  27. package/dist/{index-BFTtXosj.d.mts → index-BVd6nXd5.d.mts} +2 -2
  28. package/dist/{index-BFTtXosj.d.mts.map → index-BVd6nXd5.d.mts.map} +1 -1
  29. package/dist/{index-CnZhBlob.d.mts → index-Bv7gxGK1.d.mts} +2 -2
  30. package/dist/{index-CnZhBlob.d.mts.map → index-Bv7gxGK1.d.mts.map} +1 -1
  31. package/dist/{index-a6JrbAK0.d.mts → index-C-V6CAhP.d.mts} +32 -2
  32. package/dist/index-C-V6CAhP.d.mts.map +1 -0
  33. package/dist/{index-DQ1U3HC3.d.mts → index-C7-p9zwU.d.mts} +3 -3
  34. package/dist/{index-DQ1U3HC3.d.mts.map → index-C7-p9zwU.d.mts.map} +1 -1
  35. package/dist/{index-rtCXNxGO.d.mts → index-CEKxvGY-.d.mts} +2 -2
  36. package/dist/{index-rtCXNxGO.d.mts.map → index-CEKxvGY-.d.mts.map} +1 -1
  37. package/dist/{index-C2yaponf.d.mts → index-CRaydvLi.d.mts} +28 -9
  38. package/dist/index-CRaydvLi.d.mts.map +1 -0
  39. package/dist/{index-DBh3WphX.d.mts → index-D1FqV1eu.d.mts} +2 -2
  40. package/dist/{index-DBh3WphX.d.mts.map → index-D1FqV1eu.d.mts.map} +1 -1
  41. package/dist/{index-ByhlTwxh.d.mts → index-DoP6EiHj.d.mts} +5 -5
  42. package/dist/{index-ByhlTwxh.d.mts.map → index-DoP6EiHj.d.mts.map} +1 -1
  43. package/dist/{index-B08eSpaI.d.mts → index-GA9_Z8Fn.d.mts} +2 -2
  44. package/dist/{index-B08eSpaI.d.mts.map → index-GA9_Z8Fn.d.mts.map} +1 -1
  45. package/dist/index.d.mts +14 -14
  46. package/dist/index.mjs +50 -50
  47. package/dist/preview/index.d.mts +5 -5
  48. package/dist/preview/index.mjs +10 -10
  49. package/dist/{preview-lHH8Tv4j.mjs → preview-D7BGmE1E.mjs} +3 -3
  50. package/dist/{preview-lHH8Tv4j.mjs.map → preview-D7BGmE1E.mjs.map} +1 -1
  51. package/dist/preview-engine/{chunk-XCPRRMMW.mjs → chunk-5DZTPUMH.mjs} +195 -89
  52. package/dist/preview-engine/chunk-GNDE3OXQ.mjs +5 -0
  53. package/dist/preview-engine/{chunk-N3XTDAL6.mjs → chunk-UPZURPJY.mjs} +31 -31
  54. package/dist/preview-engine/components.mjs +1 -1
  55. package/dist/preview-engine/framefields.mjs +1 -1
  56. package/dist/preview-engine/player.mjs +1 -1
  57. package/dist/preview-engine/renderers-DLJOA3BM.mjs +228 -0
  58. package/dist/{program-BfiB9ttP.mjs → program-tFKCWU2j.mjs} +96 -12
  59. package/dist/program-tFKCWU2j.mjs.map +1 -0
  60. package/dist/renderer/index.d.mts +4 -4
  61. package/dist/renderer/index.mjs +2 -2
  62. package/dist/{renderer-CU6WT5jW.mjs → renderer-03mYJLgX.mjs} +3 -3
  63. package/dist/{renderer-CU6WT5jW.mjs.map → renderer-03mYJLgX.mjs.map} +1 -1
  64. package/dist/{renderer-BmyFfvVA.mjs → renderer-0rveCDm-.mjs} +3 -3
  65. package/dist/{renderer-BmyFfvVA.mjs.map → renderer-0rveCDm-.mjs.map} +1 -1
  66. package/dist/{renderer-QbSrnPZU.mjs → renderer-2PjR3w-q.mjs} +3 -3
  67. package/dist/{renderer-QbSrnPZU.mjs.map → renderer-2PjR3w-q.mjs.map} +1 -1
  68. package/dist/{renderer-BZMh2io2.mjs → renderer-47y12Z37.mjs} +2 -2
  69. package/dist/{renderer-BZMh2io2.mjs.map → renderer-47y12Z37.mjs.map} +1 -1
  70. package/dist/renderer-6_bzbbXt.mjs +5 -0
  71. package/dist/renderer-8M-9G6F_.mjs +5 -0
  72. package/dist/{renderer-CHCRcCKw.mjs → renderer-B0yVUOPP.mjs} +2 -2
  73. package/dist/{renderer-CHCRcCKw.mjs.map → renderer-B0yVUOPP.mjs.map} +1 -1
  74. package/dist/renderer-B5OzKvF8.mjs +5 -0
  75. package/dist/{renderer-CldjJmRR.mjs → renderer-B7G1KohJ.mjs} +2 -2
  76. package/dist/renderer-BBCZ2qbE.mjs +5 -0
  77. package/dist/{renderer-Y1kjtOto.mjs → renderer-BBMtmxks.mjs} +3 -3
  78. package/dist/{renderer-Y1kjtOto.mjs.map → renderer-BBMtmxks.mjs.map} +1 -1
  79. package/dist/renderer-BChbxCux.mjs +5 -0
  80. package/dist/{renderer-CdXBRdFf.mjs → renderer-BDzn1AKF.mjs} +2 -2
  81. package/dist/{renderer-CdXBRdFf.mjs.map → renderer-BDzn1AKF.mjs.map} +1 -1
  82. package/dist/renderer-BGeMPr8C.mjs +5 -0
  83. package/dist/{renderer-CSu_vYPn.mjs → renderer-BGp0An5A.mjs} +3 -3
  84. package/dist/{renderer-CSu_vYPn.mjs.map → renderer-BGp0An5A.mjs.map} +1 -1
  85. package/dist/{renderer-BZX932Lj.mjs → renderer-BH7UCMPQ.mjs} +2 -2
  86. package/dist/{renderer-BZX932Lj.mjs.map → renderer-BH7UCMPQ.mjs.map} +1 -1
  87. package/dist/{renderer-fG8Jy8Rx.d.mts → renderer-BHYJlK6H.d.mts} +2 -2
  88. package/dist/{renderer-fG8Jy8Rx.d.mts.map → renderer-BHYJlK6H.d.mts.map} +1 -1
  89. package/dist/{renderer-D-mX1EVA.mjs → renderer-BJ8ea92W.mjs} +3 -3
  90. package/dist/{renderer-D-mX1EVA.mjs.map → renderer-BJ8ea92W.mjs.map} +1 -1
  91. package/dist/{renderer-B6bK9rXm.mjs → renderer-BOSZAdgF.mjs} +2 -2
  92. package/dist/{renderer-B6bK9rXm.mjs.map → renderer-BOSZAdgF.mjs.map} +1 -1
  93. package/dist/renderer-BPQ8Pkjb.mjs +5 -0
  94. package/dist/renderer-BTRpA3HD.mjs +5 -0
  95. package/dist/{renderer-Dv_iRIyx.mjs → renderer-BVIXKfbC.mjs} +121 -105
  96. package/dist/renderer-BVIXKfbC.mjs.map +1 -0
  97. package/dist/{renderer-D0xM67cK.mjs → renderer-BVU22lBS.mjs} +2 -2
  98. package/dist/{renderer-D0xM67cK.mjs.map → renderer-BVU22lBS.mjs.map} +1 -1
  99. package/dist/renderer-BVsECSn-.mjs +5 -0
  100. package/dist/{renderer-HKv5cBdp.mjs → renderer-BWSRryIA.mjs} +2 -2
  101. package/dist/{renderer-HKv5cBdp.mjs.map → renderer-BWSRryIA.mjs.map} +1 -1
  102. package/dist/{renderer-D0h1hTOo.mjs → renderer-BacY4nh8.mjs} +2 -2
  103. package/dist/{renderer-D0h1hTOo.mjs.map → renderer-BacY4nh8.mjs.map} +1 -1
  104. package/dist/{renderer-D_m6Qbsi.mjs → renderer-Baw6Utxi.mjs} +2 -2
  105. package/dist/{renderer-D_m6Qbsi.mjs.map → renderer-Baw6Utxi.mjs.map} +1 -1
  106. package/dist/{renderer-CQ4h8n7p.mjs → renderer-Bcu3UrI-.mjs} +3 -3
  107. package/dist/{renderer-CQ4h8n7p.mjs.map → renderer-Bcu3UrI-.mjs.map} +1 -1
  108. package/dist/{renderer-yNWYqvvq.mjs → renderer-BeNl_6EG.mjs} +2 -2
  109. package/dist/{renderer-yNWYqvvq.mjs.map → renderer-BeNl_6EG.mjs.map} +1 -1
  110. package/dist/{renderer-pn52dzZz.mjs → renderer-BfZNIiSv.mjs} +2 -2
  111. package/dist/{renderer-pn52dzZz.mjs.map → renderer-BfZNIiSv.mjs.map} +1 -1
  112. package/dist/renderer-Bgos68gc.mjs +6 -0
  113. package/dist/{renderer-C64_B8It.mjs → renderer-BjDddtw9.mjs} +2 -2
  114. package/dist/renderer-BjHOvoqO.mjs +5 -0
  115. package/dist/renderer-BjXMPPlV.mjs +5 -0
  116. package/dist/{renderer-C98XwEIr.mjs → renderer-BpVOk9ux.mjs} +2 -2
  117. package/dist/{renderer-C98XwEIr.mjs.map → renderer-BpVOk9ux.mjs.map} +1 -1
  118. package/dist/{renderer-7xQmXXMH.mjs → renderer-Bpm145BW.mjs} +3 -3
  119. package/dist/{renderer-7xQmXXMH.mjs.map → renderer-Bpm145BW.mjs.map} +1 -1
  120. package/dist/{renderer-_J9JcCMR.mjs → renderer-Brmbl12Y.mjs} +3 -3
  121. package/dist/{renderer-_J9JcCMR.mjs.map → renderer-Brmbl12Y.mjs.map} +1 -1
  122. package/dist/renderer-Byobxqkv.mjs +5 -0
  123. package/dist/{renderer-B3un4Pdi.mjs → renderer-C20efMI0.mjs} +3 -3
  124. package/dist/{renderer-B3un4Pdi.mjs.map → renderer-C20efMI0.mjs.map} +1 -1
  125. package/dist/{renderer-Cfx_FCSf.mjs → renderer-C5AoaymD.mjs} +3 -3
  126. package/dist/{renderer-Cfx_FCSf.mjs.map → renderer-C5AoaymD.mjs.map} +1 -1
  127. package/dist/{renderer-DWYmJSrl.mjs → renderer-CCxk-RJR.mjs} +2 -2
  128. package/dist/{renderer-DWYmJSrl.mjs.map → renderer-CCxk-RJR.mjs.map} +1 -1
  129. package/dist/{renderer-DhGZ41hQ.mjs → renderer-CKo7VR8x.mjs} +3 -3
  130. package/dist/{renderer-DhGZ41hQ.mjs.map → renderer-CKo7VR8x.mjs.map} +1 -1
  131. package/dist/renderer-CKrsg3EG.mjs +5 -0
  132. package/dist/{renderer-BIKkxw_Z.mjs → renderer-COgwYqev.mjs} +3 -3
  133. package/dist/{renderer-BIKkxw_Z.mjs.map → renderer-COgwYqev.mjs.map} +1 -1
  134. package/dist/{renderer-uzU6dsdR.mjs → renderer-CP108ABB.mjs} +2 -2
  135. package/dist/{renderer-uzU6dsdR.mjs.map → renderer-CP108ABB.mjs.map} +1 -1
  136. package/dist/{renderer-Cv9CKKWG.mjs → renderer-CP8wLzTU.mjs} +2 -2
  137. package/dist/{renderer-Cv9CKKWG.mjs.map → renderer-CP8wLzTU.mjs.map} +1 -1
  138. package/dist/{renderer-uER8kn7f.mjs → renderer-CT3zkfbf.mjs} +2 -2
  139. package/dist/{renderer-uER8kn7f.mjs.map → renderer-CT3zkfbf.mjs.map} +1 -1
  140. package/dist/{renderer-DNynPM6X.mjs → renderer-Ca1KjNCO.mjs} +2 -2
  141. package/dist/{renderer-DNynPM6X.mjs.map → renderer-Ca1KjNCO.mjs.map} +1 -1
  142. package/dist/renderer-Cj875NuH.mjs +5 -0
  143. package/dist/{renderer-BsrKj6Td.mjs → renderer-Cm0tsbQH.mjs} +2 -2
  144. package/dist/{renderer-BsrKj6Td.mjs.map → renderer-Cm0tsbQH.mjs.map} +1 -1
  145. package/dist/renderer-CnmzJoMv.mjs +5 -0
  146. package/dist/{renderer-Dm57W73p.mjs → renderer-Cqb7PGrI.mjs} +2 -2
  147. package/dist/{renderer-BTwuM9u-.mjs → renderer-CrxwW6VQ.mjs} +3 -3
  148. package/dist/{renderer-BTwuM9u-.mjs.map → renderer-CrxwW6VQ.mjs.map} +1 -1
  149. package/dist/renderer-CtklDaMg.mjs +5 -0
  150. package/dist/{renderer-TfeohPxt.mjs → renderer-Cw6_NL2i.mjs} +3 -3
  151. package/dist/{renderer-TfeohPxt.mjs.map → renderer-Cw6_NL2i.mjs.map} +1 -1
  152. package/dist/{renderer-B10HDC13.mjs → renderer-D-KHHWQD.mjs} +3 -3
  153. package/dist/{renderer-B10HDC13.mjs.map → renderer-D-KHHWQD.mjs.map} +1 -1
  154. package/dist/{renderer-CO9vE3sd.mjs → renderer-D-RhYvVl.mjs} +2 -2
  155. package/dist/{renderer-CO9vE3sd.mjs.map → renderer-D-RhYvVl.mjs.map} +1 -1
  156. package/dist/renderer-D1tK3in_.mjs +5 -0
  157. package/dist/{renderer-BEhZiOT4.mjs → renderer-D2wNFNRf.mjs} +2 -2
  158. package/dist/{renderer-BEhZiOT4.mjs.map → renderer-D2wNFNRf.mjs.map} +1 -1
  159. package/dist/renderer-D2yc9P61.mjs +5 -0
  160. package/dist/renderer-D4v-JvSr.mjs +5 -0
  161. package/dist/renderer-D7WRWDwB.mjs +5 -0
  162. package/dist/{renderer-DzON3wDZ.mjs → renderer-DA8YEo_d.mjs} +3 -3
  163. package/dist/{renderer-DzON3wDZ.mjs.map → renderer-DA8YEo_d.mjs.map} +1 -1
  164. package/dist/{renderer-DYlx7VHo.mjs → renderer-DEjo6dw_.mjs} +2 -2
  165. package/dist/{renderer-DYlx7VHo.mjs.map → renderer-DEjo6dw_.mjs.map} +1 -1
  166. package/dist/renderer-DGvA0tdB.mjs +5 -0
  167. package/dist/{renderer-B3_GddgJ.mjs → renderer-DIEeHiQA.mjs} +2 -2
  168. package/dist/{renderer-B3_GddgJ.mjs.map → renderer-DIEeHiQA.mjs.map} +1 -1
  169. package/dist/{renderer-C4hd6Cqi.mjs → renderer-DNxWOz8Q.mjs} +2 -2
  170. package/dist/{renderer-C4hd6Cqi.mjs.map → renderer-DNxWOz8Q.mjs.map} +1 -1
  171. package/dist/renderer-DO7v5Sdm.mjs +5 -0
  172. package/dist/renderer-DRVvt7-V.mjs +5 -0
  173. package/dist/{renderer-CkTehyRX.mjs → renderer-DVPgWHZw.mjs} +3 -3
  174. package/dist/{renderer-CkTehyRX.mjs.map → renderer-DVPgWHZw.mjs.map} +1 -1
  175. package/dist/{renderer-4nsuReW2.mjs → renderer-DWq9gYRw.mjs} +3 -3
  176. package/dist/{renderer-4nsuReW2.mjs.map → renderer-DWq9gYRw.mjs.map} +1 -1
  177. package/dist/renderer-DYMCd3jL.mjs +5 -0
  178. package/dist/{renderer-DvHi_wXE.mjs → renderer-D_j1WKMD.mjs} +3 -3
  179. package/dist/{renderer-DvHi_wXE.mjs.map → renderer-D_j1WKMD.mjs.map} +1 -1
  180. package/dist/{renderer-CRhEGqW4.mjs → renderer-DcAKDAnS.mjs} +3 -3
  181. package/dist/{renderer-CRhEGqW4.mjs.map → renderer-DcAKDAnS.mjs.map} +1 -1
  182. package/dist/{renderer-DtFZbE1j.mjs → renderer-Dgj46uEU.mjs} +2 -2
  183. package/dist/{renderer-B2IUPjhw.mjs → renderer-DhyMfG1v.mjs} +3 -3
  184. package/dist/{renderer-B2IUPjhw.mjs.map → renderer-DhyMfG1v.mjs.map} +1 -1
  185. package/dist/{renderer-BvBqTAtk.mjs → renderer-Dj2H5JPR.mjs} +3 -3
  186. package/dist/{renderer-BvBqTAtk.mjs.map → renderer-Dj2H5JPR.mjs.map} +1 -1
  187. package/dist/{renderer-CoC64eam.mjs → renderer-DkOuQi84.mjs} +3 -3
  188. package/dist/{renderer-CoC64eam.mjs.map → renderer-DkOuQi84.mjs.map} +1 -1
  189. package/dist/renderer-DmHKw-MM.mjs +5 -0
  190. package/dist/renderer-DoDsuZ6G.mjs +5 -0
  191. package/dist/{renderer-BhcTYhaP.mjs → renderer-Dr0tXA4k.mjs} +3 -3
  192. package/dist/{renderer-BhcTYhaP.mjs.map → renderer-Dr0tXA4k.mjs.map} +1 -1
  193. package/dist/{renderer-BrEeUw7T.mjs → renderer-DtMVitEF.mjs} +2 -2
  194. package/dist/{renderer-BrEeUw7T.mjs.map → renderer-DtMVitEF.mjs.map} +1 -1
  195. package/dist/{renderer-BGchUBW_.mjs → renderer-Dwwnx7Dk.mjs} +2 -2
  196. package/dist/{renderer-BGchUBW_.mjs.map → renderer-Dwwnx7Dk.mjs.map} +1 -1
  197. package/dist/{renderer-zLi2qFGT.mjs → renderer-DzLrvCB2.mjs} +2 -2
  198. package/dist/{renderer-zLi2qFGT.mjs.map → renderer-DzLrvCB2.mjs.map} +1 -1
  199. package/dist/renderer-EpgclS70.mjs +5 -0
  200. package/dist/{renderer-DCrKEVjb.mjs → renderer-FYOL5Za6.mjs} +3 -3
  201. package/dist/{renderer-DCrKEVjb.mjs.map → renderer-FYOL5Za6.mjs.map} +1 -1
  202. package/dist/renderer-GroKiYyK.mjs +5 -0
  203. package/dist/{renderer-DYeNNc_G.mjs → renderer-I0Hh9cLK.mjs} +3 -3
  204. package/dist/{renderer-DYeNNc_G.mjs.map → renderer-I0Hh9cLK.mjs.map} +1 -1
  205. package/dist/renderer-MQ5K_xIS.mjs +5 -0
  206. package/dist/{renderer-BEuXJY-C.mjs → renderer-NRMlYkX6.mjs} +3 -3
  207. package/dist/{renderer-BEuXJY-C.mjs.map → renderer-NRMlYkX6.mjs.map} +1 -1
  208. package/dist/{renderer-YONlI6W-.mjs → renderer-Nnmi8Gt6.mjs} +3 -3
  209. package/dist/{renderer-YONlI6W-.mjs.map → renderer-Nnmi8Gt6.mjs.map} +1 -1
  210. package/dist/renderer-U43SflML.mjs +5 -0
  211. package/dist/renderer-UqOmBgCv.mjs +5 -0
  212. package/dist/{renderer-DiZkZ0Pr.mjs → renderer-W1bVNVR6.mjs} +3 -3
  213. package/dist/{renderer-DiZkZ0Pr.mjs.map → renderer-W1bVNVR6.mjs.map} +1 -1
  214. package/dist/renderer-XLULgJM0.mjs +5 -0
  215. package/dist/{renderer-BOlHW3Mi.mjs → renderer-ZnrEfkYh.mjs} +2 -2
  216. package/dist/{renderer-BOlHW3Mi.mjs.map → renderer-ZnrEfkYh.mjs.map} +1 -1
  217. package/dist/{renderer-GIlQ9lZq.mjs → renderer-_pC-jB9O.mjs} +2 -2
  218. package/dist/{renderer-GIlQ9lZq.mjs.map → renderer-_pC-jB9O.mjs.map} +1 -1
  219. package/dist/{renderer-BM19iK8v.mjs → renderer-iMiYStcW.mjs} +2 -2
  220. package/dist/{renderer-BM19iK8v.mjs.map → renderer-iMiYStcW.mjs.map} +1 -1
  221. package/dist/{renderer-CO4NGvAh.mjs → renderer-jUKdkmG5.mjs} +69 -69
  222. package/dist/{renderer-CO4NGvAh.mjs.map → renderer-jUKdkmG5.mjs.map} +1 -1
  223. package/dist/{renderer-mDBoz0zT.mjs → renderer-k5d7JSbs.mjs} +3 -3
  224. package/dist/{renderer-mDBoz0zT.mjs.map → renderer-k5d7JSbs.mjs.map} +1 -1
  225. package/dist/renderer-lNjxY1GG.mjs +5 -0
  226. package/dist/{renderer-CC22Djgi.mjs → renderer-nHS3Sius.mjs} +3 -3
  227. package/dist/{renderer-CC22Djgi.mjs.map → renderer-nHS3Sius.mjs.map} +1 -1
  228. package/dist/{renderer-CXrnzihz.mjs → renderer-ngmYIIob.mjs} +3 -3
  229. package/dist/{renderer-CXrnzihz.mjs.map → renderer-ngmYIIob.mjs.map} +1 -1
  230. package/dist/{renderer-Bw0O--gW.mjs → renderer-raxwsiGI.mjs} +3 -3
  231. package/dist/{renderer-Bw0O--gW.mjs.map → renderer-raxwsiGI.mjs.map} +1 -1
  232. package/dist/renderer-ukufL7pl.mjs +5 -0
  233. package/dist/renderer-wb0NCKdF.mjs +5 -0
  234. package/dist/{renderer-Bw-_GZVw.mjs → renderer-zRq0j6Xy.mjs} +3 -3
  235. package/dist/{renderer-Bw-_GZVw.mjs.map → renderer-zRq0j6Xy.mjs.map} +1 -1
  236. package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs → renderers-CP8CFWDs-CshljORp.mjs} +2 -2
  237. package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs.map → renderers-CP8CFWDs-CshljORp.mjs.map} +1 -1
  238. package/dist/sam/index.d.mts +3 -3
  239. package/dist/signals/index.d.mts +5 -5
  240. package/dist/signals/index.mjs +4 -4
  241. package/dist/{src-DrP7fGJX.mjs → src-Dy4gnc6w.mjs} +13 -8
  242. package/dist/src-Dy4gnc6w.mjs.map +1 -0
  243. package/package.json +60 -60
  244. package/dist/dist-DtPPPsZV.mjs.map +0 -1
  245. package/dist/index-C2yaponf.d.mts.map +0 -1
  246. package/dist/index-CtKUQ2VG.d.mts.map +0 -1
  247. package/dist/index-a6JrbAK0.d.mts.map +0 -1
  248. package/dist/preview-engine/chunk-5ZS46EFB.mjs +0 -5
  249. package/dist/preview-engine/renderers-ZMMQ7S2A.mjs +0 -228
  250. package/dist/program-BfiB9ttP.mjs.map +0 -1
  251. package/dist/renderer-0rLmztAv.mjs +0 -5
  252. package/dist/renderer-B0pjOXFY.mjs +0 -5
  253. package/dist/renderer-B7J13reL.mjs +0 -5
  254. package/dist/renderer-BPGIKGgl.mjs +0 -5
  255. package/dist/renderer-Bv-Artj1.mjs +0 -5
  256. package/dist/renderer-BvLjbhcL.mjs +0 -5
  257. package/dist/renderer-By6awWaf.mjs +0 -5
  258. package/dist/renderer-C0rvsz7m.mjs +0 -5
  259. package/dist/renderer-CDgud_HB.mjs +0 -5
  260. package/dist/renderer-CDiRF3bG.mjs +0 -6
  261. package/dist/renderer-CIIEQd4B.mjs +0 -5
  262. package/dist/renderer-CJblwOA9.mjs +0 -5
  263. package/dist/renderer-CNMOXtXE.mjs +0 -5
  264. package/dist/renderer-COeSeNGg.mjs +0 -5
  265. package/dist/renderer-CUfElmtZ.mjs +0 -5
  266. package/dist/renderer-CYh2lFoJ.mjs +0 -5
  267. package/dist/renderer-CYtVZYMH.mjs +0 -5
  268. package/dist/renderer-CjxZlkjb.mjs +0 -5
  269. package/dist/renderer-Cpd6TvTC.mjs +0 -5
  270. package/dist/renderer-D3ziOPhX.mjs +0 -5
  271. package/dist/renderer-DL-phtL5.mjs +0 -5
  272. package/dist/renderer-DSnmYnHg.mjs +0 -5
  273. package/dist/renderer-DUGfsT-E.mjs +0 -5
  274. package/dist/renderer-DW5af9x1.mjs +0 -5
  275. package/dist/renderer-DYMrol1t.mjs +0 -5
  276. package/dist/renderer-DekeUHaz.mjs +0 -5
  277. package/dist/renderer-Dt5uyJdZ.mjs +0 -5
  278. package/dist/renderer-Dv_iRIyx.mjs.map +0 -1
  279. package/dist/renderer-DwLQAnaK.mjs +0 -5
  280. package/dist/renderer-IXQP2CWM.mjs +0 -5
  281. package/dist/renderer-K-Pkw63O.mjs +0 -5
  282. package/dist/renderer-MPw2KH9P.mjs +0 -5
  283. package/dist/renderer-RPu8RMav.mjs +0 -5
  284. package/dist/renderer-dCqxd5N2.mjs +0 -5
  285. package/dist/renderer-lhjmE-Fp.mjs +0 -5
  286. package/dist/renderer-u9cmBuvM.mjs +0 -5
  287. package/dist/renderer-vH12jcpz.mjs +0 -5
  288. package/dist/src-DrP7fGJX.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CoC64eam.mjs","names":[],"sources":["../../../nodes/node-channel-splitter/dist/renderers-CBDMTYgr.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_SPLITTER = `\nstruct SplitterUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\tchannelIndex : f32, // 0=Ch1, 1=Ch2, 2=Ch3, 3=Ch4\n\t_pad0 : f32,\n\t_pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : SplitterUniforms;\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn srgb2lin(v: f32) -> f32 {\n\tlet cv = clamp(v, 0.0, 1.0);\n\treturn select(cv / 12.92, pow((cv + 0.055) / 1.055, 2.4), cv > 0.04045);\n}\n\nfn lab_f(t: f32) -> f32 {\n\treturn select(pow(t, 1.0 / 3.0), (7.787 * t) + (16.0 / 116.0), t <= 0.008856);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSample(srcTex, srcSamp, in.uv);\n\tlet cs = u32(u.colorSpace + 0.5);\n\tlet idx = u32(u.channelIndex + 0.5);\n\n\tvar val: f32 = 0.0;\n\n\tif (cs == 0u) { // RGBA\n\t\tif (idx == 0u) { val = c.r; }\n\t\telse if (idx == 1u) { val = c.g; }\n\t\telse if (idx == 2u) { val = c.b; }\n\t\telse { val = c.a; }\n\t} else if (cs == 1u) { // HSLA\n\t\tlet maxV = max(c.r, max(c.g, c.b));\n\t\tlet minV = min(c.r, min(c.g, c.b));\n\t\tlet d = maxV - minV;\n\t\tlet L = (maxV + minV) * 0.5;\n\t\tlet S = select(select(d / (2.0 - maxV - minV), d / (maxV + minV), L < 0.5), 0.0, d < 0.00001);\n\t\tvar H: f32 = 0.0;\n\t\tif (d > 0.00001) {\n\t\t\tif (maxV == c.r) {\n\t\t\t\tH = ((c.g - c.b) / d + select(0.0, 6.0, c.g < c.b)) / 6.0;\n\t\t\t} else if (maxV == c.g) {\n\t\t\t\tH = ((c.b - c.r) / d + 2.0) / 6.0;\n\t\t\t} else {\n\t\t\t\tH = ((c.r - c.g) / d + 4.0) / 6.0;\n\t\t\t}\n\t\t}\n\t\tif (idx == 0u) { val = H; }\n\t\telse if (idx == 1u) { val = S; }\n\t\telse if (idx == 2u) { val = L; }\n\t\telse { val = c.a; }\n\t} else if (cs == 2u) { // CMYK\n\t\tlet K = 1.0 - max(c.r, max(c.g, c.b));\n\t\tif (K >= 1.0 - 0.00001) {\n\t\t\tval = select(0.0, 1.0, idx == 3u);\n\t\t} else {\n\t\t\tlet denom = 1.0 - K;\n\t\t\tif (idx == 0u) { val = (1.0 - c.r - K) / denom; }\n\t\t\telse if (idx == 1u) { val = (1.0 - c.g - K) / denom; }\n\t\t\telse if (idx == 2u) { val = (1.0 - c.b - K) / denom; }\n\t\t\telse { val = K; }\n\t\t}\n\t} else { // LAB\n\t\tlet lr = srgb2lin(c.r);\n\t\tlet lg = srgb2lin(c.g);\n\t\tlet lb = srgb2lin(c.b);\n\n\t\tlet X = lr * 0.4124564 + lg * 0.3575761 + lb * 0.1804375;\n\t\tlet Y = lr * 0.2126729 + lg * 0.7151522 + lb * 0.0721750;\n\t\tlet Z = lr * 0.0193339 + lg * 0.1191920 + lb * 0.9503041;\n\n\t\tlet x = X / 0.95047;\n\t\tlet y = Y / 1.00000;\n\t\tlet z = Z / 1.08883;\n\n\t\tlet fx = lab_f(x);\n\t\tlet fy = lab_f(y);\n\t\tlet fz = lab_f(z);\n\n\t\tlet L_star = 116.0 * fy - 16.0;\n\t\tlet a_star = 500.0 * (fx - fy);\n\t\tlet b_star = 200.0 * (fy - fz);\n\n\t\tlet L_norm = clamp(L_star / 100.0, 0.0, 1.0);\n\t\tlet a_norm = clamp((a_star + 128.0) / 255.0, 0.0, 1.0);\n\t\tlet b_norm = clamp((b_star + 128.0) / 255.0, 0.0, 1.0);\n\n\t\tif (idx == 0u) { val = L_norm; }\n\t\telse if (idx == 1u) { val = a_norm; }\n\t\telse if (idx == 2u) { val = b_norm; }\n\t\telse { val = c.a; }\n\t}\n\n\tval = clamp(val, 0.0, 1.0);\n\treturn vec4<f32>(val, val, val, 1.0);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\ttextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `splitter_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelSplitterShader\",\n\t\t\tcode: WGSL_CHANNEL_SPLITTER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelSplitterPipeline\",\n\t\t\tlayout,\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelSplitterWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetTexture, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelSplitter\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst { view: srcView } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\trenderId: `${props.renderId}-src`\n\t} });\n\targs.pass.end();\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst channelIndex = op.channelIndex ?? 0;\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = channelIndex;\n\tuniformData[2] = 0;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: srcView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst finalPass = beginTargetPass(args);\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelSplitterWebGPURenderer });\n\n//#endregion\nexport { ChannelSplitterWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CBDMTYgr.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DkOuQi84.mjs","names":[],"sources":["../../../nodes/node-channel-splitter/dist/renderers-CBDMTYgr.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_SPLITTER = `\nstruct SplitterUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\tchannelIndex : f32, // 0=Ch1, 1=Ch2, 2=Ch3, 3=Ch4\n\t_pad0 : f32,\n\t_pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : SplitterUniforms;\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn srgb2lin(v: f32) -> f32 {\n\tlet cv = clamp(v, 0.0, 1.0);\n\treturn select(cv / 12.92, pow((cv + 0.055) / 1.055, 2.4), cv > 0.04045);\n}\n\nfn lab_f(t: f32) -> f32 {\n\treturn select(pow(t, 1.0 / 3.0), (7.787 * t) + (16.0 / 116.0), t <= 0.008856);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSample(srcTex, srcSamp, in.uv);\n\tlet cs = u32(u.colorSpace + 0.5);\n\tlet idx = u32(u.channelIndex + 0.5);\n\n\tvar val: f32 = 0.0;\n\n\tif (cs == 0u) { // RGBA\n\t\tif (idx == 0u) { val = c.r; }\n\t\telse if (idx == 1u) { val = c.g; }\n\t\telse if (idx == 2u) { val = c.b; }\n\t\telse { val = c.a; }\n\t} else if (cs == 1u) { // HSLA\n\t\tlet maxV = max(c.r, max(c.g, c.b));\n\t\tlet minV = min(c.r, min(c.g, c.b));\n\t\tlet d = maxV - minV;\n\t\tlet L = (maxV + minV) * 0.5;\n\t\tlet S = select(select(d / (2.0 - maxV - minV), d / (maxV + minV), L < 0.5), 0.0, d < 0.00001);\n\t\tvar H: f32 = 0.0;\n\t\tif (d > 0.00001) {\n\t\t\tif (maxV == c.r) {\n\t\t\t\tH = ((c.g - c.b) / d + select(0.0, 6.0, c.g < c.b)) / 6.0;\n\t\t\t} else if (maxV == c.g) {\n\t\t\t\tH = ((c.b - c.r) / d + 2.0) / 6.0;\n\t\t\t} else {\n\t\t\t\tH = ((c.r - c.g) / d + 4.0) / 6.0;\n\t\t\t}\n\t\t}\n\t\tif (idx == 0u) { val = H; }\n\t\telse if (idx == 1u) { val = S; }\n\t\telse if (idx == 2u) { val = L; }\n\t\telse { val = c.a; }\n\t} else if (cs == 2u) { // CMYK\n\t\tlet K = 1.0 - max(c.r, max(c.g, c.b));\n\t\tif (K >= 1.0 - 0.00001) {\n\t\t\tval = select(0.0, 1.0, idx == 3u);\n\t\t} else {\n\t\t\tlet denom = 1.0 - K;\n\t\t\tif (idx == 0u) { val = (1.0 - c.r - K) / denom; }\n\t\t\telse if (idx == 1u) { val = (1.0 - c.g - K) / denom; }\n\t\t\telse if (idx == 2u) { val = (1.0 - c.b - K) / denom; }\n\t\t\telse { val = K; }\n\t\t}\n\t} else { // LAB\n\t\tlet lr = srgb2lin(c.r);\n\t\tlet lg = srgb2lin(c.g);\n\t\tlet lb = srgb2lin(c.b);\n\n\t\tlet X = lr * 0.4124564 + lg * 0.3575761 + lb * 0.1804375;\n\t\tlet Y = lr * 0.2126729 + lg * 0.7151522 + lb * 0.0721750;\n\t\tlet Z = lr * 0.0193339 + lg * 0.1191920 + lb * 0.9503041;\n\n\t\tlet x = X / 0.95047;\n\t\tlet y = Y / 1.00000;\n\t\tlet z = Z / 1.08883;\n\n\t\tlet fx = lab_f(x);\n\t\tlet fy = lab_f(y);\n\t\tlet fz = lab_f(z);\n\n\t\tlet L_star = 116.0 * fy - 16.0;\n\t\tlet a_star = 500.0 * (fx - fy);\n\t\tlet b_star = 200.0 * (fy - fz);\n\n\t\tlet L_norm = clamp(L_star / 100.0, 0.0, 1.0);\n\t\tlet a_norm = clamp((a_star + 128.0) / 255.0, 0.0, 1.0);\n\t\tlet b_norm = clamp((b_star + 128.0) / 255.0, 0.0, 1.0);\n\n\t\tif (idx == 0u) { val = L_norm; }\n\t\telse if (idx == 1u) { val = a_norm; }\n\t\telse if (idx == 2u) { val = b_norm; }\n\t\telse { val = c.a; }\n\t}\n\n\tval = clamp(val, 0.0, 1.0);\n\treturn vec4<f32>(val, val, val, 1.0);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\ttextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `splitter_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelSplitterShader\",\n\t\t\tcode: WGSL_CHANNEL_SPLITTER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelSplitterPipeline\",\n\t\t\tlayout,\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelSplitterWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetTexture, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelSplitter\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst { view: srcView } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\trenderId: `${props.renderId}-src`\n\t} });\n\targs.pass.end();\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst channelIndex = op.channelIndex ?? 0;\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = channelIndex;\n\tuniformData[2] = 0;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: srcView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst finalPass = beginTargetPass(args);\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelSplitterWebGPURenderer });\n\n//#endregion\nexport { ChannelSplitterWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CBDMTYgr.mjs.map"],"mappings":";;;;;;AAIA,MAAM,kBAAkB;CACvB,MAAM;CACN,MAAM;CACN,MAAM;CACN,KAAK;CACL;AACD,MAAM,wBAAwB;;;;;;;;;;;EAW5B,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyFvB,MAAM,sCAAsC,IAAI,SAAS;AACzD,MAAM,cAAc,IAAI,aAAa,EAAE;AACvC,SAAS,iBAAiB,QAAQ;CACjC,IAAI,MAAM,oBAAoB,IAAI,OAAO;AACzC,KAAI,IAAK,QAAO;AAChB,OAAM;EACL,eAAe,wBAAwB,QAAQ,CAAC,UAAU,CAAC;EAC3D,eAAe,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;EACtE,+BAA+B,IAAI,KAAK;EACxC;AACD,qBAAoB,IAAI,QAAQ,IAAI;AACpC,QAAO;;AAER,SAAS,YAAY,QAAQ,QAAQ;CACpC,MAAM,YAAY,iBAAiB,OAAO;CAC1C,MAAM,MAAM,YAAY;CACxB,IAAI,WAAW,UAAU,cAAc,IAAI,IAAI;AAC/C,KAAI,CAAC,UAAU;EACd,MAAM,SAAS,OAAO,mBAAmB;GACxC,OAAO;GACP,MAAM;GACN,CAAC;EACF,MAAM,SAAS,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,UAAU,eAAe,UAAU,cAAc,EAAE,CAAC;AACpH,aAAW,OAAO,qBAAqB;GACtC,OAAO;GACP;GACA,QAAQ;IACP;IACA,YAAY;IACZ;GACD,UAAU;IACT;IACA,YAAY;IACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB;GACD,WAAW,EAAE,UAAU,kBAAkB;GACzC,CAAC;AACF,YAAU,cAAc,IAAI,KAAK,SAAS;;AAE3C,QAAO;EACN;EACA;EACA;;AAEF,MAAM,gCAAgC,OAAO,SAAS;CACrD,MAAM,EAAE,KAAK,MAAM,eAAe,UAAU;CAC5C,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,qBAAqB,CAAC,GAAI;CACzC,MAAM,cAAc,MAAM,aAAa,WAAW;AAClD,KAAI,CAAC,YAAa;AAClB,MAAK,KAAK;CACV,MAAM,EAAE,MAAM,YAAY,MAAM,mBAAmB,MAAM,aAAa,EAAE,OAAO;EAC9E,GAAG;EACH,cAAc;EACd,UAAU,GAAG,MAAM,SAAS;EAC5B,EAAE,CAAC;AACJ,MAAK,KAAK,KAAK;CACf,MAAM,aAAa,GAAG,cAAc;CACpC,MAAM,eAAe,GAAG,gBAAgB;AACxC,aAAY,KAAK,gBAAgB,eAAe;AAChD,aAAY,KAAK;AACjB,aAAY,KAAK;AACjB,aAAY,KAAK;CACjB,MAAM,gBAAgB,IAAI,SAAS,mBAAmB,YAAY;CAClE,MAAM,EAAE,UAAU,cAAc,YAAY,IAAI,QAAQ,cAAc,OAAO;CAC7E,MAAM,mBAAmB,IAAI,OAAO,gBAAgB;EACnD,QAAQ,UAAU;EAClB,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ,eAAe;GACnC,CAAC;EACF,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,mBAAmB,IAAI,OAAO,gBAAgB;EACnD,QAAQ,UAAU;EAClB,SAAS,CAAC;GACT,SAAS;GACT,UAAU;GACV,EAAE;GACF,SAAS;GACT,UAAU;GACV,CAAC;EACF,CAAC;CACF,MAAM,YAAY,gBAAgB,KAAK;AACvC,WAAU,YAAY,SAAS;AAC/B,WAAU,aAAa,GAAG,iBAAiB;AAC3C,WAAU,aAAa,GAAG,iBAAiB;AAC3C,WAAU,KAAK,GAAG,GAAG,GAAG,EAAE;;AAK3B,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,+BAA+B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist--Uu5bQ_6.mjs";
3
+ import { t as renderers_default } from "./renderer-D_j1WKMD.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist--Uu5bQ_6.mjs";
3
+ import { t as renderers_default } from "./renderer-D-RhYvVl.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-DOL2i2sR.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
- import "./dist-DtPPPsZV.mjs";
4
- import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-D2HT3KcE.mjs";
3
+ import "./dist--Uu5bQ_6.mjs";
4
+ import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-R4T2Tndu.mjs";
5
5
  import { i as OpticalFlowComputePipeline } from "./dist-DgZpN6IK.mjs";
6
6
 
7
7
  //#region ../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs
@@ -205,4 +205,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: DatamoshWebGPURenderer
205
205
 
206
206
  //#endregion
207
207
  export { DatamoshWebGPURenderer, renderers_default as default };
208
- //# sourceMappingURL=renderer-BhcTYhaP.mjs.map
208
+ //# sourceMappingURL=renderer-Dr0tXA4k.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BhcTYhaP.mjs","names":[],"sources":["../../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\nimport { OpticalFlowComputePipeline } from \"@framefields/tensor-webgpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst MOSH_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var moshTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var flowTex : texture_2d<f32>;\n@group(0) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet strength = u.a.x;\n\tlet bleed = u.a.y;\n\tlet inv = u.a.zw;\n\tlet cur0 = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (u.b.x > 0.5) { return cur0; }\n\tlet dims = vec2<f32>(textureDimensions(flowTex));\n\tlet coord = vec2<i32>(clamp(in.uv * dims, vec2<f32>(0.0), dims - 1.0));\n\tlet flow = textureLoad(flowTex, coord, 0).xy;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\t// The old picture moves with the new motion instead of being replaced.\n\tlet moved = textureSampleLevel(moshTex, samp, clamp(in.uv - flow * inv * strength, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\tvar out = mix(moved, cur, bleed);\n\tif (moved.a < 0.01) { out = cur; }\n\treturn out;\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"datamosh_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: MOSH_WGSL,\n\t\tlabel: \"datamosh.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"datamosh\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tflow: new OpticalFlowComputePipeline(device),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height, format) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\th?.prev?.destroy();\n\tconst make = (label, fmt) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: fmt,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"feedback_front\", HISTORY_FORMAT),\n\t\tback: make(\"feedback_back\", HISTORY_FORMAT),\n\t\tprev: make(\"feedback_prev\", format),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [\n\t\t\th.front,\n\t\t\th.back,\n\t\t\t...h.prev ? [h.prev] : []\n\t\t],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepDatamosh(args, h, v, frame, compositionStart, key) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur || !h.prev) return;\n\tconst r = resources(args.ctx.device);\n\tconst { encoder } = args;\n\tconst clean = key || h.frame < 0;\n\tconst flow = clean ? cur.texture : r.flow.execute(h.prev, cur.texture, {}, encoder);\n\tconst uniforms = new Float32Array([\n\t\tv.strength,\n\t\tv.bleed,\n\t\t1 / h.width,\n\t\t1 / h.height,\n\t\tclean ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t]);\n\tdrawFullscreenPass(encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: flow.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tencoder.copyTextureToTexture({ texture: cur.texture }, { texture: h.prev }, [\n\t\th.width,\n\t\th.height,\n\t\t1\n\t]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst DatamoshWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Datamosh\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight, ctx.renderer.format);\n\t{\n\t\tconst v = {\n\t\t\tkeyframes: Array.isArray(raw.keyframes) ? raw.keyframes.map(Math.round) : [],\n\t\t\tstrength: num(raw.strength, 1),\n\t\t\tbleed: Math.min(1, Math.max(0, num(raw.bleed, 0))),\n\t\t\twarmup: Math.max(1, Math.round(num(raw.warmup, 48)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame !== local - 1) {\n\t\t\t\tconst lastKey = Math.max(0, ...v.keyframes.filter((k) => k <= local));\n\t\t\t\tstart = Math.max(lastKey, local - v.warmup);\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepDatamosh(args, h, v, f, compositionStart, f === 0 || v.keyframes.includes(f) || h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DatamoshWebGPURenderer });\n\n//#endregion\nexport { DatamoshWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D-M1-_H_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Dr0tXA4k.mjs","names":[],"sources":["../../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\nimport { OpticalFlowComputePipeline } from \"@framefields/tensor-webgpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst MOSH_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var moshTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var flowTex : texture_2d<f32>;\n@group(0) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet strength = u.a.x;\n\tlet bleed = u.a.y;\n\tlet inv = u.a.zw;\n\tlet cur0 = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (u.b.x > 0.5) { return cur0; }\n\tlet dims = vec2<f32>(textureDimensions(flowTex));\n\tlet coord = vec2<i32>(clamp(in.uv * dims, vec2<f32>(0.0), dims - 1.0));\n\tlet flow = textureLoad(flowTex, coord, 0).xy;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\t// The old picture moves with the new motion instead of being replaced.\n\tlet moved = textureSampleLevel(moshTex, samp, clamp(in.uv - flow * inv * strength, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\tvar out = mix(moved, cur, bleed);\n\tif (moved.a < 0.01) { out = cur; }\n\treturn out;\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"datamosh_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: MOSH_WGSL,\n\t\tlabel: \"datamosh.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"datamosh\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tflow: new OpticalFlowComputePipeline(device),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height, format) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\th?.prev?.destroy();\n\tconst make = (label, fmt) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: fmt,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"feedback_front\", HISTORY_FORMAT),\n\t\tback: make(\"feedback_back\", HISTORY_FORMAT),\n\t\tprev: make(\"feedback_prev\", format),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [\n\t\t\th.front,\n\t\t\th.back,\n\t\t\t...h.prev ? [h.prev] : []\n\t\t],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepDatamosh(args, h, v, frame, compositionStart, key) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur || !h.prev) return;\n\tconst r = resources(args.ctx.device);\n\tconst { encoder } = args;\n\tconst clean = key || h.frame < 0;\n\tconst flow = clean ? cur.texture : r.flow.execute(h.prev, cur.texture, {}, encoder);\n\tconst uniforms = new Float32Array([\n\t\tv.strength,\n\t\tv.bleed,\n\t\t1 / h.width,\n\t\t1 / h.height,\n\t\tclean ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t]);\n\tdrawFullscreenPass(encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: flow.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tencoder.copyTextureToTexture({ texture: cur.texture }, { texture: h.prev }, [\n\t\th.width,\n\t\th.height,\n\t\t1\n\t]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst DatamoshWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Datamosh\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight, ctx.renderer.format);\n\t{\n\t\tconst v = {\n\t\t\tkeyframes: Array.isArray(raw.keyframes) ? raw.keyframes.map(Math.round) : [],\n\t\t\tstrength: num(raw.strength, 1),\n\t\t\tbleed: Math.min(1, Math.max(0, num(raw.bleed, 0))),\n\t\t\twarmup: Math.max(1, Math.round(num(raw.warmup, 48)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame !== local - 1) {\n\t\t\t\tconst lastKey = Math.max(0, ...v.keyframes.filter((k) => k <= local));\n\t\t\t\tstart = Math.max(lastKey, local - v.warmup);\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepDatamosh(args, h, v, f, compositionStart, f === 0 || v.keyframes.includes(f) || h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: DatamoshWebGPURenderer });\n\n//#endregion\nexport { DatamoshWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D-M1-_H_.mjs.map"],"mappings":";;;;;;;AAKA,MAAM,iBAAiB;AACvB,MAAM,YAAY;;;;;;;EAOhB,qBAAqB;;;;;;;;;;;;;;;;;;;AAmBvB,MAAM,YAAY,WAAW,WAAW;CACvC,MAAM,SAAS,wBAAwB,QAAQ;EAC9C;EACA;EACA;EACA;EACA;EACA,EAAE,kBAAkB;CACrB,MAAM,SAAS,OAAO,mBAAmB;EACxC,MAAM;EACN,OAAO;EACP,CAAC;AACF,QAAO;EACN;EACA,UAAU,OAAO,qBAAqB;GACrC,OAAO;GACP,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,OAAO,EAAE,CAAC;GACnE,QAAQ;IACP;IACA,YAAY;IACZ;GACD,UAAU;IACT;IACA,YAAY;IACZ,SAAS,CAAC,EAAE,QAAQ,gBAAgB,CAAC;IACrC;GACD,WAAW,EAAE,UAAU,kBAAkB;GACzC,CAAC;EACF,MAAM,IAAI,2BAA2B,OAAO;EAC5C,SAAS,OAAO,cAAc;GAC7B,WAAW;GACX,WAAW;GACX,CAAC;EACF;EACA;AACF,SAAS,WAAW,QAAQ,QAAQ,OAAO,QAAQ,QAAQ;CAC1D,MAAM,IAAI,OAAO;AACjB,KAAI,KAAK,EAAE,WAAW,UAAU,EAAE,UAAU,SAAS,EAAE,WAAW,OAAQ,QAAO;AACjF,IAAG,MAAM,SAAS;AAClB,IAAG,KAAK,SAAS;AACjB,IAAG,MAAM,SAAS;CAClB,MAAM,QAAQ,OAAO,QAAQ,OAAO,cAAc;EACjD;EACA,MAAM,CAAC,OAAO,OAAO;EACrB,QAAQ;EACR,OAAO,gBAAgB,oBAAoB,gBAAgB,kBAAkB,gBAAgB,WAAW,gBAAgB;EACxH,CAAC;CACF,MAAM,OAAO;EACZ;EACA;EACA;EACA,OAAO,KAAK,kBAAkB,eAAe;EAC7C,MAAM,KAAK,iBAAiB,eAAe;EAC3C,MAAM,KAAK,iBAAiB,OAAO;EACnC,OAAO;EACP;AACD,QAAO,kBAAkB;AACzB,QAAO;;AAER,eAAe,QAAQ,MAAM,OAAO,kBAAkB,GAAG;CACxD,MAAM,QAAQ,KAAK,MAAM,cAAc,WAAW;AAClD,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,mBAAmB,MAAM,OAAO;EACtC,SAAS;GACR,EAAE;GACF,EAAE;GACF,GAAG,EAAE,OAAO,CAAC,EAAE,KAAK,GAAG,EAAE;GACzB;EACD,OAAO;GACN,GAAG,KAAK;GACR,cAAc;GACd;GACA,kBAAkB,mBAAmB;GACrC;EACD,CAAC;;AAEH,SAAS,KAAK,GAAG;CAChB,MAAM,IAAI,EAAE;AACZ,GAAE,QAAQ,EAAE;AACZ,GAAE,OAAO;;AAEV,eAAe,aAAa,MAAM,GAAG,GAAG,OAAO,kBAAkB,KAAK;CACrE,MAAM,MAAM,MAAM,QAAQ,MAAM,OAAO,kBAAkB,EAAE;AAC3D,KAAI,CAAC,OAAO,CAAC,EAAE,KAAM;CACrB,MAAM,IAAI,UAAU,KAAK,IAAI,OAAO;CACpC,MAAM,EAAE,YAAY;CACpB,MAAM,QAAQ,OAAO,EAAE,QAAQ;CAC/B,MAAM,OAAO,QAAQ,IAAI,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,IAAI,SAAS,EAAE,EAAE,QAAQ;CACnF,MAAM,WAAW,IAAI,aAAa;EACjC,EAAE;EACF,EAAE;EACF,IAAI,EAAE;EACN,IAAI,EAAE;EACN,QAAQ,IAAI;EACZ;EACA;EACA;EACA,CAAC;AACF,oBAAmB,SAAS,EAAE,KAAK,YAAY,EAAE,EAAE,UAAU,CAAC,KAAK,IAAI,OAAO,gBAAgB;EAC7F,QAAQ,EAAE;EACV,SAAS;GACR;IACC,SAAS;IACT,UAAU,EAAE,QAAQ,KAAK,IAAI,SAAS,mBAAmB,SAAS,EAAE;IACpE;GACD;IACC,SAAS;IACT,UAAU,EAAE,MAAM,YAAY;IAC9B;GACD;IACC,SAAS;IACT,UAAU,IAAI;IACd;GACD;IACC,SAAS;IACT,UAAU,KAAK,YAAY;IAC3B;GACD;IACC,SAAS;IACT,UAAU,EAAE;IACZ;GACD;EACD,CAAC,CAAC,CAAC;AACJ,SAAQ,qBAAqB,EAAE,SAAS,IAAI,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE;EAC3E,EAAE;EACF,EAAE;EACF;EACA,CAAC;AACF,MAAK,EAAE;AACP,GAAE,QAAQ;;AAEX,SAAS,IAAI,GAAG,UAAU;AACzB,QAAO,OAAO,MAAM,YAAY,OAAO,SAAS,EAAE,GAAG,IAAI;;AAE1D,MAAM,yBAAyB,OAAO,SAAS;CAC9C,MAAM,EAAE,KAAK,MAAM,aAAa,cAAc,UAAU;CACxD,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,cAAc,CAAC,GAAG,QAAQ,gBAAiB;AAC1D,KAAI,CAAC,MAAM,cAAc,WAAW,GAAI;AACxC,MAAK,KAAK;CACV,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,SAAS,EAAE,CAAC;CACvD,MAAM,mBAAmB,KAAK,MAAM,MAAM,oBAAoB,MAAM;CACpE,MAAM,mBAAmB,mBAAmB;CAC5C,MAAM,MAAM,GAAG,OAAO,gBAAgB;EACrC,OAAO;EACP;EACA,MAAM,mBAAmB;EACzB,CAAC;CACF,MAAM,IAAI,WAAW,GAAG,QAAQ,IAAI,QAAQ,aAAa,cAAc,IAAI,SAAS,OAAO;CAC3F;EACC,MAAM,IAAI;GACT,WAAW,MAAM,QAAQ,IAAI,UAAU,GAAG,IAAI,UAAU,IAAI,KAAK,MAAM,GAAG,EAAE;GAC5E,UAAU,IAAI,IAAI,UAAU,EAAE;GAC9B,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;GAClD,QAAQ,KAAK,IAAI,GAAG,KAAK,MAAM,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC;GACpD;AACD,MAAI,EAAE,UAAU,OAAO;GACtB,IAAI,QAAQ;AACZ,OAAI,EAAE,UAAU,QAAQ,GAAG;IAC1B,MAAM,UAAU,KAAK,IAAI,GAAG,GAAG,EAAE,UAAU,QAAQ,MAAM,KAAK,MAAM,CAAC;AACrE,YAAQ,KAAK,IAAI,SAAS,QAAQ,EAAE,OAAO;AAC3C,MAAE,QAAQ;;AAEX,QAAK,IAAI,IAAI,OAAO,KAAK,OAAO,IAAK,OAAM,aAAa,MAAM,GAAG,GAAG,GAAG,kBAAkB,MAAM,KAAK,EAAE,UAAU,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE;;;AAG7I,qBAAoB,MAAM,EAAE,MAAM;;AAKnC,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,wBAAwB,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-D2HT3KcE.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-R4T2Tndu.mjs";
3
3
 
4
4
  //#region ../../nodes/node-selective-color/dist/renderers-BZ3S3Cgo.mjs
5
5
  const deviceResourceCache = /* @__PURE__ */ new WeakMap();
@@ -166,4 +166,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: SelectiveColorWebGPURen
166
166
 
167
167
  //#endregion
168
168
  export { renderers_default as t };
169
- //# sourceMappingURL=renderer-BrEeUw7T.mjs.map
169
+ //# sourceMappingURL=renderer-DtMVitEF.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BrEeUw7T.mjs","names":[],"sources":["../../../nodes/node-selective-color/dist/renderers-BZ3S3Cgo.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_SELECTIVE_COLOR_SHADER = `\nstruct SelectiveColorUniforms {\n\treds : vec4<f32>,\n\tyellows : vec4<f32>,\n\tgreens : vec4<f32>,\n\tcyans : vec4<f32>,\n\tblues : vec4<f32>,\n\tmagentas : vec4<f32>,\n\twhites : vec4<f32>,\n\tneutrals : vec4<f32>,\n\tblacks : vec4<f32>,\n\tmethod : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : SelectiveColorUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn calcAdjustment(cmy: vec3<f32>, adj: vec4<f32>, weight: f32, isAbsolute: bool) -> vec3<f32> {\n\tif (weight <= 0.00001) {\n\t\treturn vec3<f32>(0.0);\n\t}\n\tlet adjC = adj.x;\n\tlet adjM = adj.y;\n\tlet adjY = adj.z;\n\tlet adjK = adj.w;\n\n\tif (isAbsolute) {\n\t\tlet cDelta = adjC + adjK * (1.0 + adjC);\n\t\tlet mDelta = adjM + adjK * (1.0 + adjM);\n\t\tlet yDelta = adjY + adjK * (1.0 + adjY);\n\t\treturn vec3<f32>(cDelta, mDelta, yDelta) * weight;\n\t} else {\n\t\tlet cDelta = ((1.0 + adjK) * (1.0 + adjC) - 1.0) * cmy.x;\n\t\tlet mDelta = ((1.0 + adjK) * (1.0 + adjM) - 1.0) * cmy.y;\n\t\tlet yDelta = ((1.0 + adjK) * (1.0 + adjY) - 1.0) * cmy.z;\n\t\treturn vec3<f32>(cDelta, mDelta, yDelta) * weight;\n\t}\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet rgb = clamp(color.rgb / max(color.a, 0.00001), vec3<f32>(0.0), vec3<f32>(1.0));\n\tlet r = rgb.r;\n\tlet g = rgb.g;\n\tlet b = rgb.b;\n\n\tlet maxVal = max(r, max(g, b));\n\tlet minVal = min(r, min(g, b));\n\n\t// Chromatic weights\n\tlet wRed = max(0.0, r - max(g, b));\n\tlet wYellow = max(0.0, min(r, g) - b);\n\tlet wGreen = max(0.0, g - max(r, b));\n\tlet wCyan = max(0.0, min(g, b) - r);\n\tlet wBlue = max(0.0, b - max(r, g));\n\tlet wMagenta = max(0.0, min(r, b) - g);\n\n\t// Achromatic weights (Whites, Blacks, and true Midtone Neutrals)\n\tlet wWhite = max(0.0, (minVal - 0.5) * 2.0);\n\tlet wBlack = max(0.0, (0.5 - maxVal) * 2.0);\n\tlet wNeutral = max(0.0, 1.0 - (wRed + wYellow + wGreen + wCyan + wBlue + wMagenta + wWhite + wBlack));\n\n\tlet cmy = vec3<f32>(1.0 - r, 1.0 - g, 1.0 - b);\n\tlet isAbs = u.method > 0.5;\n\n\tvar totalDelta = vec3<f32>(0.0);\n\ttotalDelta += calcAdjustment(cmy, u.reds, wRed, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.yellows, wYellow, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.greens, wGreen, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.cyans, wCyan, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.blues, wBlue, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.magentas, wMagenta, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.whites, wWhite, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.neutrals, wNeutral, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.blacks, wBlack, isAbs);\n\n\tlet finalCMY = clamp(cmy + totalDelta, vec3<f32>(0.0), vec3<f32>(1.0));\n\tlet finalRGB = vec3<f32>(1.0 - finalCMY.x, 1.0 - finalCMY.y, 1.0 - finalCMY.z);\n\n\treturn vec4<f32>(finalRGB * color.a, color.a);\n}\n`;\nfunction getSelectiveColorResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\t\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"SelectiveColorPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"selective-color.wgsl\",\n\t\t\t\t\tcode: WGSL_SELECTIVE_COLOR_SHADER\n\t\t\t\t}),\n\t\t\t\tlayouts: [uniformLayout, textureLayout],\n\t\t\t\tformat\n\t\t\t}),\n\t\t\tuniformLayout,\n\t\t\ttextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nfunction packAdjustment(data, offset, adj) {\n\tdata[offset + 0] = (adj?.cyan ?? 0) / 100;\n\tdata[offset + 1] = (adj?.magenta ?? 0) / 100;\n\tdata[offset + 2] = (adj?.yellow ?? 0) / 100;\n\tdata[offset + 3] = (adj?.black ?? 0) / 100;\n}\nconst uniformBufferData = new Float32Array(40);\nconst SelectiveColorWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"SelectiveColor\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tpackAdjustment(uniformBufferData, 0, op.reds);\n\tpackAdjustment(uniformBufferData, 4, op.yellows);\n\tpackAdjustment(uniformBufferData, 8, op.greens);\n\tpackAdjustment(uniformBufferData, 12, op.cyans);\n\tpackAdjustment(uniformBufferData, 16, op.blues);\n\tpackAdjustment(uniformBufferData, 20, op.magentas);\n\tpackAdjustment(uniformBufferData, 24, op.whites);\n\tpackAdjustment(uniformBufferData, 28, op.neutrals);\n\tpackAdjustment(uniformBufferData, 32, op.blacks);\n\tuniformBufferData[36] = op.method === \"Absolute\" ? 1 : 0;\n\tuniformBufferData[37] = 0;\n\tuniformBufferData[38] = 0;\n\tuniformBufferData[39] = 0;\n\tconst { pipeline, uniformLayout, textureLayout } = getSelectiveColorResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer }\n\t\t}]\n\t}), ctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler)]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: SelectiveColorWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BZ3S3Cgo.mjs.map"],"mappings":";;;;AAIA,MAAM,sCAAsC,IAAI,SAAS;AACzD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;EAoBlC,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuEvB,SAAS,2BAA2B,QAAQ,QAAQ;CACnD,IAAI,MAAM,oBAAoB,IAAI,OAAO;AACzC,KAAI,CAAC,KAAK;EACT,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;EAClE,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;AAC7E,QAAM;GACL,UAAU,yBAAyB,QAAQ;IAC1C,OAAO;IACP,QAAQ,OAAO,mBAAmB;KACjC,OAAO;KACP,MAAM;KACN,CAAC;IACF,SAAS,CAAC,eAAe,cAAc;IACvC;IACA,CAAC;GACF;GACA;GACA;AACD,sBAAoB,IAAI,QAAQ,IAAI;;AAErC,QAAO;;AAER,SAAS,eAAe,MAAM,QAAQ,KAAK;AAC1C,MAAK,SAAS,MAAM,KAAK,QAAQ,KAAK;AACtC,MAAK,SAAS,MAAM,KAAK,WAAW,KAAK;AACzC,MAAK,SAAS,MAAM,KAAK,UAAU,KAAK;AACxC,MAAK,SAAS,MAAM,KAAK,SAAS,KAAK;;AAExC,MAAM,oBAAoB,IAAI,aAAa,GAAG;AAC9C,MAAM,+BAA+B,OAAO,SAAS;CACpD,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,oBAAoB,CAAC,MAAM,cAAc,WAAW,GAAI;AACvE,MAAK,KAAK;CACV,MAAM,aAAa,MAAM,aAAa,SAAS;CAC/C,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;AACtE,gBAAe,mBAAmB,GAAG,GAAG,KAAK;AAC7C,gBAAe,mBAAmB,GAAG,GAAG,QAAQ;AAChD,gBAAe,mBAAmB,GAAG,GAAG,OAAO;AAC/C,gBAAe,mBAAmB,IAAI,GAAG,MAAM;AAC/C,gBAAe,mBAAmB,IAAI,GAAG,MAAM;AAC/C,gBAAe,mBAAmB,IAAI,GAAG,SAAS;AAClD,gBAAe,mBAAmB,IAAI,GAAG,OAAO;AAChD,gBAAe,mBAAmB,IAAI,GAAG,SAAS;AAClD,gBAAe,mBAAmB,IAAI,GAAG,OAAO;AAChD,mBAAkB,MAAM,GAAG,WAAW,aAAa,IAAI;AACvD,mBAAkB,MAAM;AACxB,mBAAkB,MAAM;AACxB,mBAAkB,MAAM;CACxB,MAAM,EAAE,UAAU,eAAe,kBAAkB,2BAA2B,IAAI,QAAQ,IAAI,SAAS,OAAO;CAC9G,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,SAAS,IAAI,SAAS,mBAAmB,kBAAkB;CACjE,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;AACF,oBAAmB,SAAS,OAAO,YAAY,EAAE,UAAU,CAAC,IAAI,OAAO,gBAAgB;EACtF,QAAQ;EACR,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ;GACpB,CAAC;EACF,CAAC,EAAE,IAAI,SAAS,eAAe,aAAa,IAAI,QAAQ,eAAe,QAAQ,QAAQ,CAAC,CAAC;AAC1F,qBAAoB,MAAM,QAAQ,MAAM,WAAW,EAAE;;AAKtD,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,8BAA8B,CAAC"}
1
+ {"version":3,"file":"renderer-DtMVitEF.mjs","names":[],"sources":["../../../nodes/node-selective-color/dist/renderers-BZ3S3Cgo.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_SELECTIVE_COLOR_SHADER = `\nstruct SelectiveColorUniforms {\n\treds : vec4<f32>,\n\tyellows : vec4<f32>,\n\tgreens : vec4<f32>,\n\tcyans : vec4<f32>,\n\tblues : vec4<f32>,\n\tmagentas : vec4<f32>,\n\twhites : vec4<f32>,\n\tneutrals : vec4<f32>,\n\tblacks : vec4<f32>,\n\tmethod : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : SelectiveColorUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn calcAdjustment(cmy: vec3<f32>, adj: vec4<f32>, weight: f32, isAbsolute: bool) -> vec3<f32> {\n\tif (weight <= 0.00001) {\n\t\treturn vec3<f32>(0.0);\n\t}\n\tlet adjC = adj.x;\n\tlet adjM = adj.y;\n\tlet adjY = adj.z;\n\tlet adjK = adj.w;\n\n\tif (isAbsolute) {\n\t\tlet cDelta = adjC + adjK * (1.0 + adjC);\n\t\tlet mDelta = adjM + adjK * (1.0 + adjM);\n\t\tlet yDelta = adjY + adjK * (1.0 + adjY);\n\t\treturn vec3<f32>(cDelta, mDelta, yDelta) * weight;\n\t} else {\n\t\tlet cDelta = ((1.0 + adjK) * (1.0 + adjC) - 1.0) * cmy.x;\n\t\tlet mDelta = ((1.0 + adjK) * (1.0 + adjM) - 1.0) * cmy.y;\n\t\tlet yDelta = ((1.0 + adjK) * (1.0 + adjY) - 1.0) * cmy.z;\n\t\treturn vec3<f32>(cDelta, mDelta, yDelta) * weight;\n\t}\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet rgb = clamp(color.rgb / max(color.a, 0.00001), vec3<f32>(0.0), vec3<f32>(1.0));\n\tlet r = rgb.r;\n\tlet g = rgb.g;\n\tlet b = rgb.b;\n\n\tlet maxVal = max(r, max(g, b));\n\tlet minVal = min(r, min(g, b));\n\n\t// Chromatic weights\n\tlet wRed = max(0.0, r - max(g, b));\n\tlet wYellow = max(0.0, min(r, g) - b);\n\tlet wGreen = max(0.0, g - max(r, b));\n\tlet wCyan = max(0.0, min(g, b) - r);\n\tlet wBlue = max(0.0, b - max(r, g));\n\tlet wMagenta = max(0.0, min(r, b) - g);\n\n\t// Achromatic weights (Whites, Blacks, and true Midtone Neutrals)\n\tlet wWhite = max(0.0, (minVal - 0.5) * 2.0);\n\tlet wBlack = max(0.0, (0.5 - maxVal) * 2.0);\n\tlet wNeutral = max(0.0, 1.0 - (wRed + wYellow + wGreen + wCyan + wBlue + wMagenta + wWhite + wBlack));\n\n\tlet cmy = vec3<f32>(1.0 - r, 1.0 - g, 1.0 - b);\n\tlet isAbs = u.method > 0.5;\n\n\tvar totalDelta = vec3<f32>(0.0);\n\ttotalDelta += calcAdjustment(cmy, u.reds, wRed, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.yellows, wYellow, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.greens, wGreen, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.cyans, wCyan, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.blues, wBlue, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.magentas, wMagenta, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.whites, wWhite, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.neutrals, wNeutral, isAbs);\n\ttotalDelta += calcAdjustment(cmy, u.blacks, wBlack, isAbs);\n\n\tlet finalCMY = clamp(cmy + totalDelta, vec3<f32>(0.0), vec3<f32>(1.0));\n\tlet finalRGB = vec3<f32>(1.0 - finalCMY.x, 1.0 - finalCMY.y, 1.0 - finalCMY.z);\n\n\treturn vec4<f32>(finalRGB * color.a, color.a);\n}\n`;\nfunction getSelectiveColorResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\t\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tres = {\n\t\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\t\tlabel: \"SelectiveColorPipeline\",\n\t\t\t\tmodule: device.createShaderModule({\n\t\t\t\t\tlabel: \"selective-color.wgsl\",\n\t\t\t\t\tcode: WGSL_SELECTIVE_COLOR_SHADER\n\t\t\t\t}),\n\t\t\t\tlayouts: [uniformLayout, textureLayout],\n\t\t\t\tformat\n\t\t\t}),\n\t\t\tuniformLayout,\n\t\t\ttextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nfunction packAdjustment(data, offset, adj) {\n\tdata[offset + 0] = (adj?.cyan ?? 0) / 100;\n\tdata[offset + 1] = (adj?.magenta ?? 0) / 100;\n\tdata[offset + 2] = (adj?.yellow ?? 0) / 100;\n\tdata[offset + 3] = (adj?.black ?? 0) / 100;\n}\nconst uniformBufferData = new Float32Array(40);\nconst SelectiveColorWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"SelectiveColor\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tpackAdjustment(uniformBufferData, 0, op.reds);\n\tpackAdjustment(uniformBufferData, 4, op.yellows);\n\tpackAdjustment(uniformBufferData, 8, op.greens);\n\tpackAdjustment(uniformBufferData, 12, op.cyans);\n\tpackAdjustment(uniformBufferData, 16, op.blues);\n\tpackAdjustment(uniformBufferData, 20, op.magentas);\n\tpackAdjustment(uniformBufferData, 24, op.whites);\n\tpackAdjustment(uniformBufferData, 28, op.neutrals);\n\tpackAdjustment(uniformBufferData, 32, op.blacks);\n\tuniformBufferData[36] = op.method === \"Absolute\" ? 1 : 0;\n\tuniformBufferData[37] = 0;\n\tuniformBufferData[38] = 0;\n\tuniformBufferData[39] = 0;\n\tconst { pipeline, uniformLayout, textureLayout } = getSelectiveColorResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer }\n\t\t}]\n\t}), ctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler)]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: SelectiveColorWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BZ3S3Cgo.mjs.map"],"mappings":";;;;AAIA,MAAM,sCAAsC,IAAI,SAAS;AACzD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;EAoBlC,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuEvB,SAAS,2BAA2B,QAAQ,QAAQ;CACnD,IAAI,MAAM,oBAAoB,IAAI,OAAO;AACzC,KAAI,CAAC,KAAK;EACT,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;EAClE,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;AAC7E,QAAM;GACL,UAAU,yBAAyB,QAAQ;IAC1C,OAAO;IACP,QAAQ,OAAO,mBAAmB;KACjC,OAAO;KACP,MAAM;KACN,CAAC;IACF,SAAS,CAAC,eAAe,cAAc;IACvC;IACA,CAAC;GACF;GACA;GACA;AACD,sBAAoB,IAAI,QAAQ,IAAI;;AAErC,QAAO;;AAER,SAAS,eAAe,MAAM,QAAQ,KAAK;AAC1C,MAAK,SAAS,MAAM,KAAK,QAAQ,KAAK;AACtC,MAAK,SAAS,MAAM,KAAK,WAAW,KAAK;AACzC,MAAK,SAAS,MAAM,KAAK,UAAU,KAAK;AACxC,MAAK,SAAS,MAAM,KAAK,SAAS,KAAK;;AAExC,MAAM,oBAAoB,IAAI,aAAa,GAAG;AAC9C,MAAM,+BAA+B,OAAO,SAAS;CACpD,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,oBAAoB,CAAC,MAAM,cAAc,WAAW,GAAI;AACvE,MAAK,KAAK;CACV,MAAM,aAAa,MAAM,aAAa,SAAS;CAC/C,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;AACtE,gBAAe,mBAAmB,GAAG,GAAG,KAAK;AAC7C,gBAAe,mBAAmB,GAAG,GAAG,QAAQ;AAChD,gBAAe,mBAAmB,GAAG,GAAG,OAAO;AAC/C,gBAAe,mBAAmB,IAAI,GAAG,MAAM;AAC/C,gBAAe,mBAAmB,IAAI,GAAG,MAAM;AAC/C,gBAAe,mBAAmB,IAAI,GAAG,SAAS;AAClD,gBAAe,mBAAmB,IAAI,GAAG,OAAO;AAChD,gBAAe,mBAAmB,IAAI,GAAG,SAAS;AAClD,gBAAe,mBAAmB,IAAI,GAAG,OAAO;AAChD,mBAAkB,MAAM,GAAG,WAAW,aAAa,IAAI;AACvD,mBAAkB,MAAM;AACxB,mBAAkB,MAAM;AACxB,mBAAkB,MAAM;CACxB,MAAM,EAAE,UAAU,eAAe,kBAAkB,2BAA2B,IAAI,QAAQ,IAAI,SAAS,OAAO;CAC9G,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,SAAS,IAAI,SAAS,mBAAmB,kBAAkB;CACjE,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;AACF,oBAAmB,SAAS,OAAO,YAAY,EAAE,UAAU,CAAC,IAAI,OAAO,gBAAgB;EACtF,QAAQ;EACR,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ;GACpB,CAAC;EACF,CAAC,EAAE,IAAI,SAAS,eAAe,aAAa,IAAI,QAAQ,eAAe,QAAQ,QAAQ,CAAC,CAAC;AAC1F,qBAAoB,MAAM,QAAQ,MAAM,WAAW,EAAE;;AAKtD,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,8BAA8B,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Cn as resolveString, xn as resolveNumber } from "./dist-C8XSqfTx.mjs";
2
2
  import { a as isHandleConnected, n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-DtPPPsZV.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist--Uu5bQ_6.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-fade/dist/renderers-C_aLLJ4x.mjs
6
6
  const PARAM_ORDER = ["fadeInDuration", "fadeOutDuration"];
@@ -173,4 +173,4 @@ var renderers_default = defineRenderer({ audioProcessor: fadeAudioProcessor });
173
173
 
174
174
  //#endregion
175
175
  export { renderers_default as t };
176
- //# sourceMappingURL=renderer-BGchUBW_.mjs.map
176
+ //# sourceMappingURL=renderer-Dwwnx7Dk.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BGchUBW_.mjs","names":[],"sources":["../../../nodes/node-audio-fade/dist/renderers-C_aLLJ4x.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\"fadeInDuration\", \"fadeOutDuration\"];\nconst FADE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n fadeInDuration : f32,\n fadeOutDuration : f32,\n fadeInCurve : f32,\n fadeOutCurve : f32,\n clipDuration : f32,\n hasFadeInDurationSig : f32,\n hasFadeOutDurationSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n pad4 : 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] = samplesProcessed\n@group(0) @binding(4) var<storage, read> fadeInDurationSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> fadeOutDurationSignal : array<f32>;\n\nfn applyCurve(p: f32, curve: f32) -> f32 {\n let clampedP = max(0.0f, min(p, 1.0f));\n if (curve == 1.0f) { // exponential\n return clampedP * clampedP;\n }\n if (curve == 2.0f) { // scurve\n return clampedP * clampedP * (3.0f - 2.0f * clampedP);\n }\n return clampedP; // linear\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 for (var index = 0u; index < numSamples; index = index + 1u) {\n let t = u.baseTime + f32(index) / u.sampleRate;\n var gain = 1.0f;\n\n var effFadeIn = u.fadeInDuration;\n if (u.hasFadeInDurationSig > 0.5f) {\n effFadeIn = fadeInDurationSignal[index];\n }\n effFadeIn = clamp(effFadeIn, 0.0f, 60.0f);\n\n var effFadeOut = u.fadeOutDuration;\n if (u.hasFadeOutDurationSig > 0.5f) {\n effFadeOut = fadeOutDurationSignal[index];\n }\n effFadeOut = clamp(effFadeOut, 0.0f, 60.0f);\n\n if (effFadeIn > 0.0f && t < effFadeIn) {\n let p = t / effFadeIn;\n gain = gain * applyCurve(p, u.fadeInCurve);\n }\n\n if (effFadeOut > 0.0f && t > u.clipDuration - effFadeOut) {\n let p = (u.clipDuration - t) / effFadeOut;\n gain = gain * applyCurve(p, u.fadeOutCurve);\n }\n\n gain = clamp(gain, 0.0f, 1.0f);\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 * gain;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n\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 // Dummy reference to keep state binding active\n state[0] = state[0];\n}\n`;\nconst getCurveCode = (curve) => {\n\tif (curve === \"exponential\") return 1;\n\tif (curve === \"scurve\") return 2;\n\treturn 0;\n};\nconst fadeAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Fade.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst fadeInDuration = Math.max(0, resolveNumber(op.fadeInDuration, 0));\n\tconst fadeOutDuration = Math.max(0, resolveNumber(op.fadeOutDuration, 0));\n\tconst fadeInCurve = resolveString(op.fadeInCurve, \"linear\");\n\tconst fadeOutCurve = resolveString(op.fadeOutCurve, \"linear\");\n\tconst durationMs = virtualMedia.metadata?.durationMs ?? ctx?.durationMs ?? (typeof op.durationFrames === \"number\" && (ctx.fps ?? 24) > 0 ? op.durationFrames / (ctx.fps ?? 24) * 1e3 : void 0);\n\tconst clipDuration = durationMs !== void 0 && durationMs > 0 ? durationMs / 1e3 : numSamples / sampleRate;\n\tlet fadeIn = fadeInDuration;\n\tlet fadeOut = fadeOutDuration;\n\tif (clipDuration > 0 && fadeIn + fadeOut > clipDuration) {\n\t\tconst half = clipDuration / 2;\n\t\tfadeIn = Math.min(fadeIn, half);\n\t\tfadeOut = Math.min(fadeOut, half);\n\t}\n\tconst hasFadeInDurationSig = isHandleConnected(op, \"fadeInDurationHandleId\") ? 1 : 0;\n\tconst hasFadeOutDurationSig = isHandleConnected(op, \"fadeOutDurationHandleId\") ? 1 : 0;\n\tconst nodeId = op.id || \"audio-fade\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst segmentStartSec = Math.max(0, (ctx.elapsedMs ?? 0) / 1e3);\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, FADE_SHADER_TEMPLATE, (chunkTimeSec) => {\n\t\tconst mediaTimeSec = segmentStartSec + Math.max(0, chunkTimeSec - frame / fps);\n\t\treturn [\n\t\t\tsampleRate,\n\t\t\tfadeIn,\n\t\t\tfadeOut,\n\t\t\tgetCurveCode(fadeInCurve),\n\t\t\tgetCurveCode(fadeOutCurve),\n\t\t\tclipDuration,\n\t\t\thasFadeInDurationSig,\n\t\t\thasFadeOutDurationSig,\n\t\t\tmediaTimeSec,\n\t\t\tframe,\n\t\t\tnumSamples,\n\t\t\tnumChannels,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t];\n\t}, 16, 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: fadeAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C_aLLJ4x.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc,CAAC,kBAAkB,kBAAkB;AACzD,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgHnC,MAAM,gBAAgB,UAAU;AAC/B,KAAI,UAAU,cAAe,QAAO;AACpC,KAAI,UAAU,SAAU,QAAO;AAC/B,QAAO;;AAER,MAAM,qBAAqB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC7E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,iBAAiB,KAAK,IAAI,GAAG,cAAc,GAAG,gBAAgB,EAAE,CAAC;CACvE,MAAM,kBAAkB,KAAK,IAAI,GAAG,cAAc,GAAG,iBAAiB,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,GAAG,aAAa,SAAS;CAC3D,MAAM,eAAe,cAAc,GAAG,cAAc,SAAS;CAC7D,MAAM,aAAa,aAAa,UAAU,cAAc,KAAK,eAAe,OAAO,GAAG,mBAAmB,aAAa,IAAI,OAAO,MAAM,IAAI,GAAG,kBAAkB,IAAI,OAAO,MAAM,MAAM,KAAK;CAC5L,MAAM,eAAe,eAAe,KAAK,KAAK,aAAa,IAAI,aAAa,MAAM,aAAa;CAC/F,IAAI,SAAS;CACb,IAAI,UAAU;AACd,KAAI,eAAe,KAAK,SAAS,UAAU,cAAc;EACxD,MAAM,OAAO,eAAe;AAC5B,WAAS,KAAK,IAAI,QAAQ,KAAK;AAC/B,YAAU,KAAK,IAAI,SAAS,KAAK;;CAElC,MAAM,uBAAuB,kBAAkB,IAAI,yBAAyB,GAAG,IAAI;CACnF,MAAM,wBAAwB,kBAAkB,IAAI,0BAA0B,GAAG,IAAI;CACrF,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,KAAK,IAAI,IAAI,IAAI,aAAa,KAAK,IAAI;AAC/D,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,uBAAuB,iBAAiB;EAC9I,MAAM,eAAe,kBAAkB,KAAK,IAAI,GAAG,eAAe,QAAQ,IAAI;AAC9E,SAAO;GACN;GACA;GACA;GACA,aAAa,YAAY;GACzB,aAAa,aAAa;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;IACC,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,oBAAoB,CAAC"}
1
+ {"version":3,"file":"renderer-Dwwnx7Dk.mjs","names":[],"sources":["../../../nodes/node-audio-fade/dist/renderers-C_aLLJ4x.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\"fadeInDuration\", \"fadeOutDuration\"];\nconst FADE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n fadeInDuration : f32,\n fadeOutDuration : f32,\n fadeInCurve : f32,\n fadeOutCurve : f32,\n clipDuration : f32,\n hasFadeInDurationSig : f32,\n hasFadeOutDurationSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n pad4 : 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] = samplesProcessed\n@group(0) @binding(4) var<storage, read> fadeInDurationSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> fadeOutDurationSignal : array<f32>;\n\nfn applyCurve(p: f32, curve: f32) -> f32 {\n let clampedP = max(0.0f, min(p, 1.0f));\n if (curve == 1.0f) { // exponential\n return clampedP * clampedP;\n }\n if (curve == 2.0f) { // scurve\n return clampedP * clampedP * (3.0f - 2.0f * clampedP);\n }\n return clampedP; // linear\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 for (var index = 0u; index < numSamples; index = index + 1u) {\n let t = u.baseTime + f32(index) / u.sampleRate;\n var gain = 1.0f;\n\n var effFadeIn = u.fadeInDuration;\n if (u.hasFadeInDurationSig > 0.5f) {\n effFadeIn = fadeInDurationSignal[index];\n }\n effFadeIn = clamp(effFadeIn, 0.0f, 60.0f);\n\n var effFadeOut = u.fadeOutDuration;\n if (u.hasFadeOutDurationSig > 0.5f) {\n effFadeOut = fadeOutDurationSignal[index];\n }\n effFadeOut = clamp(effFadeOut, 0.0f, 60.0f);\n\n if (effFadeIn > 0.0f && t < effFadeIn) {\n let p = t / effFadeIn;\n gain = gain * applyCurve(p, u.fadeInCurve);\n }\n\n if (effFadeOut > 0.0f && t > u.clipDuration - effFadeOut) {\n let p = (u.clipDuration - t) / effFadeOut;\n gain = gain * applyCurve(p, u.fadeOutCurve);\n }\n\n gain = clamp(gain, 0.0f, 1.0f);\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 * gain;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n\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 // Dummy reference to keep state binding active\n state[0] = state[0];\n}\n`;\nconst getCurveCode = (curve) => {\n\tif (curve === \"exponential\") return 1;\n\tif (curve === \"scurve\") return 2;\n\treturn 0;\n};\nconst fadeAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Fade.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst fadeInDuration = Math.max(0, resolveNumber(op.fadeInDuration, 0));\n\tconst fadeOutDuration = Math.max(0, resolveNumber(op.fadeOutDuration, 0));\n\tconst fadeInCurve = resolveString(op.fadeInCurve, \"linear\");\n\tconst fadeOutCurve = resolveString(op.fadeOutCurve, \"linear\");\n\tconst durationMs = virtualMedia.metadata?.durationMs ?? ctx?.durationMs ?? (typeof op.durationFrames === \"number\" && (ctx.fps ?? 24) > 0 ? op.durationFrames / (ctx.fps ?? 24) * 1e3 : void 0);\n\tconst clipDuration = durationMs !== void 0 && durationMs > 0 ? durationMs / 1e3 : numSamples / sampleRate;\n\tlet fadeIn = fadeInDuration;\n\tlet fadeOut = fadeOutDuration;\n\tif (clipDuration > 0 && fadeIn + fadeOut > clipDuration) {\n\t\tconst half = clipDuration / 2;\n\t\tfadeIn = Math.min(fadeIn, half);\n\t\tfadeOut = Math.min(fadeOut, half);\n\t}\n\tconst hasFadeInDurationSig = isHandleConnected(op, \"fadeInDurationHandleId\") ? 1 : 0;\n\tconst hasFadeOutDurationSig = isHandleConnected(op, \"fadeOutDurationHandleId\") ? 1 : 0;\n\tconst nodeId = op.id || \"audio-fade\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst segmentStartSec = Math.max(0, (ctx.elapsedMs ?? 0) / 1e3);\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, FADE_SHADER_TEMPLATE, (chunkTimeSec) => {\n\t\tconst mediaTimeSec = segmentStartSec + Math.max(0, chunkTimeSec - frame / fps);\n\t\treturn [\n\t\t\tsampleRate,\n\t\t\tfadeIn,\n\t\t\tfadeOut,\n\t\t\tgetCurveCode(fadeInCurve),\n\t\t\tgetCurveCode(fadeOutCurve),\n\t\t\tclipDuration,\n\t\t\thasFadeInDurationSig,\n\t\t\thasFadeOutDurationSig,\n\t\t\tmediaTimeSec,\n\t\t\tframe,\n\t\t\tnumSamples,\n\t\t\tnumChannels,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t];\n\t}, 16, 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: fadeAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C_aLLJ4x.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc,CAAC,kBAAkB,kBAAkB;AACzD,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgHnC,MAAM,gBAAgB,UAAU;AAC/B,KAAI,UAAU,cAAe,QAAO;AACpC,KAAI,UAAU,SAAU,QAAO;AAC/B,QAAO;;AAER,MAAM,qBAAqB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC7E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,iBAAiB,KAAK,IAAI,GAAG,cAAc,GAAG,gBAAgB,EAAE,CAAC;CACvE,MAAM,kBAAkB,KAAK,IAAI,GAAG,cAAc,GAAG,iBAAiB,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,GAAG,aAAa,SAAS;CAC3D,MAAM,eAAe,cAAc,GAAG,cAAc,SAAS;CAC7D,MAAM,aAAa,aAAa,UAAU,cAAc,KAAK,eAAe,OAAO,GAAG,mBAAmB,aAAa,IAAI,OAAO,MAAM,IAAI,GAAG,kBAAkB,IAAI,OAAO,MAAM,MAAM,KAAK;CAC5L,MAAM,eAAe,eAAe,KAAK,KAAK,aAAa,IAAI,aAAa,MAAM,aAAa;CAC/F,IAAI,SAAS;CACb,IAAI,UAAU;AACd,KAAI,eAAe,KAAK,SAAS,UAAU,cAAc;EACxD,MAAM,OAAO,eAAe;AAC5B,WAAS,KAAK,IAAI,QAAQ,KAAK;AAC/B,YAAU,KAAK,IAAI,SAAS,KAAK;;CAElC,MAAM,uBAAuB,kBAAkB,IAAI,yBAAyB,GAAG,IAAI;CACnF,MAAM,wBAAwB,kBAAkB,IAAI,0BAA0B,GAAG,IAAI;CACrF,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,KAAK,IAAI,IAAI,IAAI,aAAa,KAAK,IAAI;AAC/D,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,uBAAuB,iBAAiB;EAC9I,MAAM,eAAe,kBAAkB,KAAK,IAAI,GAAG,eAAe,QAAQ,IAAI;AAC9E,SAAO;GACN;GACA;GACA;GACA,aAAa,YAAY;GACzB,aAAa,aAAa;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;IACC,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,oBAAoB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { c as resolveHandleParam } from "./renderer-BuvKGwk3.mjs";
2
2
  import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BSKAbyea.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTextureView, l as fragmentBindGroupLayout, m as texturesLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-D2HT3KcE.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTextureView, l as fragmentBindGroupLayout, m as texturesLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-R4T2Tndu.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-shadows-highlights/dist/renderers-CCz2R7ss.mjs
@@ -498,4 +498,4 @@ var renderers_default = { WebGPURenderer };
498
498
 
499
499
  //#endregion
500
500
  export { renderers_default as n, WebGPURenderer as t };
501
- //# sourceMappingURL=renderer-zLi2qFGT.mjs.map
501
+ //# sourceMappingURL=renderer-DzLrvCB2.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-zLi2qFGT.mjs","names":[],"sources":["../../../nodes/node-shadows-highlights/dist/renderers-CCz2R7ss.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst 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${FULLSCREEN_QUAD_WGSL}\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 = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tconst signalTextureLayout = texturesLayout(device, 8);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_SHADOWS_HIGHLIGHTS_UNIFORMS }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"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) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\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 { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tif (shadowAmountRes.val <= 0 && !shadowAmountRes.hasStaticSig && highlightAmountRes.val <= 0 && !highlightAmountRes.hasStaticSig && midtoneContrastRes.val === 0 && !midtoneContrastRes.hasStaticSig) {\n\t\tdrawTextureToTarget(args, tmpTex, op.opacity ?? 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, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst 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\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateBindGroup(tmpTex, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tshadowsHighlightsUniformData[0] = 0;\n\tshadowsHighlightsUniformData[1] = 1;\n\tshadowsHighlightsUniformData[10] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(shadowsHighlightsUniformData);\n\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateBindGroup(outTex1, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { 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-CCz2R7ss.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DzLrvCB2.mjs","names":[],"sources":["../../../nodes/node-shadows-highlights/dist/renderers-CCz2R7ss.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst 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${FULLSCREEN_QUAD_WGSL}\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 = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tconst signalTextureLayout = texturesLayout(device, 8);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_SHADOWS_HIGHLIGHTS_UNIFORMS }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"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) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\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 { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tif (shadowAmountRes.val <= 0 && !shadowAmountRes.hasStaticSig && highlightAmountRes.val <= 0 && !highlightAmountRes.hasStaticSig && midtoneContrastRes.val === 0 && !midtoneContrastRes.hasStaticSig) {\n\t\tdrawTextureToTarget(args, tmpTex, op.opacity ?? 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, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst 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\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateBindGroup(tmpTex, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tshadowsHighlightsUniformData[0] = 0;\n\tshadowsHighlightsUniformData[1] = 1;\n\tshadowsHighlightsUniformData[10] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(shadowsHighlightsUniformData);\n\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateBindGroup(outTex1, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { 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-CCz2R7ss.mjs.map"],"mappings":";;;;;;AAKA,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,aAAa;AACnB,MAAM,0BAA0B,eAAe,CAAC,MAAM,gBAAgB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;CAC5G,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,oBAAoB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE;CACpE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,gBAAgB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE;CAChE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,mBAAmB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;CAClE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,uBAAuB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE;CACvE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,mBAAmB,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,GAAG,EAAE;CACnE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,mBAAmB,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;CACrE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,mBAAmB,EAAE,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;CACrE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,OAAO;AACV,MAAM,oCAAoC,wBAAwB;AAClE,MAAM,gCAAgC,EAAE,MAAM,CAAC,mBAAmB,kBAAkB,CAAC;AACrF,MAAM,mCAAmC,kCAAkC,OAAO;CACjF,IAAI,EAAE,QAAQ,oBAAoB;CAClC,UAAU,EAAE,SAAS,CAAC,UAAU;CAChC,CAAC;AACF,MAAM,iCAAiC,kCAAkC,MAAM,EAAE,CAAC;AAsHlF,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0CvC,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0MvB,MAAM,sCAAsC,IAAI,SAAS;AACzD,MAAM,+BAA+B,IAAI,aAAa,GAAG;AACzD,SAAS,8BAA8B,QAAQ,cAAc;CAC5D,MAAM,SAAS,oBAAoB,IAAI,OAAO;AAC9C,KAAI,OAAQ,QAAO;CACnB,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAClE,MAAM,gBAAgB,wBAAwB,QAAQ;EACrD;EACA;EACA;EACA,CAAC;CACF,MAAM,sBAAsB,eAAe,QAAQ,EAAE;CACrD,MAAM,MAAM;EACX;EACA;EACA;EACA,UAAU,yBAAyB,QAAQ;GAC1C,QAAQ,OAAO,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;GAC7E,SAAS,OAAO,qBAAqB,EAAE,kBAAkB;IACxD;IACA;IACA;IACA,EAAE,CAAC;GACJ,QAAQ;GACR,CAAC;EACF;AACD,qBAAoB,IAAI,QAAQ,IAAI;AACpC,QAAO;;AAER,MAAM,iBAAiB,OAAO,SAAS;CACtC,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,uBAAuB,CAAC,GAAI;CAC3C,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,UAAU,MAAM,cAAc,WAAW,OAAO,GAAG,SAAS,OAAO,KAAK,GAAG,OAAO,CAAC,KAAK,SAAS,MAAM,YAAY;CACzH,MAAM,gBAAgB,UAAU,aAAa,WAAW,GAAG,WAAW,QAAQ,mBAAmB,GAAG,QAAQ,UAAU,aAAa,UAAU,SAAS;CACtJ,MAAM,kBAAkB,aAAa,GAAG,sBAAsB,OAAO,GAAG,gBAAgB,EAAE,EAAE,GAAG,WAAW;CAC1G,MAAM,sBAAsB,aAAa,GAAG,0BAA0B,OAAO,GAAG,oBAAoB,GAAG,EAAE,GAAG,IAAI;CAChH,MAAM,kBAAkB,aAAa,GAAG,sBAAsB,OAAO,GAAG,gBAAgB,GAAG,EAAE,YAAY,WAAW;CACpH,MAAM,qBAAqB,aAAa,GAAG,yBAAyB,OAAO,GAAG,mBAAmB,EAAE,EAAE,GAAG,WAAW;CACnH,MAAM,yBAAyB,aAAa,GAAG,6BAA6B,OAAO,GAAG,uBAAuB,GAAG,EAAE,GAAG,IAAI;CACzH,MAAM,qBAAqB,aAAa,GAAG,yBAAyB,OAAO,GAAG,mBAAmB,GAAG,EAAE,YAAY,WAAW;CAC7H,MAAM,qBAAqB,aAAa,GAAG,yBAAyB,OAAO,GAAG,mBAAmB,EAAE,EAAE,MAAM,IAAI;CAC/G,MAAM,qBAAqB,aAAa,GAAG,yBAAyB,OAAO,GAAG,mBAAmB,EAAE,EAAE,MAAM,IAAI;CAC/G,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;AACtE,KAAI,gBAAgB,OAAO,KAAK,CAAC,gBAAgB,gBAAgB,mBAAmB,OAAO,KAAK,CAAC,mBAAmB,gBAAgB,mBAAmB,QAAQ,KAAK,CAAC,mBAAmB,cAAc;AACrM,sBAAoB,MAAM,QAAQ,GAAG,WAAW,EAAE;AAClD;;CAED,MAAM,EAAE,UAAU,eAAe,SAAS,eAAe,SAAS,qBAAqB,cAAc,8BAA8B,IAAI,QAAQ,IAAI,SAAS,OAAO;CACnK,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;CAC3E,MAAM,gBAAgB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,MAAM,iBAAiB,KAAK,WAAW,kBAAkB,eAAe,KAAK,GAAG,OAAO,GAAG,SAAS;CACnG,MAAM,mBAAmB,cAAc,iBAAiB,oBAAoB;CAC5E,MAAM,uBAAuB,cAAc,qBAAqB,yBAAyB;CACzF,MAAM,mBAAmB,cAAc,iBAAiB,oBAAoB;CAC5E,MAAM,sBAAsB,cAAc,oBAAoB,uBAAuB;CACrF,MAAM,0BAA0B,cAAc,wBAAwB,4BAA4B;CAClG,MAAM,sBAAsB,cAAc,oBAAoB,uBAAuB;CACrF,MAAM,sBAAsB,cAAc,oBAAoB,uBAAuB;CACrF,MAAM,sBAAsB,cAAc,oBAAoB,uBAAuB;CACrF,MAAM,mBAAmB,UAAU,gBAAgB,IAAI,OAAO,gBAAgB;EAC7E,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU,SAAS,YAAY;IAC/B;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU,YAAY,YAAY;IAClC;GACD;EACD,CAAC;AACF,8BAA6B,KAAK,gBAAgB;AAClD,8BAA6B,KAAK,mBAAmB;AACrD,8BAA6B,KAAK,gBAAgB;AAClD,8BAA6B,KAAK,oBAAoB;AACtD,8BAA6B,KAAK,mBAAmB;AACrD,8BAA6B,KAAK,uBAAuB;AACzD,8BAA6B,KAAK,mBAAmB;AACrD,8BAA6B,KAAK,mBAAmB;AACrD,8BAA6B,MAAM;AACnC,8BAA6B,MAAM;AACnC,8BAA6B,MAAM,gBAAgB,eAAe,IAAI;AACtE,8BAA6B,MAAM,oBAAoB,eAAe,IAAI;AAC1E,8BAA6B,MAAM,gBAAgB,eAAe,IAAI;AACtE,8BAA6B,MAAM,mBAAmB,eAAe,IAAI;AACzE,8BAA6B,MAAM,uBAAuB,eAAe,IAAI;AAC7E,8BAA6B,MAAM,mBAAmB,eAAe,IAAI;AACzE,8BAA6B,MAAM,mBAAmB,eAAe,IAAI;AACzE,8BAA6B,MAAM,mBAAmB,eAAe,IAAI;CACzE,MAAM,UAAU,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC/D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC/D;EACA;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,eAAe,IAAI,OAAO,gBAAgB;EAC/C,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;EACD,CAAC;AACF,8BAA6B,KAAK;AAClC,8BAA6B,KAAK;AAClC,8BAA6B,MAAM;CACnC,MAAM,UAAU,IAAI,SAAS,mBAAmB,6BAA6B;AAC7E,oBAAmB,SAAS,QAAQ,YAAY,EAAE,UAAU;EAC3D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,SAAS;IAC7B,CAAC;GACF,CAAC;EACF,gBAAgB,QAAQ,OAAO;EAC/B;EACA,CAAC;AACF,8BAA6B,KAAK;AAClC,8BAA6B,KAAK;AAClC,8BAA6B,MAAM;CACnC,MAAM,UAAU,IAAI,SAAS,mBAAmB,6BAA6B;AAC7E,oBAAmB,SAAS,QAAQ,YAAY,EAAE,UAAU;EAC3D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,SAAS;IAC7B,CAAC;GACF,CAAC;EACF,gBAAgB,SAAS,OAAO;EAChC;EACA,CAAC;AACF,qBAAoB,MAAM,SAAS,GAAG,WAAW,EAAE;;AAKpD,IAAI,oBAAoB,EAAE,gBAAgB"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist--Uu5bQ_6.mjs";
3
+ import { n as renderers_default, t as rendererNode } from "./renderer-B0yVUOPP.mjs";
4
+
5
+ export { renderers_default as default, rendererNode };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-DOL2i2sR.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
- import "./dist-DtPPPsZV.mjs";
4
- import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-D2HT3KcE.mjs";
3
+ import "./dist--Uu5bQ_6.mjs";
4
+ import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-R4T2Tndu.mjs";
5
5
 
6
6
  //#region ../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs
7
7
  const HISTORY_FORMAT = "rgba16float";
@@ -212,4 +212,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer })
212
212
 
213
213
  //#endregion
214
214
  export { TrailsWebGPURenderer, renderers_default as default };
215
- //# sourceMappingURL=renderer-DCrKEVjb.mjs.map
215
+ //# sourceMappingURL=renderer-FYOL5Za6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DCrKEVjb.mjs","names":[],"sources":["../../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst TRAILS_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var historyTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// Hue rotation in YIQ: linear, so it works on premultiplied color.\nfn hueRotate(c : vec3<f32>, angle : f32) -> vec3<f32> {\n\tlet yiq = mat3x3<f32>(0.299, 0.596, 0.211, 0.587, -0.274, -0.523, 0.114, -0.322, 0.312) * c;\n\tlet cs = cos(angle);\n\tlet sn = sin(angle);\n\tlet rot = vec3<f32>(yiq.x, yiq.y * cs - yiq.z * sn, yiq.y * sn + yiq.z * cs);\n\treturn mat3x3<f32>(1.0, 1.0, 1.0, 0.956, -0.272, -1.106, 0.621, -0.647, 1.703) * rot;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet decay = u.a.x;\n\tlet mode = u.a.y;\n\tlet zoom = max(u.a.z, 1e-3);\n\tlet angle = u.a.w;\n\tlet offset = u.b.xy;\n\tlet hue = u.b.z;\n\tlet fresh = u.b.w;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (fresh > 0.5) { return cur; }\n\tlet c = in.uv - 0.5;\n\tlet cs = cos(-angle);\n\tlet sn = sin(-angle);\n\tlet src = vec2<f32>(c.x * cs - c.y * sn, c.x * sn + c.y * cs) / zoom + 0.5 - offset;\n\tvar hist = vec4<f32>(0.0);\n\tif (all(src >= vec2<f32>(0.0)) && all(src <= vec2<f32>(1.0))) {\n\t\thist = textureSampleLevel(historyTex, samp, src, 0.0);\n\t}\n\tif (hue != 0.0) { hist = vec4<f32>(max(hueRotate(hist.rgb, hue), vec3<f32>(0.0)), hist.a); }\n\thist *= decay;\n\tif (mode < 0.5) { return cur + hist * (1.0 - cur.a); }\n\tif (mode < 1.5) { return vec4<f32>(cur.rgb + hist.rgb, min(cur.a + hist.a, 1.0)); }\n\tif (mode < 2.5) { return max(cur, hist); }\n\t// blend: a running average, so opaque footage shows its own echoes.\n\treturn mix(cur, hist / max(decay, 1e-4), decay);\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"trails_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: TRAILS_WGSL,\n\t\tlabel: \"trails.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"trails\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\tconst make = (label) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: HISTORY_FORMAT,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"trails_front\"),\n\t\tback: make(\"trails_back\"),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [h.front, h.back],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepTrails(args, h, v, frame, compositionStart, fresh) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur) return;\n\tconst r = resources(args.ctx.device);\n\tconst uniforms = new Float32Array([\n\t\tv.decay,\n\t\t{\n\t\t\tover: 0,\n\t\t\tadd: 1,\n\t\t\tmax: 2,\n\t\t\tblend: 3\n\t\t}[v.mode] ?? 0,\n\t\tv.zoom,\n\t\tv.rotation * Math.PI / 180,\n\t\tv.offsetX / h.width,\n\t\tv.offsetY / h.height,\n\t\tv.hueShift * Math.PI / 180,\n\t\tfresh ? 1 : 0\n\t]);\n\tdrawFullscreenPass(args.encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst TrailsWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Trails\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight);\n\t{\n\t\tconst v = {\n\t\t\tdecay: Math.min(1, Math.max(0, num(raw.decay, .9))),\n\t\t\tmode: raw.mode ?? \"blend\",\n\t\t\tzoom: num(raw.zoom, 1),\n\t\t\trotation: num(raw.rotation, 0),\n\t\t\toffsetX: num(raw.offsetX, 0),\n\t\t\toffsetY: num(raw.offsetY, 0),\n\t\t\thueShift: num(raw.hueShift, 0),\n\t\t\twarmup: Math.max(0, Math.round(num(raw.warmup, 60)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame === local - 1) start = local;\n\t\t\telse {\n\t\t\t\tconst needed = v.decay > 0 && v.decay < 1 ? Math.ceil(Math.log(.005) / Math.log(v.decay)) : v.warmup;\n\t\t\t\tstart = Math.max(0, local - Math.min(v.warmup, needed));\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepTrails(args, h, v, f, compositionStart, h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer });\n\n//#endregion\nexport { TrailsWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C37o-6Mg.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-FYOL5Za6.mjs","names":[],"sources":["../../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst TRAILS_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var historyTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// Hue rotation in YIQ: linear, so it works on premultiplied color.\nfn hueRotate(c : vec3<f32>, angle : f32) -> vec3<f32> {\n\tlet yiq = mat3x3<f32>(0.299, 0.596, 0.211, 0.587, -0.274, -0.523, 0.114, -0.322, 0.312) * c;\n\tlet cs = cos(angle);\n\tlet sn = sin(angle);\n\tlet rot = vec3<f32>(yiq.x, yiq.y * cs - yiq.z * sn, yiq.y * sn + yiq.z * cs);\n\treturn mat3x3<f32>(1.0, 1.0, 1.0, 0.956, -0.272, -1.106, 0.621, -0.647, 1.703) * rot;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet decay = u.a.x;\n\tlet mode = u.a.y;\n\tlet zoom = max(u.a.z, 1e-3);\n\tlet angle = u.a.w;\n\tlet offset = u.b.xy;\n\tlet hue = u.b.z;\n\tlet fresh = u.b.w;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (fresh > 0.5) { return cur; }\n\tlet c = in.uv - 0.5;\n\tlet cs = cos(-angle);\n\tlet sn = sin(-angle);\n\tlet src = vec2<f32>(c.x * cs - c.y * sn, c.x * sn + c.y * cs) / zoom + 0.5 - offset;\n\tvar hist = vec4<f32>(0.0);\n\tif (all(src >= vec2<f32>(0.0)) && all(src <= vec2<f32>(1.0))) {\n\t\thist = textureSampleLevel(historyTex, samp, src, 0.0);\n\t}\n\tif (hue != 0.0) { hist = vec4<f32>(max(hueRotate(hist.rgb, hue), vec3<f32>(0.0)), hist.a); }\n\thist *= decay;\n\tif (mode < 0.5) { return cur + hist * (1.0 - cur.a); }\n\tif (mode < 1.5) { return vec4<f32>(cur.rgb + hist.rgb, min(cur.a + hist.a, 1.0)); }\n\tif (mode < 2.5) { return max(cur, hist); }\n\t// blend: a running average, so opaque footage shows its own echoes.\n\treturn mix(cur, hist / max(decay, 1e-4), decay);\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"trails_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: TRAILS_WGSL,\n\t\tlabel: \"trails.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"trails\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\tconst make = (label) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: HISTORY_FORMAT,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"trails_front\"),\n\t\tback: make(\"trails_back\"),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [h.front, h.back],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepTrails(args, h, v, frame, compositionStart, fresh) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur) return;\n\tconst r = resources(args.ctx.device);\n\tconst uniforms = new Float32Array([\n\t\tv.decay,\n\t\t{\n\t\t\tover: 0,\n\t\t\tadd: 1,\n\t\t\tmax: 2,\n\t\t\tblend: 3\n\t\t}[v.mode] ?? 0,\n\t\tv.zoom,\n\t\tv.rotation * Math.PI / 180,\n\t\tv.offsetX / h.width,\n\t\tv.offsetY / h.height,\n\t\tv.hueShift * Math.PI / 180,\n\t\tfresh ? 1 : 0\n\t]);\n\tdrawFullscreenPass(args.encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst TrailsWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Trails\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight);\n\t{\n\t\tconst v = {\n\t\t\tdecay: Math.min(1, Math.max(0, num(raw.decay, .9))),\n\t\t\tmode: raw.mode ?? \"blend\",\n\t\t\tzoom: num(raw.zoom, 1),\n\t\t\trotation: num(raw.rotation, 0),\n\t\t\toffsetX: num(raw.offsetX, 0),\n\t\t\toffsetY: num(raw.offsetY, 0),\n\t\t\thueShift: num(raw.hueShift, 0),\n\t\t\twarmup: Math.max(0, Math.round(num(raw.warmup, 60)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame === local - 1) start = local;\n\t\t\telse {\n\t\t\t\tconst needed = v.decay > 0 && v.decay < 1 ? Math.ceil(Math.log(.005) / Math.log(v.decay)) : v.warmup;\n\t\t\t\tstart = Math.max(0, local - Math.min(v.warmup, needed));\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepTrails(args, h, v, f, compositionStart, h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer });\n\n//#endregion\nexport { TrailsWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C37o-6Mg.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist--Uu5bQ_6.mjs";
3
+ import { t as renderers_default } from "./renderer-Nnmi8Gt6.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
- import { Hn as signalRegistry, W as lutStore } from "./dist-DtPPPsZV.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-D2HT3KcE.mjs";
2
+ import { Hn as signalRegistry, W as lutStore } from "./dist--Uu5bQ_6.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-R4T2Tndu.mjs";
4
4
 
5
5
  //#region ../../nodes/node-apply-lut/dist/renderers-BrWmp6fW.mjs
6
6
  const LUT_3D_SHADER = `
@@ -219,4 +219,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: LutWebGPURenderer });
219
219
 
220
220
  //#endregion
221
221
  export { renderers_default as t };
222
- //# sourceMappingURL=renderer-DYeNNc_G.mjs.map
222
+ //# sourceMappingURL=renderer-I0Hh9cLK.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DYeNNc_G.mjs","names":[],"sources":["../../../nodes/node-apply-lut/dist/renderers-BrWmp6fW.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { lutStore, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst LUT_3D_SHADER = `\nstruct LutUniforms {\n\tintensity : f32,\n\tlutSize : f32,\n\thasSignal : f32,\n\tpad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : LutUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var lutTex : texture_3d<f32>;\n@group(2) @binding(1) var lutSamp : sampler;\n@group(3) @binding(0) var signalTex : texture_2d<f32>;\n@group(3) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet inputColor = textureSampleLevel(tex, samp, in.uv, 0.0);\n\t\n\t// Coordinate adjustment to sample from texel centers\n\tlet uvw = inputColor.rgb * ((u.lutSize - 1.0) / u.lutSize) + vec3<f32>(0.5 / u.lutSize);\n\tlet mappedColor = textureSampleLevel(lutTex, lutSamp, uvw, 0.0);\n\t\n\tvar activeIntensity = u.intensity;\n\tif (u.hasSignal > 0.5) {\n\t\tactiveIntensity = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n\t}\n\t\n\tlet finalRgb = inputColor.rgb + activeIntensity * (mappedColor.rgb - inputColor.rgb);\n\treturn vec4<f32>(finalRgb * inputColor.a, inputColor.a);\n}\n`;\nconst LUT_1D_SHADER = `\nstruct LutUniforms {\n\tintensity : f32,\n\tlutSize : f32,\n\thasSignal : f32,\n\tpad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : LutUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var lutTex : texture_1d<f32>;\n@group(2) @binding(1) var lutSamp : sampler;\n@group(3) @binding(0) var signalTex : texture_2d<f32>;\n@group(3) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet inputColor = textureSampleLevel(tex, samp, in.uv, 0.0);\n\t\n\tlet rCoord = inputColor.r * ((u.lutSize - 1.0) / u.lutSize) + (0.5 / u.lutSize);\n\tlet gCoord = inputColor.g * ((u.lutSize - 1.0) / u.lutSize) + (0.5 / u.lutSize);\n\tlet bCoord = inputColor.b * ((u.lutSize - 1.0) / u.lutSize) + (0.5 / u.lutSize);\n\t\n\tlet mappedR = textureSampleLevel(lutTex, lutSamp, rCoord, 0.0).r;\n\tlet mappedG = textureSampleLevel(lutTex, lutSamp, gCoord, 0.0).g;\n\tlet mappedB = textureSampleLevel(lutTex, lutSamp, bCoord, 0.0).b;\n\t\n\tvar activeIntensity = u.intensity;\n\tif (u.hasSignal > 0.5) {\n\t\tactiveIntensity = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n\t}\n\t\n\tlet finalRgb = inputColor.rgb + activeIntensity * (vec3<f32>(mappedR, mappedG, mappedB) - inputColor.rgb);\n\treturn vec4<f32>(finalRgb * inputColor.a, inputColor.a);\n}\n`;\nconst lutUniformData = new Float32Array(4);\nconst getDeviceLayouts = perDevice((device) => ({\n\tlutUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tlutTextureLayout3D: fragmentBindGroupLayout(device, [{ texture: {\n\t\tviewDimension: \"3d\",\n\t\tsampleType: \"float\"\n\t} }, \"sampler\"]),\n\tlutTextureLayout1D: fragmentBindGroupLayout(device, [{ texture: {\n\t\tviewDimension: \"1d\",\n\t\tsampleType: \"float\"\n\t} }, \"sampler\"]),\n\tsignalTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getLutResources(device, format, type) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `lut_${type}_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst shaderCode = type === \"3D\" ? LUT_3D_SHADER : LUT_1D_SHADER;\n\t\tconst lutModule = device.createShaderModule({\n\t\t\tlabel: `lut_${type.toLowerCase()}_${format}.wgsl`,\n\t\t\tcode: shaderCode\n\t\t});\n\t\tconst currentLutLayout = type === \"3D\" ? layouts.lutTextureLayout3D : layouts.lutTextureLayout1D;\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `LutPipeline_${type}_${format}`,\n\t\t\tmodule: lutModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.lutUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tcurrentLutLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tlutPipeline: pipeline,\n\t\tlutUniformLayout: layouts.lutUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tlutTextureLayout: type === \"3D\" ? layouts.lutTextureLayout3D : layouts.lutTextureLayout1D,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst LutWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ApplyLUT\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst lutUrl = op.lutUrl;\n\tif (!lutUrl) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intensityInput = op.intensityHandleId ? op.inputs?.[op.intensityHandleId] : null;\n\tconst hasSignal = !!(intensityInput?.connectionValid && intensityInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? intensityInput?.outputItem?.data : null;\n\tlet intensity = 1;\n\tlet hasStaticSignal = false;\n\tif (!hasSignal) if (intensityInput?.connectionValid && intensityInput.outputItem?.type === \"Number\") intensity = Number(intensityInput.outputItem.data ?? 1);\n\telse intensity = Number(op.intensity ?? 1);\n\telse if (sd && typeof sd === \"object\") {\n\t\tintensity = Number(sd.offset ?? 1);\n\t\thasStaticSignal = true;\n\t}\n\tintensity = Math.max(0, Math.min(10, intensity));\n\tlet lut = lutStore.get(lutUrl, ctx.device);\n\tif (!lut) {\n\t\tif ((props.isHeadless ?? (typeof window === \"undefined\" || globalThis.__IS_HEADLESS_RENDERER__)) || props.forceWait) try {\n\t\t\tlut = await lutStore.getOrLoad(lutUrl, ctx.device);\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof DOMException && err.name === \"AbortError\") && !(err && typeof err === \"object\" && \"name\" in err && err.name === \"AbortError\")) console.error(\"[ApplyLUT] Failed to load LUT synchronously:\", err);\n\t\t}\n\t\telse lutStore.getOrLoad(lutUrl, ctx.device).catch((err) => {\n\t\t\tif (err instanceof DOMException && err.name === \"AbortError\" || err && typeof err === \"object\" && \"name\" in err && err.name === \"AbortError\") return;\n\t\t\tconsole.error(\"[ApplyLUT] Failed to load LUT in background:\", err);\n\t\t});\n\t\tif (!lut && lutUrl.startsWith(\"runtime://lut/\")) {\n\t\t\tconst prefix = lutUrl.substring(0, lutUrl.lastIndexOf(\"-\") + 1);\n\t\t\tif (prefix) lut = lutStore.getAnyMatching(prefix, ctx.device);\n\t\t}\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tif (!lut) {\n\t\tdrawTextureToTarget(args, tmpTex, op.opacity ?? 1);\n\t\treturn;\n\t}\n\tconst { lutPipeline: pipeline, lutUniformLayout: uLayout, singleTextureLayout: tLayout, lutTextureLayout: lLayout, signalTextureLayout: sigLayout } = getLutResources(ctx.device, ctx.renderer.format, lut.type);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tlet signalView;\n\tif (hasStaticSignal) {\n\t\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\t\tsignalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, sd.nodeId ?? \"lut_intensity_sig\", elapsedSeconds, durationSeconds, sd, width, height, props.renderId, frame, fps);\n\t} else signalView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlutUniformData[0] = intensity;\n\tlutUniformData[1] = lut.size;\n\tlutUniformData[2] = hasStaticSignal ? 1 : 0;\n\tlutUniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(lutUniformData);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: lLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: lut.texture.createView()\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t}),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: LutWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BrWmp6fW.mjs.map"],"mappings":";;;;;AAKA,MAAM,gBAAgB;;;;;;;;;;;;;;;EAepB,qBAAqB;;;;;;;;;;;;;;;;;;AAkBvB,MAAM,gBAAgB;;;;;;;;;;;;;;;EAepB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;AAsBvB,MAAM,iBAAiB,IAAI,aAAa,EAAE;AAC1C,MAAM,mBAAmB,WAAW,YAAY;CAC/C,kBAAkB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAC9D,qBAAqB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;CAC5E,oBAAoB,wBAAwB,QAAQ,CAAC,EAAE,SAAS;EAC/D,eAAe;EACf,YAAY;EACZ,EAAE,EAAE,UAAU,CAAC;CAChB,oBAAoB,wBAAwB,QAAQ,CAAC,EAAE,SAAS;EAC/D,eAAe;EACf,YAAY;EACZ,EAAE,EAAE,UAAU,CAAC;CAChB,qBAAqB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;CAC5E,+BAA+B,IAAI,KAAK;CACxC,EAAE;AACH,SAAS,gBAAgB,QAAQ,QAAQ,MAAM;CAC9C,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,WAAW,OAAO,KAAK,GAAG;CAChC,IAAI,WAAW,QAAQ,cAAc,IAAI,SAAS;AAClD,KAAI,CAAC,UAAU;EACd,MAAM,aAAa,SAAS,OAAO,gBAAgB;EACnD,MAAM,YAAY,OAAO,mBAAmB;GAC3C,OAAO,OAAO,KAAK,aAAa,CAAC,GAAG,OAAO;GAC3C,MAAM;GACN,CAAC;EACF,MAAM,mBAAmB,SAAS,OAAO,QAAQ,qBAAqB,QAAQ;AAC9E,aAAW,yBAAyB,QAAQ;GAC3C,OAAO,eAAe,KAAK,GAAG;GAC9B,QAAQ;GACR,SAAS;IACR,QAAQ;IACR,QAAQ;IACR;IACA,QAAQ;IACR;GACD;GACA,CAAC;AACF,UAAQ,cAAc,IAAI,UAAU,SAAS;;AAE9C,QAAO;EACN,aAAa;EACb,kBAAkB,QAAQ;EAC1B,qBAAqB,QAAQ;EAC7B,kBAAkB,SAAS,OAAO,QAAQ,qBAAqB,QAAQ;EACvE,qBAAqB,QAAQ;EAC7B;;AAEF,MAAM,oBAAoB,OAAO,SAAS;CACzC,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,cAAc,CAAC,GAAI;CAClC,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;CACjB,MAAM,SAAS,GAAG;AAClB,KAAI,CAAC,OAAQ;AACb,MAAK,KAAK;CACV,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,iBAAiB,GAAG,oBAAoB,GAAG,SAAS,GAAG,qBAAqB;CAClF,MAAM,YAAY,CAAC,EAAE,gBAAgB,mBAAmB,eAAe,YAAY,SAAS;CAC5F,MAAM,KAAK,YAAY,gBAAgB,YAAY,OAAO;CAC1D,IAAI,YAAY;CAChB,IAAI,kBAAkB;AACtB,KAAI,CAAC,UAAW,KAAI,gBAAgB,mBAAmB,eAAe,YAAY,SAAS,SAAU,aAAY,OAAO,eAAe,WAAW,QAAQ,EAAE;KACvJ,aAAY,OAAO,GAAG,aAAa,EAAE;UACjC,MAAM,OAAO,OAAO,UAAU;AACtC,cAAY,OAAO,GAAG,UAAU,EAAE;AAClC,oBAAkB;;AAEnB,aAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,UAAU,CAAC;CAChD,IAAI,MAAM,SAAS,IAAI,QAAQ,IAAI,OAAO;AAC1C,KAAI,CAAC,KAAK;AACT,OAAK,MAAM,eAAe,OAAO,WAAW,eAAe,WAAW,8BAA8B,MAAM,UAAW,KAAI;AACxH,SAAM,MAAM,SAAS,UAAU,QAAQ,IAAI,OAAO;WAC1C,KAAK;AACb,OAAI,EAAE,eAAe,gBAAgB,IAAI,SAAS,iBAAiB,EAAE,OAAO,OAAO,QAAQ,YAAY,UAAU,OAAO,IAAI,SAAS,cAAe,SAAQ,MAAM,gDAAgD,IAAI;;MAElN,UAAS,UAAU,QAAQ,IAAI,OAAO,CAAC,OAAO,QAAQ;AAC1D,OAAI,eAAe,gBAAgB,IAAI,SAAS,gBAAgB,OAAO,OAAO,QAAQ,YAAY,UAAU,OAAO,IAAI,SAAS,aAAc;AAC9I,WAAQ,MAAM,gDAAgD,IAAI;IACjE;AACF,MAAI,CAAC,OAAO,OAAO,WAAW,iBAAiB,EAAE;GAChD,MAAM,SAAS,OAAO,UAAU,GAAG,OAAO,YAAY,IAAI,GAAG,EAAE;AAC/D,OAAI,OAAQ,OAAM,SAAS,eAAe,QAAQ,IAAI,OAAO;;;CAG/D,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;AACtE,KAAI,CAAC,KAAK;AACT,sBAAoB,MAAM,QAAQ,GAAG,WAAW,EAAE;AAClD;;CAED,MAAM,EAAE,aAAa,UAAU,kBAAkB,SAAS,qBAAqB,SAAS,kBAAkB,SAAS,qBAAqB,cAAc,gBAAgB,IAAI,QAAQ,IAAI,SAAS,QAAQ,IAAI,KAAK;CAChN,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,IAAI;AACJ,KAAI,iBAAiB;EACpB,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;AAC3E,eAAa,eAAe,yBAAyB,IAAI,QAAQ,SAAS,GAAG,UAAU,qBAAqB,gBAAgB,iBAAiB,IAAI,OAAO,QAAQ,MAAM,UAAU,OAAO,IAAI;OACrL,cAAa,eAAe,uBAAuB,IAAI,OAAO;AACrE,gBAAe,KAAK;AACpB,gBAAe,KAAK,IAAI;AACxB,gBAAe,KAAK,kBAAkB,IAAI;AAC1C,gBAAe,KAAK;CACpB,MAAM,gBAAgB,IAAI,SAAS,mBAAmB,eAAe;AACrE,oBAAmB,SAAS,OAAO,YAAY,EAAE,UAAU;EAC1D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,eAAe;IACnC,CAAC;GACF,CAAC;EACF,IAAI,SAAS,eAAe,aAAa,IAAI,QAAQ,SAAS,QAAQ,QAAQ;EAC9E,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,IAAI,QAAQ,YAAY;IAClC,EAAE;IACF,SAAS;IACT,UAAU;IACV,CAAC;GACF,CAAC;EACF,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU;IACV,EAAE;IACF,SAAS;IACT,UAAU;IACV,CAAC;GACF,CAAC;EACF,CAAC;AACF,qBAAoB,MAAM,QAAQ,GAAG,WAAW,EAAE;;AAKnD,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,mBAAmB,CAAC"}
1
+ {"version":3,"file":"renderer-I0Hh9cLK.mjs","names":[],"sources":["../../../nodes/node-apply-lut/dist/renderers-BrWmp6fW.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { lutStore, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst LUT_3D_SHADER = `\nstruct LutUniforms {\n\tintensity : f32,\n\tlutSize : f32,\n\thasSignal : f32,\n\tpad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : LutUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var lutTex : texture_3d<f32>;\n@group(2) @binding(1) var lutSamp : sampler;\n@group(3) @binding(0) var signalTex : texture_2d<f32>;\n@group(3) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet inputColor = textureSampleLevel(tex, samp, in.uv, 0.0);\n\t\n\t// Coordinate adjustment to sample from texel centers\n\tlet uvw = inputColor.rgb * ((u.lutSize - 1.0) / u.lutSize) + vec3<f32>(0.5 / u.lutSize);\n\tlet mappedColor = textureSampleLevel(lutTex, lutSamp, uvw, 0.0);\n\t\n\tvar activeIntensity = u.intensity;\n\tif (u.hasSignal > 0.5) {\n\t\tactiveIntensity = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n\t}\n\t\n\tlet finalRgb = inputColor.rgb + activeIntensity * (mappedColor.rgb - inputColor.rgb);\n\treturn vec4<f32>(finalRgb * inputColor.a, inputColor.a);\n}\n`;\nconst LUT_1D_SHADER = `\nstruct LutUniforms {\n\tintensity : f32,\n\tlutSize : f32,\n\thasSignal : f32,\n\tpad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : LutUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var lutTex : texture_1d<f32>;\n@group(2) @binding(1) var lutSamp : sampler;\n@group(3) @binding(0) var signalTex : texture_2d<f32>;\n@group(3) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet inputColor = textureSampleLevel(tex, samp, in.uv, 0.0);\n\t\n\tlet rCoord = inputColor.r * ((u.lutSize - 1.0) / u.lutSize) + (0.5 / u.lutSize);\n\tlet gCoord = inputColor.g * ((u.lutSize - 1.0) / u.lutSize) + (0.5 / u.lutSize);\n\tlet bCoord = inputColor.b * ((u.lutSize - 1.0) / u.lutSize) + (0.5 / u.lutSize);\n\t\n\tlet mappedR = textureSampleLevel(lutTex, lutSamp, rCoord, 0.0).r;\n\tlet mappedG = textureSampleLevel(lutTex, lutSamp, gCoord, 0.0).g;\n\tlet mappedB = textureSampleLevel(lutTex, lutSamp, bCoord, 0.0).b;\n\t\n\tvar activeIntensity = u.intensity;\n\tif (u.hasSignal > 0.5) {\n\t\tactiveIntensity = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n\t}\n\t\n\tlet finalRgb = inputColor.rgb + activeIntensity * (vec3<f32>(mappedR, mappedG, mappedB) - inputColor.rgb);\n\treturn vec4<f32>(finalRgb * inputColor.a, inputColor.a);\n}\n`;\nconst lutUniformData = new Float32Array(4);\nconst getDeviceLayouts = perDevice((device) => ({\n\tlutUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tlutTextureLayout3D: fragmentBindGroupLayout(device, [{ texture: {\n\t\tviewDimension: \"3d\",\n\t\tsampleType: \"float\"\n\t} }, \"sampler\"]),\n\tlutTextureLayout1D: fragmentBindGroupLayout(device, [{ texture: {\n\t\tviewDimension: \"1d\",\n\t\tsampleType: \"float\"\n\t} }, \"sampler\"]),\n\tsignalTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getLutResources(device, format, type) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `lut_${type}_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst shaderCode = type === \"3D\" ? LUT_3D_SHADER : LUT_1D_SHADER;\n\t\tconst lutModule = device.createShaderModule({\n\t\t\tlabel: `lut_${type.toLowerCase()}_${format}.wgsl`,\n\t\t\tcode: shaderCode\n\t\t});\n\t\tconst currentLutLayout = type === \"3D\" ? layouts.lutTextureLayout3D : layouts.lutTextureLayout1D;\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `LutPipeline_${type}_${format}`,\n\t\t\tmodule: lutModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.lutUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tcurrentLutLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tlutPipeline: pipeline,\n\t\tlutUniformLayout: layouts.lutUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tlutTextureLayout: type === \"3D\" ? layouts.lutTextureLayout3D : layouts.lutTextureLayout1D,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst LutWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ApplyLUT\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst lutUrl = op.lutUrl;\n\tif (!lutUrl) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intensityInput = op.intensityHandleId ? op.inputs?.[op.intensityHandleId] : null;\n\tconst hasSignal = !!(intensityInput?.connectionValid && intensityInput.outputItem?.type === \"Signal\");\n\tconst sd = hasSignal ? intensityInput?.outputItem?.data : null;\n\tlet intensity = 1;\n\tlet hasStaticSignal = false;\n\tif (!hasSignal) if (intensityInput?.connectionValid && intensityInput.outputItem?.type === \"Number\") intensity = Number(intensityInput.outputItem.data ?? 1);\n\telse intensity = Number(op.intensity ?? 1);\n\telse if (sd && typeof sd === \"object\") {\n\t\tintensity = Number(sd.offset ?? 1);\n\t\thasStaticSignal = true;\n\t}\n\tintensity = Math.max(0, Math.min(10, intensity));\n\tlet lut = lutStore.get(lutUrl, ctx.device);\n\tif (!lut) {\n\t\tif ((props.isHeadless ?? (typeof window === \"undefined\" || globalThis.__IS_HEADLESS_RENDERER__)) || props.forceWait) try {\n\t\t\tlut = await lutStore.getOrLoad(lutUrl, ctx.device);\n\t\t} catch (err) {\n\t\t\tif (!(err instanceof DOMException && err.name === \"AbortError\") && !(err && typeof err === \"object\" && \"name\" in err && err.name === \"AbortError\")) console.error(\"[ApplyLUT] Failed to load LUT synchronously:\", err);\n\t\t}\n\t\telse lutStore.getOrLoad(lutUrl, ctx.device).catch((err) => {\n\t\t\tif (err instanceof DOMException && err.name === \"AbortError\" || err && typeof err === \"object\" && \"name\" in err && err.name === \"AbortError\") return;\n\t\t\tconsole.error(\"[ApplyLUT] Failed to load LUT in background:\", err);\n\t\t});\n\t\tif (!lut && lutUrl.startsWith(\"runtime://lut/\")) {\n\t\t\tconst prefix = lutUrl.substring(0, lutUrl.lastIndexOf(\"-\") + 1);\n\t\t\tif (prefix) lut = lutStore.getAnyMatching(prefix, ctx.device);\n\t\t}\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tif (!lut) {\n\t\tdrawTextureToTarget(args, tmpTex, op.opacity ?? 1);\n\t\treturn;\n\t}\n\tconst { lutPipeline: pipeline, lutUniformLayout: uLayout, singleTextureLayout: tLayout, lutTextureLayout: lLayout, signalTextureLayout: sigLayout } = getLutResources(ctx.device, ctx.renderer.format, lut.type);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tlet signalView;\n\tif (hasStaticSignal) {\n\t\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\t\tsignalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, sd.nodeId ?? \"lut_intensity_sig\", elapsedSeconds, durationSeconds, sd, width, height, props.renderId, frame, fps);\n\t} else signalView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlutUniformData[0] = intensity;\n\tlutUniformData[1] = lut.size;\n\tlutUniformData[2] = hasStaticSignal ? 1 : 0;\n\tlutUniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(lutUniformData);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: lLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: lut.texture.createView()\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t}),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: LutWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BrWmp6fW.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist--Uu5bQ_6.mjs";
3
+ import { t as renderers_default } from "./renderer-Cm0tsbQH.mjs";
4
+
5
+ export { renderers_default as default };