framefields 2.8.0 → 2.9.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 (460) hide show
  1. package/README.md +30 -1
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-CGVJlZb9.mjs → audio-BfQg37MW.mjs} +3 -3
  5. package/dist/{audio-CGVJlZb9.mjs.map → audio-BfQg37MW.mjs.map} +1 -1
  6. package/dist/{audio-CxAUxVyA.d.mts → audio-Ccpl9mjV.d.mts} +3 -3
  7. package/dist/{audio-CxAUxVyA.d.mts.map → audio-Ccpl9mjV.d.mts.map} +1 -1
  8. package/dist/cli/check-worker.mjs +44 -44
  9. package/dist/components/index.d.mts +10 -10
  10. package/dist/components/index.mjs +43 -43
  11. package/dist/{dist-CnFcSau0.mjs → dist-C1cCW7Bt.mjs} +2297 -213
  12. package/dist/dist-C1cCW7Bt.mjs.map +1 -0
  13. package/dist/{dist-C5eZw8ms.mjs → dist-C8Xq3zgx.mjs} +2 -2
  14. package/dist/{dist-C5eZw8ms.mjs.map → dist-C8Xq3zgx.mjs.map} +1 -1
  15. package/dist/effects/index.d.mts +4 -4
  16. package/dist/effects/index.mjs +35 -35
  17. package/dist/{effects-DdvkiI3u.mjs → effects-CemgqEPv.mjs} +2 -2
  18. package/dist/{effects-DdvkiI3u.mjs.map → effects-CemgqEPv.mjs.map} +1 -1
  19. package/dist/fonts/index.mjs +2 -2
  20. package/dist/{fonts-k_89s1HO.mjs → fonts-BW0pPcvJ.mjs} +2 -2
  21. package/dist/{fonts-k_89s1HO.mjs.map → fonts-BW0pPcvJ.mjs.map} +1 -1
  22. package/dist/{gpu-BoyykRdD.mjs → gpu-CMaa63nz.mjs} +2 -2
  23. package/dist/{gpu-BoyykRdD.mjs.map → gpu-CMaa63nz.mjs.map} +1 -1
  24. package/dist/{index-CPFKis94.d.mts → index-7Z9_a_iB.d.mts} +3 -3
  25. package/dist/{index-CPFKis94.d.mts.map → index-7Z9_a_iB.d.mts.map} +1 -1
  26. package/dist/{index-CFKMZDv1.d.mts → index-BIjMAW1h.d.mts} +2 -2
  27. package/dist/{index-CFKMZDv1.d.mts.map → index-BIjMAW1h.d.mts.map} +1 -1
  28. package/dist/{index-BukqOGDa.d.mts → index-CFoAmh7q.d.mts} +3 -3
  29. package/dist/{index-BukqOGDa.d.mts.map → index-CFoAmh7q.d.mts.map} +1 -1
  30. package/dist/{index-CPeaSZoz.d.mts → index-CJL0JAU8.d.mts} +2 -2
  31. package/dist/{index-CPeaSZoz.d.mts.map → index-CJL0JAU8.d.mts.map} +1 -1
  32. package/dist/{index-Ds9_v60R.d.mts → index-CZjrnylh.d.mts} +544 -336
  33. package/dist/index-CZjrnylh.d.mts.map +1 -0
  34. package/dist/{index-Ced1Ry4S.d.mts → index-D5UDyVMb.d.mts} +211 -9
  35. package/dist/index-D5UDyVMb.d.mts.map +1 -0
  36. package/dist/{index-B_nooAhS.d.mts → index-Du5YgdzM.d.mts} +53 -15
  37. package/dist/index-Du5YgdzM.d.mts.map +1 -0
  38. package/dist/index.d.mts +11 -11
  39. package/dist/index.mjs +50 -50
  40. package/dist/preview/index.d.mts +3 -3
  41. package/dist/preview/index.mjs +10 -10
  42. package/dist/{preview-DHqCrFhG.mjs → preview-BQVgn6Ho.mjs} +2 -2
  43. package/dist/{preview-DHqCrFhG.mjs.map → preview-BQVgn6Ho.mjs.map} +1 -1
  44. package/dist/preview-engine/audio.mjs +1 -1
  45. package/dist/preview-engine/{chunk-JGDZQCNU.mjs → chunk-2B722GXM.mjs} +1 -1
  46. package/dist/preview-engine/{chunk-GFW3D464.mjs → chunk-2DWY7UBV.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-72DYOIMP.mjs → chunk-2PYTDN2C.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-PF3SXQNV.mjs → chunk-34DL53D5.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-GLXJOXBE.mjs → chunk-34RJ7GAS.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-6OY4YLTC.mjs → chunk-35HMRW4I.mjs} +1 -1
  51. package/dist/preview-engine/chunk-374QY63R.mjs +1974 -0
  52. package/dist/preview-engine/{chunk-W26U6BP2.mjs → chunk-4WYM72ZN.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-EQ4VBUWM.mjs → chunk-5AWAOMBR.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-J4SHMCTG.mjs → chunk-6R3UJBL5.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-VHGC72XP.mjs → chunk-73CNXGAK.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-K5F4ZW6T.mjs → chunk-7U34VKNO.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-KYOPOCO5.mjs → chunk-AHQCDTD6.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-ADV2TIKA.mjs → chunk-BEYA25UZ.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-RBDIRBEI.mjs → chunk-BJV2LBII.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-LBJBBEKP.mjs → chunk-BVDWS3D2.mjs} +1 -1
  61. package/dist/preview-engine/chunk-BXPM5SJ3.mjs +1 -0
  62. package/dist/preview-engine/{chunk-NIPWL6Z5.mjs → chunk-C4M3B2Q2.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-LLUFOFF4.mjs → chunk-CC4NNNIY.mjs} +1 -1
  64. package/dist/preview-engine/chunk-CCB3VTY2.mjs +39 -0
  65. package/dist/preview-engine/{chunk-NX66555S.mjs → chunk-CN2VLYLB.mjs} +1 -1
  66. package/dist/preview-engine/{chunk-SK7PUBTC.mjs → chunk-DMSZXG56.mjs} +1 -1
  67. package/dist/preview-engine/{chunk-WC257OBY.mjs → chunk-DVZITDQS.mjs} +1 -1
  68. package/dist/preview-engine/chunk-FKG27DVO.mjs +4 -0
  69. package/dist/preview-engine/{chunk-COZG35ZR.mjs → chunk-FTCEG3SF.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-57LES7TL.mjs → chunk-GA4HNR44.mjs} +1 -1
  71. package/dist/preview-engine/chunk-GEUUXTDL.mjs +138 -0
  72. package/dist/preview-engine/{chunk-S4WNCEMO.mjs → chunk-GIICZZQI.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-RTHU7REC.mjs → chunk-GRJJVSOV.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-RGDM6PQ5.mjs → chunk-GZWA5QJS.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-LZNNM5OB.mjs → chunk-H7BSN7V7.mjs} +1 -1
  76. package/dist/preview-engine/{chunk-JXUENEQO.mjs → chunk-HOV6DDBZ.mjs} +1 -1
  77. package/dist/preview-engine/{chunk-C6XLAJLL.mjs → chunk-JSYG6OWZ.mjs} +1 -1
  78. package/dist/preview-engine/{chunk-GZVPVOHB.mjs → chunk-K3C6GUQD.mjs} +1 -1
  79. package/dist/preview-engine/chunk-KOVN277Z.mjs +1 -0
  80. package/dist/preview-engine/{chunk-Y6TWMUJC.mjs → chunk-LVYVXVZO.mjs} +1 -1
  81. package/dist/preview-engine/chunk-MIEH74UH.mjs +480 -0
  82. package/dist/preview-engine/{chunk-AVDHZNIZ.mjs → chunk-OH5W5EL6.mjs} +1 -1
  83. package/dist/preview-engine/{chunk-22F33PPP.mjs → chunk-P5FKRQFU.mjs} +1 -1
  84. package/dist/preview-engine/{chunk-7X2AUKTU.mjs → chunk-PM2W4VLT.mjs} +1 -1
  85. package/dist/preview-engine/chunk-QCSVT73T.mjs +2403 -0
  86. package/dist/preview-engine/{chunk-523CTDOC.mjs → chunk-RJIAES3X.mjs} +1 -1
  87. package/dist/preview-engine/{chunk-DPQN7WYQ.mjs → chunk-S2ABWY5G.mjs} +1 -1
  88. package/dist/preview-engine/{chunk-G7JJ6HVL.mjs → chunk-SF37HXAH.mjs} +1 -1
  89. package/dist/preview-engine/{chunk-OKLYIQ5F.mjs → chunk-SPJPM43P.mjs} +1 -1
  90. package/dist/preview-engine/{chunk-UOTMBWBJ.mjs → chunk-TNJEZKXM.mjs} +1 -1
  91. package/dist/preview-engine/chunk-ULOFDFHJ.mjs +1 -0
  92. package/dist/preview-engine/{chunk-LLB3AGBQ.mjs → chunk-UQKPDGEH.mjs} +1 -1
  93. package/dist/preview-engine/{chunk-DISKQ5MH.mjs → chunk-UXYM2G6J.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-U5YNECNG.mjs → chunk-VN36PRVD.mjs} +1 -1
  95. package/dist/preview-engine/{chunk-PMOKPVSD.mjs → chunk-VVE2QHVG.mjs} +1 -1
  96. package/dist/preview-engine/{chunk-PEUQRSIM.mjs → chunk-Y5K5LVOR.mjs} +1 -1
  97. package/dist/preview-engine/chunk-YGKO4NIU.mjs +1 -0
  98. package/dist/preview-engine/{chunk-PSEMCJBH.mjs → chunk-ZJ5SWTCW.mjs} +1 -1
  99. package/dist/preview-engine/chunk-ZY47XIRK.mjs +5 -0
  100. package/dist/preview-engine/components.mjs +1 -1
  101. package/dist/preview-engine/effects.mjs +1 -1
  102. package/dist/preview-engine/framefields.mjs +1 -1
  103. package/dist/preview-engine/player.mjs +1 -1
  104. package/dist/preview-engine/renderers-3BOQOUEU.mjs +1 -0
  105. package/dist/preview-engine/renderers-3M2FESR2.mjs +1 -0
  106. package/dist/preview-engine/{renderers-FEEIDQF3.mjs → renderers-4F7WLQD5.mjs} +1 -1
  107. package/dist/preview-engine/{renderers-OP6MKYRM.mjs → renderers-5KANN7XF.mjs} +1 -1
  108. package/dist/preview-engine/{renderers-TVRR7PGN.mjs → renderers-5TO2SXFR.mjs} +1 -1
  109. package/dist/preview-engine/{renderers-DR7UZ3QR.mjs → renderers-5UZ3YFBD.mjs} +1 -1
  110. package/dist/preview-engine/renderers-6LHIWKMZ.mjs +1 -0
  111. package/dist/preview-engine/{renderers-7F2KF5RE.mjs → renderers-6Z7DWAPH.mjs} +1 -1
  112. package/dist/preview-engine/renderers-77PDUMYI.mjs +1 -0
  113. package/dist/preview-engine/{renderers-3J3NCOAI.mjs → renderers-7C5RA3R5.mjs} +1 -1
  114. package/dist/preview-engine/renderers-7XHO6M3B.mjs +228 -0
  115. package/dist/preview-engine/{renderers-KJAOPYAU.mjs → renderers-A24KZK2Q.mjs} +1 -1
  116. package/dist/preview-engine/renderers-A43VCJ7X.mjs +1 -0
  117. package/dist/preview-engine/renderers-AKY464RY.mjs +1 -0
  118. package/dist/preview-engine/renderers-C5UO6PL5.mjs +1 -0
  119. package/dist/preview-engine/renderers-C64QSZO4.mjs +1 -0
  120. package/dist/preview-engine/renderers-CIRCR6NG.mjs +1 -0
  121. package/dist/preview-engine/renderers-CIWOPETY.mjs +1 -0
  122. package/dist/preview-engine/renderers-CUMVIVHI.mjs +1 -0
  123. package/dist/preview-engine/renderers-CZEZCELP.mjs +1 -0
  124. package/dist/preview-engine/{renderers-R3YVLWKV.mjs → renderers-ENMY4DKF.mjs} +1 -1
  125. package/dist/preview-engine/{renderers-AAENCA7X.mjs → renderers-FSI5KNGZ.mjs} +1 -1
  126. package/dist/preview-engine/renderers-FSQMWHQM.mjs +1 -0
  127. package/dist/preview-engine/renderers-FZEW5C23.mjs +1 -0
  128. package/dist/preview-engine/renderers-HCET2IML.mjs +1 -0
  129. package/dist/preview-engine/{renderers-LBX7GPDU.mjs → renderers-IHGAWLUF.mjs} +1 -1
  130. package/dist/preview-engine/renderers-IUOOC6K7.mjs +1 -0
  131. package/dist/preview-engine/{renderers-VXMR47WZ.mjs → renderers-KC6ZSKCW.mjs} +1 -1
  132. package/dist/preview-engine/renderers-KYYJLVIJ.mjs +1 -0
  133. package/dist/preview-engine/renderers-L4GE7WV3.mjs +1 -0
  134. package/dist/preview-engine/renderers-L6YDX6GS.mjs +1 -0
  135. package/dist/preview-engine/renderers-LRAFWKCO.mjs +1 -0
  136. package/dist/preview-engine/renderers-LU3XZWEB.mjs +1 -0
  137. package/dist/preview-engine/{renderers-4YYGKLDK.mjs → renderers-MD3PRFZL.mjs} +1 -1
  138. package/dist/preview-engine/renderers-MOEC2XZZ.mjs +1 -0
  139. package/dist/preview-engine/{renderers-RGDTRVZM.mjs → renderers-NCGH2WWJ.mjs} +1 -1
  140. package/dist/preview-engine/renderers-ND2WV4K3.mjs +1 -0
  141. package/dist/preview-engine/renderers-NJ5CWVVH.mjs +1 -0
  142. package/dist/preview-engine/renderers-NKXYPR3V.mjs +1 -0
  143. package/dist/preview-engine/{renderers-WVQQZQ6Y.mjs → renderers-NUAI4TO5.mjs} +1 -1
  144. package/dist/preview-engine/renderers-NWR66CGK.mjs +1 -0
  145. package/dist/preview-engine/renderers-O22WTBRM.mjs +1 -0
  146. package/dist/preview-engine/renderers-O55BEDQZ.mjs +1 -0
  147. package/dist/preview-engine/renderers-PBBA7LQB.mjs +1 -0
  148. package/dist/preview-engine/{renderers-BL7Z3FTF.mjs → renderers-PIIEUKFE.mjs} +1 -1
  149. package/dist/preview-engine/renderers-PPZK6VEW.mjs +1 -0
  150. package/dist/preview-engine/renderers-Q6LJRZ7R.mjs +1 -0
  151. package/dist/preview-engine/{renderers-7TNEKJZS.mjs → renderers-QA2HKUJJ.mjs} +1 -1
  152. package/dist/preview-engine/renderers-RMEACSRL.mjs +1 -0
  153. package/dist/preview-engine/{renderers-AWRIELVX.mjs → renderers-RN2MHIFK.mjs} +1 -1
  154. package/dist/preview-engine/renderers-SEIAUKJF.mjs +1 -0
  155. package/dist/preview-engine/renderers-SP42LCSI.mjs +1 -0
  156. package/dist/preview-engine/{renderers-OE55O27K.mjs → renderers-T74CQCEN.mjs} +1 -1
  157. package/dist/preview-engine/renderers-T7SZA3BX.mjs +1 -0
  158. package/dist/preview-engine/{renderers-ZUQ2ZBYY.mjs → renderers-TGJSOKDY.mjs} +1 -1
  159. package/dist/preview-engine/renderers-TSBV4KPE.mjs +1 -0
  160. package/dist/preview-engine/{renderers-2SE5BLLB.mjs → renderers-U4M7ZCV4.mjs} +1 -1
  161. package/dist/preview-engine/{renderers-YEI4K4W4.mjs → renderers-V3AQO7AR.mjs} +1 -1
  162. package/dist/preview-engine/renderers-VADTDAHD.mjs +1 -0
  163. package/dist/preview-engine/renderers-VNNWI5C3.mjs +1 -0
  164. package/dist/preview-engine/{renderers-YYMRKHAA.mjs → renderers-WEYAHOBK.mjs} +1 -1
  165. package/dist/preview-engine/renderers-WZ75MLP3.mjs +1 -0
  166. package/dist/preview-engine/renderers-XB5R4UQA.mjs +1 -0
  167. package/dist/preview-engine/{renderers-YIVPMPQS.mjs → renderers-Y22VSOXF.mjs} +1 -1
  168. package/dist/preview-engine/{renderers-Y53D5CQ7.mjs → renderers-YBIUZDGQ.mjs} +1 -1
  169. package/dist/preview-engine/renderers-YESJR4O7.mjs +1 -0
  170. package/dist/preview-engine/renderers-YKSRZRRT.mjs +1 -0
  171. package/dist/preview-engine/{renderers-V4VML5IG.mjs → renderers-ZACSHGNZ.mjs} +1 -1
  172. package/dist/preview-engine/signals.mjs +1 -1
  173. package/dist/preview-engine/src-NGVAJYHC.mjs +8 -0
  174. package/dist/{program-CqQDWfSV.mjs → program-CKpKkllV.mjs} +5 -6
  175. package/dist/program-CKpKkllV.mjs.map +1 -0
  176. package/dist/renderer/index.d.mts +2 -2
  177. package/dist/renderer/index.mjs +2 -2
  178. package/dist/renderer--Ac-dg4A.mjs +5 -0
  179. package/dist/renderer--N7TMqzU.mjs +5 -0
  180. package/dist/{renderer-DYfNgEhK.mjs → renderer--fkmiVjl.mjs} +2 -2
  181. package/dist/{renderer-DYfNgEhK.mjs.map → renderer--fkmiVjl.mjs.map} +1 -1
  182. package/dist/{renderer-JDLYPnRh.mjs → renderer-1r-Uq-Ae.mjs} +2 -2
  183. package/dist/{renderer-JDLYPnRh.mjs.map → renderer-1r-Uq-Ae.mjs.map} +1 -1
  184. package/dist/renderer-2ecmdOae.mjs +5 -0
  185. package/dist/{renderer-DZKZup7n.mjs → renderer-8QIwXh7O.mjs} +3 -3
  186. package/dist/{renderer-DZKZup7n.mjs.map → renderer-8QIwXh7O.mjs.map} +1 -1
  187. package/dist/{renderer-DCyp-jzQ.mjs → renderer-B-ur0Ej8.mjs} +3 -3
  188. package/dist/{renderer-DCyp-jzQ.mjs.map → renderer-B-ur0Ej8.mjs.map} +1 -1
  189. package/dist/{renderer-BD25uND8.mjs → renderer-B0piZg9r.mjs} +383 -171
  190. package/dist/renderer-B0piZg9r.mjs.map +1 -0
  191. package/dist/{renderer-Cn34qZC4.mjs → renderer-B2jjxsjO.mjs} +2 -2
  192. package/dist/{renderer-Cn34qZC4.mjs.map → renderer-B2jjxsjO.mjs.map} +1 -1
  193. package/dist/{renderer-DbO4xZBb.mjs → renderer-B39I6CQw.mjs} +3 -3
  194. package/dist/{renderer-DbO4xZBb.mjs.map → renderer-B39I6CQw.mjs.map} +1 -1
  195. package/dist/{renderer-CTr_Zi08.mjs → renderer-B522Dkdk.mjs} +3 -3
  196. package/dist/{renderer-CTr_Zi08.mjs.map → renderer-B522Dkdk.mjs.map} +1 -1
  197. package/dist/renderer-B5RJp5g-.mjs +5 -0
  198. package/dist/renderer-B7xyT1Vb.mjs +5 -0
  199. package/dist/{renderer-4a4koLCl.mjs → renderer-BAYTI6jj.mjs} +2 -2
  200. package/dist/{renderer-4a4koLCl.mjs.map → renderer-BAYTI6jj.mjs.map} +1 -1
  201. package/dist/{renderer-CCnrG0Pd.mjs → renderer-BAusZ6Vu.mjs} +2 -2
  202. package/dist/{renderer-CCnrG0Pd.mjs.map → renderer-BAusZ6Vu.mjs.map} +1 -1
  203. package/dist/renderer-BBeArN_x.mjs +5 -0
  204. package/dist/renderer-BCAZDu-r.mjs +5 -0
  205. package/dist/{renderer-bE6yZ_Ef.mjs → renderer-BF0hx_iJ.mjs} +3 -3
  206. package/dist/{renderer-bE6yZ_Ef.mjs.map → renderer-BF0hx_iJ.mjs.map} +1 -1
  207. package/dist/renderer-BJnhik7Y.mjs +5 -0
  208. package/dist/{renderer-kg8-ngnB.mjs → renderer-BPWDsufX.mjs} +2 -2
  209. package/dist/{renderer-kg8-ngnB.mjs.map → renderer-BPWDsufX.mjs.map} +1 -1
  210. package/dist/{renderer-DXu0nrzo.d.mts → renderer-BX7jS14r.d.mts} +2 -2
  211. package/dist/{renderer-DXu0nrzo.d.mts.map → renderer-BX7jS14r.d.mts.map} +1 -1
  212. package/dist/{renderer-DBN6SV8L.mjs → renderer-BXJXziIt.mjs} +2 -2
  213. package/dist/{renderer-DBN6SV8L.mjs.map → renderer-BXJXziIt.mjs.map} +1 -1
  214. package/dist/{renderer-4F4FypvN.mjs → renderer-BdyopiLC.mjs} +2 -2
  215. package/dist/{renderer-4F4FypvN.mjs.map → renderer-BdyopiLC.mjs.map} +1 -1
  216. package/dist/{renderer-wH_l-jMH.mjs → renderer-Bfk6A7UO.mjs} +3 -3
  217. package/dist/{renderer-wH_l-jMH.mjs.map → renderer-Bfk6A7UO.mjs.map} +1 -1
  218. package/dist/{renderer-DYT4iPi-.mjs → renderer-BgO6BA_z.mjs} +2 -2
  219. package/dist/{renderer-DYT4iPi-.mjs.map → renderer-BgO6BA_z.mjs.map} +1 -1
  220. package/dist/{renderer-Dv5yE4LE.mjs → renderer-BlPqTEii.mjs} +2 -2
  221. package/dist/{renderer-Dv5yE4LE.mjs.map → renderer-BlPqTEii.mjs.map} +1 -1
  222. package/dist/{renderer-CuK1lPnA.mjs → renderer-BlvGcyAN.mjs} +2 -2
  223. package/dist/{renderer-CuK1lPnA.mjs.map → renderer-BlvGcyAN.mjs.map} +1 -1
  224. package/dist/{renderer-DX5ZpEBB.mjs → renderer-BpIF1QIE.mjs} +3 -3
  225. package/dist/{renderer-DX5ZpEBB.mjs.map → renderer-BpIF1QIE.mjs.map} +1 -1
  226. package/dist/renderer-BxRW8MZO.mjs +5 -0
  227. package/dist/renderer-C-lfsEAN.mjs +5 -0
  228. package/dist/{renderer-DRLtfxdW.mjs → renderer-C41U1tK6.mjs} +95 -16
  229. package/dist/renderer-C41U1tK6.mjs.map +1 -0
  230. package/dist/renderer-C6nOFN4-.mjs +5 -0
  231. package/dist/{renderer-CpEU-TRR.mjs → renderer-C7L8Ceqr.mjs} +2 -2
  232. package/dist/{renderer-CpEU-TRR.mjs.map → renderer-C7L8Ceqr.mjs.map} +1 -1
  233. package/dist/{renderer-BMnX_-PZ.mjs → renderer-C7eFJf0_.mjs} +3 -3
  234. package/dist/{renderer-BMnX_-PZ.mjs.map → renderer-C7eFJf0_.mjs.map} +1 -1
  235. package/dist/renderer-C84TSQmS.mjs +5 -0
  236. package/dist/renderer-C8_6YofT.mjs +5 -0
  237. package/dist/{renderer-CeIXVu9F.mjs → renderer-CCycwCEB.mjs} +2 -2
  238. package/dist/{renderer-CeIXVu9F.mjs.map → renderer-CCycwCEB.mjs.map} +1 -1
  239. package/dist/{renderer-CNVzJIBz.mjs → renderer-CHr7MiYW.mjs} +3 -3
  240. package/dist/{renderer-CNVzJIBz.mjs.map → renderer-CHr7MiYW.mjs.map} +1 -1
  241. package/dist/renderer-COR66Sby.mjs +3 -0
  242. package/dist/renderer-COb3tOPG.mjs +5 -0
  243. package/dist/{renderer-Crl8q_vD.mjs → renderer-CQvmbRQ5.mjs} +3 -3
  244. package/dist/{renderer-Crl8q_vD.mjs.map → renderer-CQvmbRQ5.mjs.map} +1 -1
  245. package/dist/renderer-CSCIzaLy.mjs +5 -0
  246. package/dist/{renderer-DO15Nj-w.mjs → renderer-CYC32bDW.mjs} +3 -3
  247. package/dist/{renderer-DO15Nj-w.mjs.map → renderer-CYC32bDW.mjs.map} +1 -1
  248. package/dist/{renderer-NvGahExL.mjs → renderer-CcvvoKiZ.mjs} +3 -3
  249. package/dist/{renderer-NvGahExL.mjs.map → renderer-CcvvoKiZ.mjs.map} +1 -1
  250. package/dist/{renderer-vVKNp3ri.mjs → renderer-CiQhD8Gg.mjs} +3 -3
  251. package/dist/{renderer-vVKNp3ri.mjs.map → renderer-CiQhD8Gg.mjs.map} +1 -1
  252. package/dist/renderer-CmI4c8MS.mjs +5 -0
  253. package/dist/{renderer-Sj11W1xq.mjs → renderer-CpUJBOfb.mjs} +2 -2
  254. package/dist/renderer-CqVltdX9.mjs +5 -0
  255. package/dist/{renderer-j-3XB8YI.mjs → renderer-CwFqqpWY.mjs} +3 -3
  256. package/dist/{renderer-j-3XB8YI.mjs.map → renderer-CwFqqpWY.mjs.map} +1 -1
  257. package/dist/renderer-D-FpMzLY.mjs +5 -0
  258. package/dist/renderer-D-Oyn9mG.mjs +5 -0
  259. package/dist/renderer-D2QrkA8_.mjs +5 -0
  260. package/dist/{renderer-ClxmV_id.mjs → renderer-D47AEJE_.mjs} +2 -2
  261. package/dist/{renderer-ClxmV_id.mjs.map → renderer-D47AEJE_.mjs.map} +1 -1
  262. package/dist/{renderer-BrXkb-9N.mjs → renderer-D61B9bXF.mjs} +2 -2
  263. package/dist/{renderer-BrXkb-9N.mjs.map → renderer-D61B9bXF.mjs.map} +1 -1
  264. package/dist/renderer-D64r4iN-.mjs +5 -0
  265. package/dist/{renderer-DXsV3mZD.mjs → renderer-D7Al3_-5.mjs} +3 -3
  266. package/dist/{renderer-DXsV3mZD.mjs.map → renderer-D7Al3_-5.mjs.map} +1 -1
  267. package/dist/{renderer-Bw3tlr9I.mjs → renderer-D7r6onRT.mjs} +2 -2
  268. package/dist/{renderer-Bw3tlr9I.mjs.map → renderer-D7r6onRT.mjs.map} +1 -1
  269. package/dist/{renderer-Dypn26aP.mjs → renderer-D8bBHrWC.mjs} +3 -3
  270. package/dist/{renderer-Dypn26aP.mjs.map → renderer-D8bBHrWC.mjs.map} +1 -1
  271. package/dist/renderer-DCq6YkgP.mjs +5 -0
  272. package/dist/{renderer-BHwbnT6S.mjs → renderer-DDEkFbVI.mjs} +3 -3
  273. package/dist/{renderer-BHwbnT6S.mjs.map → renderer-DDEkFbVI.mjs.map} +1 -1
  274. package/dist/renderer-DDHG3GdR.mjs +5 -0
  275. package/dist/{renderer-DqMZiy5N.mjs → renderer-DEmYyaqj.mjs} +2 -2
  276. package/dist/{renderer-DqMZiy5N.mjs.map → renderer-DEmYyaqj.mjs.map} +1 -1
  277. package/dist/{renderer-CyELq6P6.mjs → renderer-DF-yvIrV.mjs} +2 -2
  278. package/dist/{renderer-CyELq6P6.mjs.map → renderer-DF-yvIrV.mjs.map} +1 -1
  279. package/dist/{renderer-XnWe1hSL.mjs → renderer-DFzI3yI_.mjs} +2 -2
  280. package/dist/{renderer-XnWe1hSL.mjs.map → renderer-DFzI3yI_.mjs.map} +1 -1
  281. package/dist/{renderer-Cx2Sw9Ib.mjs → renderer-DIw3UtEU.mjs} +3 -3
  282. package/dist/{renderer-Cx2Sw9Ib.mjs.map → renderer-DIw3UtEU.mjs.map} +1 -1
  283. package/dist/{renderer-D_Mf-Zft.d.mts → renderer-DKgPVOLL.d.mts} +2 -2
  284. package/dist/{renderer-D_Mf-Zft.d.mts.map → renderer-DKgPVOLL.d.mts.map} +1 -1
  285. package/dist/renderer-DMdNfcud.mjs +6 -0
  286. package/dist/{renderer-CaRPsrbX.mjs → renderer-DMvmf3T2.mjs} +2 -2
  287. package/dist/{renderer-jvgqy4Td.mjs → renderer-DNQvOrkY.mjs} +3 -3
  288. package/dist/{renderer-jvgqy4Td.mjs.map → renderer-DNQvOrkY.mjs.map} +1 -1
  289. package/dist/{renderer-DB7PM7nZ.mjs → renderer-DO-KbpYZ.mjs} +3 -3
  290. package/dist/{renderer-DB7PM7nZ.mjs.map → renderer-DO-KbpYZ.mjs.map} +1 -1
  291. package/dist/{renderer-CQkZUsvc.mjs → renderer-DTqDy2m9.mjs} +3 -3
  292. package/dist/{renderer-CQkZUsvc.mjs.map → renderer-DTqDy2m9.mjs.map} +1 -1
  293. package/dist/{renderer-DPUULdjh.mjs → renderer-DVCJjVn7.mjs} +2 -2
  294. package/dist/{renderer-DPUULdjh.mjs.map → renderer-DVCJjVn7.mjs.map} +1 -1
  295. package/dist/{renderer-C7SYbHgB.mjs → renderer-DX41niRU.mjs} +2 -2
  296. package/dist/{renderer-C7SYbHgB.mjs.map → renderer-DX41niRU.mjs.map} +1 -1
  297. package/dist/{renderer-BYIa_hnS.mjs → renderer-DXEWbnRF.mjs} +3 -3
  298. package/dist/{renderer-BYIa_hnS.mjs.map → renderer-DXEWbnRF.mjs.map} +1 -1
  299. package/dist/renderer-DZQXZ4lK.mjs +5 -0
  300. package/dist/{renderer-iA7rxZmR.mjs → renderer-DbRZe0Re.mjs} +3 -3
  301. package/dist/{renderer-iA7rxZmR.mjs.map → renderer-DbRZe0Re.mjs.map} +1 -1
  302. package/dist/renderer-DczJJLA1.mjs +5 -0
  303. package/dist/renderer-DfqJj9oe.mjs +5 -0
  304. package/dist/renderer-DgO9ihVJ.mjs +5 -0
  305. package/dist/renderer-DhgnQZYb.mjs +5 -0
  306. package/dist/{renderer-l-K6iZLC.mjs → renderer-DiY70S8S.mjs} +3 -3
  307. package/dist/{renderer-l-K6iZLC.mjs.map → renderer-DiY70S8S.mjs.map} +1 -1
  308. package/dist/renderer-DjxKjHMf.mjs +5 -0
  309. package/dist/{renderer-Qd-HCwKj.mjs → renderer-DkRSZg5g.mjs} +3 -3
  310. package/dist/{renderer-Qd-HCwKj.mjs.map → renderer-DkRSZg5g.mjs.map} +1 -1
  311. package/dist/{renderer-CaE0rp9j.mjs → renderer-DmkWrWAk.mjs} +2 -2
  312. package/dist/{renderer-CaE0rp9j.mjs.map → renderer-DmkWrWAk.mjs.map} +1 -1
  313. package/dist/{renderer-BUV6IH0o.mjs → renderer-DpruWmZU.mjs} +2 -2
  314. package/dist/{renderer-BUV6IH0o.mjs.map → renderer-DpruWmZU.mjs.map} +1 -1
  315. package/dist/renderer-DqLA5cdR.mjs +5 -0
  316. package/dist/{renderer-DfTnsfy9.mjs → renderer-DqvoMLca.mjs} +3 -3
  317. package/dist/{renderer-DfTnsfy9.mjs.map → renderer-DqvoMLca.mjs.map} +1 -1
  318. package/dist/{renderer-Dhi0Q1cI.mjs → renderer-DsEyjwfT.mjs} +70 -70
  319. package/dist/{renderer-Dhi0Q1cI.mjs.map → renderer-DsEyjwfT.mjs.map} +1 -1
  320. package/dist/renderer-Dudp6ZlH.mjs +5 -0
  321. package/dist/{renderer-Bw5jGUo5.mjs → renderer-EaLUCobW.mjs} +2 -2
  322. package/dist/{renderer-Bw5jGUo5.mjs.map → renderer-EaLUCobW.mjs.map} +1 -1
  323. package/dist/{renderer-Ca-LoeJh.mjs → renderer-GBmWjBvy.mjs} +2 -2
  324. package/dist/{renderer-Ca-LoeJh.mjs.map → renderer-GBmWjBvy.mjs.map} +1 -1
  325. package/dist/{renderer-DS-Gv-3w.mjs → renderer-Lth37j17.mjs} +2 -2
  326. package/dist/{renderer-BlUfAZyK.mjs → renderer-SSBL4M1o.mjs} +3 -3
  327. package/dist/{renderer-BlUfAZyK.mjs.map → renderer-SSBL4M1o.mjs.map} +1 -1
  328. package/dist/{renderer-DSM5c7UA.mjs → renderer-SWr3vbrV.mjs} +2 -2
  329. package/dist/{renderer-DSM5c7UA.mjs.map → renderer-SWr3vbrV.mjs.map} +1 -1
  330. package/dist/{renderer-BLrhcSex.mjs → renderer-WCZu2Rf5.mjs} +3 -3
  331. package/dist/{renderer-BLrhcSex.mjs.map → renderer-WCZu2Rf5.mjs.map} +1 -1
  332. package/dist/{renderer-D7FuHXiz.mjs → renderer-Xv6GfNUI.mjs} +2 -2
  333. package/dist/{renderer-D7FuHXiz.mjs.map → renderer-Xv6GfNUI.mjs.map} +1 -1
  334. package/dist/renderer-_jC5KIT1.mjs +5 -0
  335. package/dist/{renderer-8pS82_mX.mjs → renderer-bAKUeHF3.mjs} +3 -3
  336. package/dist/{renderer-8pS82_mX.mjs.map → renderer-bAKUeHF3.mjs.map} +1 -1
  337. package/dist/renderer-cTgAuVmJ.mjs +5 -0
  338. package/dist/{renderer-DjWBBISJ.mjs → renderer-cod5Ona9.mjs} +2 -2
  339. package/dist/{renderer-C55eLbl1.mjs → renderer-g_vrrAQU.mjs} +2 -2
  340. package/dist/{renderer-C55eLbl1.mjs.map → renderer-g_vrrAQU.mjs.map} +1 -1
  341. package/dist/{renderer-CT_aJBk2.mjs → renderer-hSCfnvaK.mjs} +3 -3
  342. package/dist/{renderer-CT_aJBk2.mjs.map → renderer-hSCfnvaK.mjs.map} +1 -1
  343. package/dist/{renderer-BuYRrBRf.mjs → renderer-ktWXVYka.mjs} +3 -3
  344. package/dist/{renderer-BuYRrBRf.mjs.map → renderer-ktWXVYka.mjs.map} +1 -1
  345. package/dist/renderer-nVKDvDLO.mjs +5 -0
  346. package/dist/{renderer-7Tx-L9Vf.mjs → renderer-oKRF4A0M.mjs} +2 -2
  347. package/dist/{renderer-7Tx-L9Vf.mjs.map → renderer-oKRF4A0M.mjs.map} +1 -1
  348. package/dist/{renderer-fv9WvK0d.mjs → renderer-pHWEHDnM.mjs} +3 -3
  349. package/dist/{renderer-fv9WvK0d.mjs.map → renderer-pHWEHDnM.mjs.map} +1 -1
  350. package/dist/renderer-pZ6_pUo1.mjs +5 -0
  351. package/dist/{renderer-DsGE9qtz.mjs → renderer-sCovEubT.mjs} +3 -3
  352. package/dist/{renderer-DsGE9qtz.mjs.map → renderer-sCovEubT.mjs.map} +1 -1
  353. package/dist/{renderer-BcHpcLq3.mjs → renderer-sYSkIUfo.mjs} +3 -3
  354. package/dist/{renderer-BcHpcLq3.mjs.map → renderer-sYSkIUfo.mjs.map} +1 -1
  355. package/dist/{renderer-4GwADfB0.mjs → renderer-zXPVLRlD.mjs} +3 -3
  356. package/dist/{renderer-4GwADfB0.mjs.map → renderer-zXPVLRlD.mjs.map} +1 -1
  357. package/dist/{renderers-CP8CFWDs-fYqxoIKK.mjs → renderers-CP8CFWDs-DH2oktaC.mjs} +2 -2
  358. package/dist/{renderers-CP8CFWDs-fYqxoIKK.mjs.map → renderers-CP8CFWDs-DH2oktaC.mjs.map} +1 -1
  359. package/dist/signals/index.d.mts +5 -5
  360. package/dist/signals/index.mjs +4 -4
  361. package/dist/{src-DggYlKaX.mjs → src-CK5rGVbh.mjs} +664 -72
  362. package/dist/src-CK5rGVbh.mjs.map +1 -0
  363. package/package.json +67 -58
  364. package/dist/dist-CnFcSau0.mjs.map +0 -1
  365. package/dist/index-B_nooAhS.d.mts.map +0 -1
  366. package/dist/index-Ced1Ry4S.d.mts.map +0 -1
  367. package/dist/index-Ds9_v60R.d.mts.map +0 -1
  368. package/dist/preview-engine/chunk-3OXRGTQ2.mjs +0 -2390
  369. package/dist/preview-engine/chunk-3U2A3RW4.mjs +0 -5
  370. package/dist/preview-engine/chunk-6E3JSPJN.mjs +0 -1
  371. package/dist/preview-engine/chunk-7EYVBRN3.mjs +0 -480
  372. package/dist/preview-engine/chunk-7WBDEZ2A.mjs +0 -1974
  373. package/dist/preview-engine/chunk-F4F2UDRX.mjs +0 -1
  374. package/dist/preview-engine/chunk-HPP52AQI.mjs +0 -4
  375. package/dist/preview-engine/chunk-PYSBWKIJ.mjs +0 -1
  376. package/dist/preview-engine/chunk-U2IFQMS3.mjs +0 -174
  377. package/dist/preview-engine/renderers-2GMY2ZNK.mjs +0 -1
  378. package/dist/preview-engine/renderers-2QJNKL7Q.mjs +0 -1
  379. package/dist/preview-engine/renderers-3OYU6O6F.mjs +0 -1
  380. package/dist/preview-engine/renderers-433Y2PCK.mjs +0 -1
  381. package/dist/preview-engine/renderers-4AGPGEL4.mjs +0 -1
  382. package/dist/preview-engine/renderers-54DBHGUW.mjs +0 -1
  383. package/dist/preview-engine/renderers-5M2O55U3.mjs +0 -1
  384. package/dist/preview-engine/renderers-6FVMDEAY.mjs +0 -1
  385. package/dist/preview-engine/renderers-6R7ZJ7DU.mjs +0 -1
  386. package/dist/preview-engine/renderers-75GCMFOD.mjs +0 -1
  387. package/dist/preview-engine/renderers-7LWLUCVQ.mjs +0 -1
  388. package/dist/preview-engine/renderers-BLDENIEV.mjs +0 -1
  389. package/dist/preview-engine/renderers-CCOEGTZJ.mjs +0 -228
  390. package/dist/preview-engine/renderers-CDB3YK3R.mjs +0 -1
  391. package/dist/preview-engine/renderers-D6D4XDFY.mjs +0 -1
  392. package/dist/preview-engine/renderers-DJVFQZYU.mjs +0 -1
  393. package/dist/preview-engine/renderers-DMXSV7VO.mjs +0 -1
  394. package/dist/preview-engine/renderers-EBMASIOE.mjs +0 -1
  395. package/dist/preview-engine/renderers-F262HDFS.mjs +0 -1
  396. package/dist/preview-engine/renderers-FMXKIF22.mjs +0 -1
  397. package/dist/preview-engine/renderers-GJKSZ6DR.mjs +0 -1
  398. package/dist/preview-engine/renderers-GR3RLYDZ.mjs +0 -1
  399. package/dist/preview-engine/renderers-GT3W2QIA.mjs +0 -1
  400. package/dist/preview-engine/renderers-IHC7HUK3.mjs +0 -1
  401. package/dist/preview-engine/renderers-J56ZGEVM.mjs +0 -1
  402. package/dist/preview-engine/renderers-KYM6352U.mjs +0 -1
  403. package/dist/preview-engine/renderers-LFXX6TWI.mjs +0 -1
  404. package/dist/preview-engine/renderers-NAHUPFPU.mjs +0 -1
  405. package/dist/preview-engine/renderers-NM3FZLHH.mjs +0 -1
  406. package/dist/preview-engine/renderers-NNB4BTJA.mjs +0 -1
  407. package/dist/preview-engine/renderers-OYVQW6QI.mjs +0 -1
  408. package/dist/preview-engine/renderers-P5RIFU3C.mjs +0 -1
  409. package/dist/preview-engine/renderers-QB7HJUTS.mjs +0 -1
  410. package/dist/preview-engine/renderers-QRQVOCDC.mjs +0 -1
  411. package/dist/preview-engine/renderers-QVFHJTZA.mjs +0 -1
  412. package/dist/preview-engine/renderers-R3WQIE4L.mjs +0 -1
  413. package/dist/preview-engine/renderers-SQBVOLG7.mjs +0 -1
  414. package/dist/preview-engine/renderers-TLXMYEDI.mjs +0 -1
  415. package/dist/preview-engine/renderers-X4S3WELJ.mjs +0 -1
  416. package/dist/preview-engine/renderers-XT7U25I7.mjs +0 -1
  417. package/dist/preview-engine/renderers-XVGLMBB3.mjs +0 -1
  418. package/dist/preview-engine/renderers-YUWU3TQZ.mjs +0 -1
  419. package/dist/preview-engine/renderers-ZNUD5OVO.mjs +0 -1
  420. package/dist/program-CqQDWfSV.mjs.map +0 -1
  421. package/dist/renderer-68XHoE2b.mjs +0 -5
  422. package/dist/renderer-AqUForA-.mjs +0 -5
  423. package/dist/renderer-B0J-uGBG.mjs +0 -5
  424. package/dist/renderer-BD25uND8.mjs.map +0 -1
  425. package/dist/renderer-BF2R0rwb.mjs +0 -5
  426. package/dist/renderer-BLrO9lqK.mjs +0 -5
  427. package/dist/renderer-BMy8jXhL.mjs +0 -5
  428. package/dist/renderer-BUxENp9L.mjs +0 -5
  429. package/dist/renderer-C-ebryrM.mjs +0 -5
  430. package/dist/renderer-C8Gbs3kr.mjs +0 -5
  431. package/dist/renderer-CFZvMv2-.mjs +0 -5
  432. package/dist/renderer-CGXW7mOs.mjs +0 -5
  433. package/dist/renderer-CNq6OGbb.mjs +0 -5
  434. package/dist/renderer-CO-Ddz6-.mjs +0 -5
  435. package/dist/renderer-CRdxAsP7.mjs +0 -5
  436. package/dist/renderer-CZLo0ALi.mjs +0 -5
  437. package/dist/renderer-CdvVUkhR.mjs +0 -5
  438. package/dist/renderer-Cjg7kmTq.mjs +0 -5
  439. package/dist/renderer-Cvz22ZSh.mjs +0 -3
  440. package/dist/renderer-CxKymhVa.mjs +0 -5
  441. package/dist/renderer-Cxlpu3pN.mjs +0 -5
  442. package/dist/renderer-Cz6qZ2Ii.mjs +0 -5
  443. package/dist/renderer-DDGvF2YA.mjs +0 -5
  444. package/dist/renderer-DFxtOKpi.mjs +0 -5
  445. package/dist/renderer-DGBNjTsB.mjs +0 -6
  446. package/dist/renderer-DRLtfxdW.mjs.map +0 -1
  447. package/dist/renderer-DUFcdZmw.mjs +0 -5
  448. package/dist/renderer-DUMu6EOH.mjs +0 -5
  449. package/dist/renderer-DdULrvJo.mjs +0 -5
  450. package/dist/renderer-DoaOOP6_.mjs +0 -5
  451. package/dist/renderer-DqmZqV-a.mjs +0 -5
  452. package/dist/renderer-LxTQ2E-G.mjs +0 -5
  453. package/dist/renderer-SpU-RddZ.mjs +0 -5
  454. package/dist/renderer-W6ahCM9z.mjs +0 -5
  455. package/dist/renderer-gGqtzw-S.mjs +0 -5
  456. package/dist/renderer-l0Wn1AoV.mjs +0 -5
  457. package/dist/renderer-rpXHvMZG.mjs +0 -5
  458. package/dist/renderer-twdsKOiz.mjs +0 -5
  459. package/dist/renderer-uJz-eIqO.mjs +0 -5
  460. package/dist/src-DggYlKaX.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DYT4iPi-.mjs","names":[],"sources":["../../../nodes/node-layer-style/dist/renderers-B2ikmOEm.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, PREMULTIPLIED_BLEND, createFullscreenPipeline, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nfunction hexToRgba(hex) {\n\tif (!hex) return [\n\t\t1,\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tlet cleaned = hex.trim().replace(/^#/, \"\");\n\tif (cleaned.length === 3) cleaned = cleaned.split(\"\").map((c) => c + c).join(\"\") + \"ff\";\n\telse if (cleaned.length === 6) cleaned = cleaned + \"ff\";\n\telse if (cleaned.length === 8) {} else return [\n\t\t1,\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tconst r = parseInt(cleaned.slice(0, 2), 16) / 255;\n\tconst g = parseInt(cleaned.slice(2, 4), 16) / 255;\n\tconst b = parseInt(cleaned.slice(4, 6), 16) / 255;\n\tconst a = parseInt(cleaned.slice(6, 8), 16) / 255;\n\treturn [\n\t\tNumber.isFinite(r) ? r : 1,\n\t\tNumber.isFinite(g) ? g : 1,\n\t\tNumber.isFinite(b) ? b : 1,\n\t\tNumber.isFinite(a) ? a : 1\n\t];\n}\nconst BLEND_MODE_MAP = {\n\tnormal: 0,\n\t\"source-over\": 0,\n\tmultiply: 1,\n\tscreen: 2,\n\toverlay: 3,\n\tdarken: 4,\n\tlighten: 5,\n\t\"color-dodge\": 6,\n\t\"color-burn\": 7,\n\t\"hard-light\": 8,\n\t\"soft-light\": 9,\n\tdifference: 10,\n\texclusion: 11,\n\thue: 12,\n\tsaturation: 13,\n\tcolor: 14,\n\tluminosity: 15,\n\t\"mask-in\": 16,\n\t\"destination-in\": 16,\n\t\"mask-out\": 17,\n\t\"destination-out\": 17,\n\t\"source-in\": 18,\n\t\"source-out\": 19,\n\t\"source-atop\": 20,\n\t\"destination-over\": 21,\n\t\"destination-atop\": 22,\n\tlighter: 23,\n\tcopy: 24,\n\txor: 25\n};\nconst BEVEL_STYLE_MAP = {\n\tInnerBevel: 0,\n\tOuterBevel: 1,\n\tEmboss: 2,\n\tPillowEmboss: 3\n};\nconst BEVEL_TECHNIQUE_MAP = {\n\tSmooth: 0,\n\tChiselHard: 1,\n\tChiselSoft: 2\n};\nconst STROKE_POS_MAP = {\n\toutside: 0,\n\tcenter: 1,\n\tinside: 2\n};\n/** Blur, glow and stroke kernels in the shader stop at this radius, px. */\nconst MAX_KERNEL = 24;\nconst WGSL_LAYER_STYLE_SHADER = `\nstruct LayerStyleUniforms {\n\t// Drop Shadow (vec4 x 3)\n\tdropShadowColor : vec4<f32>,\n\tdropShadowParams : vec4<f32>, // x: enabled, y: opacity, z: angle(rad), w: distance\n\tdropShadowParams2 : vec4<f32>, // x: spread, y: size, z: blendMode, w: pad\n\n\t// Inner Shadow (vec4 x 3)\n\tinnerShadowColor : vec4<f32>,\n\tinnerShadowParams : vec4<f32>, // x: enabled, y: opacity, z: angle(rad), w: distance\n\tinnerShadowParams2 : vec4<f32>, // x: choke, y: size, z: blendMode, w: pad\n\n\t// Outer Glow (vec4 x 3)\n\touterGlowColor : vec4<f32>,\n\touterGlowParams : vec4<f32>, // x: enabled, y: opacity, z: size, w: spread\n\touterGlowParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Inner Glow (vec4 x 3)\n\tinnerGlowColor : vec4<f32>,\n\tinnerGlowParams : vec4<f32>, // x: enabled, y: opacity, z: size, w: spread\n\tinnerGlowParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Stroke (vec4 x 3)\n\tstrokeColor : vec4<f32>,\n\tstrokeParams : vec4<f32>, // x: enabled, y: size, z: position(0:out,1:center,2:in), w: opacity\n\tstrokeParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Bevel & Emboss (vec4 x 5)\n\tbevelHighlightColor : vec4<f32>,\n\tbevelShadowColor : vec4<f32>,\n\tbevelParams1 : vec4<f32>, // x: enabled, y: style, z: technique, w: depth\n\tbevelParams2 : vec4<f32>, // x: direction(1:up, -1:down), y: size, z: soften, w: angle(rad)\n\tbevelParams3 : vec4<f32>, // x: altitude(rad), y: hlOpacity, z: shOpacity, w: pad\n\n\t// Color Overlay (vec4 x 2)\n\tcolorOverlayColor : vec4<f32>,\n\tcolorOverlayParams : vec4<f32>, // x: enabled, y: opacity, z: blendMode, w: pad\n};\n\n@group(0) @binding(0) var<uniform> u : LayerStyleUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn sampleAlpha(uv: vec2<f32>) -> f32 {\n\tif (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n\t\treturn 0.0;\n\t}\n\treturn textureSampleLevel(tex, samp, uv, 0.0).a;\n}\n\nfn lum(c: vec3<f32>) -> f32 {\n\treturn 0.3 * c.r + 0.59 * c.g + 0.11 * c.b;\n}\n\nfn clip_color(c: vec3<f32>) -> vec3<f32> {\n\tlet l = lum(c);\n\tlet n = min(min(c.r, c.g), c.b);\n\tlet x = max(max(c.r, c.g), c.b);\n\tvar res = c;\n\tif (n < 0.0) {\n\t\tres = l + (((res - l) * l) / max(l - n, 1e-5));\n\t}\n\tif (x > 1.0) {\n\t\tres = l + (((res - l) * (1.0 - l)) / max(x - l, 1e-5));\n\t}\n\treturn res;\n}\n\nfn set_lum(c: vec3<f32>, l: f32) -> vec3<f32> {\n\tlet diff = l - lum(c);\n\treturn clip_color(c + vec3<f32>(diff));\n}\n\nfn sat(c: vec3<f32>) -> f32 {\n\treturn max(max(c.r, c.g), c.b) - min(min(c.r, c.g), c.b);\n}\n\nfn set_sat(c: vec3<f32>, s: f32) -> vec3<f32> {\n\tlet c_min = min(min(c.r, c.g), c.b);\n\tlet c_max = max(max(c.r, c.g), c.b);\n\tif (c_max <= c_min) {\n\t\treturn vec3<f32>(0.0);\n\t}\n\treturn (c - vec3<f32>(c_min)) * s / max(c_max - c_min, 1e-5);\n}\n\nfn blendRgb(d_rgb: vec3<f32>, s_rgb: vec3<f32>, mode: u32) -> vec3<f32> {\n\tswitch (mode) {\n\t\tcase 1u: { // multiply\n\t\t\treturn d_rgb * s_rgb;\n\t\t}\n\t\tcase 2u: { // screen\n\t\t\treturn d_rgb + s_rgb - d_rgb * s_rgb;\n\t\t}\n\t\tcase 3u: { // overlay\n\t\t\treturn select(\n\t\t\t\t1.0 - 2.0 * (1.0 - d_rgb) * (1.0 - s_rgb),\n\t\t\t\t2.0 * d_rgb * s_rgb,\n\t\t\t\td_rgb < vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 4u: { // darken\n\t\t\treturn min(d_rgb, s_rgb);\n\t\t}\n\t\tcase 5u: { // lighten\n\t\t\treturn max(d_rgb, s_rgb);\n\t\t}\n\t\tcase 6u: { // color-dodge\n\t\t\treturn select(min(d_rgb / max(1.0 - s_rgb, vec3<f32>(1e-4)), vec3<f32>(1.0)), vec3<f32>(1.0), s_rgb >= vec3<f32>(0.999));\n\t\t}\n\t\tcase 7u: { // color-burn\n\t\t\treturn select(1.0 - min((1.0 - d_rgb) / max(s_rgb, vec3<f32>(1e-4)), vec3<f32>(1.0)), vec3<f32>(0.0), s_rgb <= vec3<f32>(0.001));\n\t\t}\n\t\tcase 8u: { // hard-light\n\t\t\treturn select(\n\t\t\t\t1.0 - 2.0 * (1.0 - d_rgb) * (1.0 - s_rgb),\n\t\t\t\t2.0 * d_rgb * s_rgb,\n\t\t\t\ts_rgb < vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 9u: { // soft-light\n\t\t\treturn select(\n\t\t\t\td_rgb + (2.0 * s_rgb - 1.0) * (sqrt(d_rgb) - d_rgb),\n\t\t\t\td_rgb - (1.0 - 2.0 * s_rgb) * d_rgb * (1.0 - d_rgb),\n\t\t\t\ts_rgb <= vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 10u: { // difference\n\t\t\treturn abs(d_rgb - s_rgb);\n\t\t}\n\t\tcase 11u: { // exclusion\n\t\t\treturn d_rgb + s_rgb - 2.0 * d_rgb * s_rgb;\n\t\t}\n\t\tcase 12u: { // hue\n\t\t\treturn set_lum(set_sat(s_rgb, sat(d_rgb)), lum(d_rgb));\n\t\t}\n\t\tcase 13u: { // saturation\n\t\t\treturn set_lum(set_sat(d_rgb, sat(s_rgb)), lum(d_rgb));\n\t\t}\n\t\tcase 14u: { // color\n\t\t\treturn set_lum(s_rgb, lum(d_rgb));\n\t\t}\n\t\tcase 15u: { // luminosity\n\t\t\treturn set_lum(d_rgb, lum(s_rgb));\n\t\t}\n\t\tdefault: { // normal / source-over\n\t\t\treturn s_rgb;\n\t\t}\n\t}\n}\n\nfn compositeLayer(dst: vec4<f32>, src: vec4<f32>, blendMode: u32) -> vec4<f32> {\n\tlet sa = clamp(src.a, 0.0, 1.0);\n\tif (sa <= 0.0001) {\n\t\treturn dst;\n\t}\n\tlet da = clamp(dst.a, 0.0, 1.0);\n\tif (da <= 0.0001) {\n\t\treturn src;\n\t}\n\n\tswitch (blendMode) {\n\t\tcase 16u: { return dst * sa; } // mask-in / destination-in\n\t\tcase 17u: { return dst * (1.0 - sa); } // mask-out / destination-out\n\t\tcase 18u: { return src * da; } // source-in\n\t\tcase 19u: { return src * (1.0 - da); } // source-out\n\t\tcase 20u: { return src * da + dst * (1.0 - sa); } // source-atop\n\t\tcase 21u: { return dst + src * (1.0 - da); } // destination-over\n\t\tcase 22u: { return dst * sa + src * (1.0 - da); } // destination-atop\n\t\tcase 23u: { return src + dst; } // lighter / add\n\t\tcase 24u: { return src; } // copy\n\t\tcase 25u: { return src * (1.0 - da) + dst * (1.0 - sa); } // xor\n\t\tdefault: {}\n\t}\n\n\tlet b_rgb = blendRgb(dst.rgb, src.rgb, blendMode);\n\tlet out_a = sa + da * (1.0 - sa);\n\tlet out_rgb = select(\n\t\t((1.0 - da) * src.rgb + (1.0 - sa) * dst.rgb + sa * da * b_rgb) / max(out_a, 1e-5),\n\t\tb_rgb,\n\t\tout_a <= 1e-4\n\t);\n\n\treturn vec4<f32>(out_rgb, out_a);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / max(dimensions, vec2<f32>(1.0, 1.0));\n\tlet origColor = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tlet origA = origColor.a;\n\n\tvar result = vec4<f32>(0.0);\n\n\t// =========================================================================\n\t// 1. DROP SHADOW (Bottom Layer)\n\t// =========================================================================\n\tif (u.dropShadowParams.x > 0.5) {\n\t\tlet opacity = u.dropShadowParams.y;\n\t\tlet angle = u.dropShadowParams.z;\n\t\tlet distance = u.dropShadowParams.w;\n\t\tlet spread = u.dropShadowParams2.x;\n\t\tlet size = u.dropShadowParams2.y;\n\t\tlet blendMode = u32(u.dropShadowParams2.z);\n\n\t\tlet shadowOffset = vec2<f32>(-cos(angle), sin(angle)) * distance * texelSize;\n\t\tlet shadowCenterUv = in.uv - shadowOffset;\n\n\t\tvar shadowAccum = 0.0;\n\t\tvar shadowWeightSum = 0.0;\n\n\t\tlet sigma = max(0.5, size * 0.4);\n\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\n\t\tif (size <= 0.5) {\n\t\t\tshadowAccum = sampleAlpha(shadowCenterUv);\n\t\t\tshadowWeightSum = 1.0;\n\t\t} else {\n\t\t\tlet stepVal = max(1, sampleRadius / 8);\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tlet weight = exp(-0.5 * distSq / (sigma * sigma));\n\t\t\t\t\tshadowAccum += sampleAlpha(shadowCenterUv + offset) * weight;\n\t\t\t\t\tshadowWeightSum += weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet blurredShadow = shadowAccum / max(shadowWeightSum, 1e-4);\n\t\tlet spreadFactor = spread / 100.0;\n\t\tlet finalShadowAlpha = clamp(blurredShadow / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0) * opacity;\n\n\t\tif (finalShadowAlpha > 0.001) {\n\t\t\tlet shadowCol = vec4<f32>(u.dropShadowColor.rgb, finalShadowAlpha);\n\t\t\tresult = compositeLayer(result, shadowCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 2. OUTER GLOW\n\t// =========================================================================\n\tif (u.outerGlowParams.x > 0.5) {\n\t\tlet opacity = u.outerGlowParams.y;\n\t\tlet size = u.outerGlowParams.z;\n\t\tlet spread = u.outerGlowParams.w;\n\t\tlet blendMode = u32(u.outerGlowParams2.x);\n\n\t\tvar glowAccum = 0.0;\n\t\tvar glowWeightSum = 0.0;\n\t\tlet sigma = max(0.5, size * 0.4);\n\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\n\t\tif (size <= 0.5) {\n\t\t\tglowAccum = origA;\n\t\t\tglowWeightSum = 1.0;\n\t\t} else {\n\t\t\tlet stepVal = max(1, sampleRadius / 8);\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tlet weight = exp(-0.5 * distSq / (sigma * sigma));\n\t\t\t\t\tglowAccum += sampleAlpha(in.uv + offset) * weight;\n\t\t\t\t\tglowWeightSum += weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet blurredGlow = glowAccum / max(glowWeightSum, 1e-4);\n\t\tlet spreadFactor = spread / 100.0;\n\t\tlet spreadGlow = clamp(blurredGlow / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0);\n\t\tlet finalGlowAlpha = max(0.0, spreadGlow - origA) * opacity;\n\n\t\tif (finalGlowAlpha > 0.001) {\n\t\t\tlet glowCol = vec4<f32>(u.outerGlowColor.rgb, finalGlowAlpha);\n\t\t\tresult = compositeLayer(result, glowCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 3. OUTSIDE STROKE\n\t// =========================================================================\n\tif (u.strokeParams.x > 0.5 && u.strokeParams.z < 0.5) { // position == 0: outside\n\t\tlet size = u.strokeParams.y;\n\t\tlet opacity = u.strokeParams.w;\n\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\tvar maxAlpha = 0.0;\n\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\t\tlet sizeSq = size * size;\n\n\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\tif (distSq <= sizeSq) {\n\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\tmaxAlpha = max(maxAlpha, sAlpha);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet strokeAlpha = clamp(maxAlpha - origA, 0.0, 1.0) * opacity;\n\t\tif (strokeAlpha > 0.001) {\n\t\t\tlet strokeCol = vec4<f32>(u.strokeColor.rgb, strokeAlpha);\n\t\t\tresult = compositeLayer(result, strokeCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 4. BASE IMAGE LAYER (with Color Overlay, Bevel & Emboss, Inner Glow/Shadow)\n\t// =========================================================================\n\tif (origA > 0.001) {\n\t\tvar baseRgb = origColor.rgb;\n\n\t\t// Color Overlay\n\t\tif (u.colorOverlayParams.x > 0.5) {\n\t\t\tlet overlayOpacity = u.colorOverlayParams.y;\n\t\t\tlet overlayBlendMode = u32(u.colorOverlayParams.z);\n\t\t\tlet blendedOverlay = blendRgb(baseRgb, u.colorOverlayColor.rgb, overlayBlendMode);\n\t\t\tbaseRgb = mix(baseRgb, blendedOverlay, overlayOpacity);\n\t\t}\n\n\t\t// Bevel & Emboss\n\t\tif (u.bevelParams1.x > 0.5) {\n\t\t\tlet style = u.bevelParams1.y;\n\t\t\tlet technique = u.bevelParams1.z;\n\t\t\tlet depth = u.bevelParams1.w / 100.0;\n\t\t\tlet direction = u.bevelParams2.x;\n\t\t\tlet bevelSize = max(0.5, u.bevelParams2.y);\n\t\t\tlet soften = u.bevelParams2.z;\n\t\t\tlet lightAngle = u.bevelParams2.w;\n\t\t\tlet lightAltitude = u.bevelParams3.x;\n\t\t\tlet hlOpacity = u.bevelParams3.y;\n\t\t\tlet shOpacity = u.bevelParams3.z;\n\n\t\t\tlet lightDir = normalize(vec3<f32>(\n\t\t\t\t-cos(lightAngle) * cos(lightAltitude),\n\t\t\t\tsin(lightAngle) * cos(lightAltitude),\n\t\t\t\tsin(lightAltitude)\n\t\t\t));\n\n\t\t\tlet stepSize = max(1.0, bevelSize * 0.5 + soften) * texelSize;\n\t\t\tlet aL = sampleAlpha(in.uv - vec2<f32>(stepSize.x, 0.0));\n\t\t\tlet aR = sampleAlpha(in.uv + vec2<f32>(stepSize.x, 0.0));\n\t\t\tlet aT = sampleAlpha(in.uv - vec2<f32>(0.0, stepSize.y));\n\t\t\tlet aB = sampleAlpha(in.uv + vec2<f32>(0.0, stepSize.y));\n\n\t\t\tvar dx = (aR - aL) * depth * direction;\n\t\t\tvar dy = (aB - aT) * depth * direction;\n\n\t\t\tif (technique > 0.5) { // ChiselHard or ChiselSoft\n\t\t\t\tlet rampFactor = select(2.0, 1.5, technique > 1.5);\n\t\t\t\tdx = clamp(dx * rampFactor, -1.0, 1.0);\n\t\t\t\tdy = clamp(dy * rampFactor, -1.0, 1.0);\n\t\t\t}\n\n\t\t\tlet normal = normalize(vec3<f32>(-dx, -dy, 1.0));\n\t\t\tlet nDotL = dot(normal, lightDir);\n\n\t\t\tlet highlightAmount = max(0.0, nDotL) * hlOpacity;\n\t\t\tlet shadowAmount = max(0.0, -nDotL) * shOpacity;\n\n\t\t\tlet hlColor = mix(baseRgb, u.bevelHighlightColor.rgb + baseRgb, highlightAmount);\n\t\t\tlet shColor = mix(baseRgb, baseRgb * (1.0 - shadowAmount) + u.bevelShadowColor.rgb * shadowAmount, shadowAmount);\n\t\t\tbaseRgb = mix(shColor, hlColor, clamp(nDotL * 0.5 + 0.5, 0.0, 1.0));\n\t\t}\n\n\t\t// Inner Glow\n\t\tif (u.innerGlowParams.x > 0.5) {\n\t\t\tlet igOpacity = u.innerGlowParams.y;\n\t\t\tlet igSize = u.innerGlowParams.z;\n\t\t\tlet igSpread = u.innerGlowParams.w;\n\t\t\tlet igBlendMode = u32(u.innerGlowParams2.x);\n\n\t\t\tvar innerAccum = 0.0;\n\t\t\tvar innerWeight = 0.0;\n\t\t\tlet sigma = max(0.5, igSize * 0.4);\n\t\t\tlet sampleRadius = min(i32(ceil(igSize)), 16);\n\t\t\tlet stepVal = max(1, sampleRadius / 6);\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet weight = exp(-0.5 * f32(x * x + y * y) / (sigma * sigma));\n\t\t\t\t\tinnerAccum += sampleAlpha(in.uv + offset) * weight;\n\t\t\t\t\tinnerWeight += weight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet blurredInner = innerAccum / max(innerWeight, 1e-4);\n\t\t\tlet innerGlowMask = max(0.0, origA - blurredInner);\n\t\t\tlet spreadFactor = igSpread / 100.0;\n\t\t\tlet finalInnerGlowAlpha = clamp(innerGlowMask / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0) * igOpacity;\n\n\t\t\tif (finalInnerGlowAlpha > 0.001) {\n\t\t\t\tlet igBlended = blendRgb(baseRgb, u.innerGlowColor.rgb, igBlendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, igBlended, finalInnerGlowAlpha);\n\t\t\t}\n\t\t}\n\n\t\t// Inner Shadow\n\t\tif (u.innerShadowParams.x > 0.5) {\n\t\t\tlet isOpacity = u.innerShadowParams.y;\n\t\t\tlet isAngle = u.innerShadowParams.z;\n\t\t\tlet isDistance = u.innerShadowParams.w;\n\t\t\tlet isChoke = u.innerShadowParams2.x;\n\t\t\tlet isSize = u.innerShadowParams2.y;\n\t\t\tlet isBlendMode = u32(u.innerShadowParams2.z);\n\n\t\t\tlet isOffset = vec2<f32>(-cos(isAngle), sin(isAngle)) * isDistance * texelSize;\n\t\t\tlet shiftedA = sampleAlpha(in.uv + isOffset);\n\n\t\t\tvar isAccum = 0.0;\n\t\t\tvar isWeight = 0.0;\n\t\t\tlet sigma = max(0.5, isSize * 0.4);\n\t\t\tlet sampleRadius = min(i32(ceil(isSize)), 16);\n\t\t\tlet stepVal = max(1, sampleRadius / 6);\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet weight = exp(-0.5 * f32(x * x + y * y) / (sigma * sigma));\n\t\t\t\t\tlet sShifted = sampleAlpha(in.uv + isOffset + offset);\n\t\t\t\t\tlet sOrig = sampleAlpha(in.uv + offset);\n\t\t\t\t\tisAccum += max(0.0, sOrig - sShifted) * weight;\n\t\t\t\t\tisWeight += weight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet blurredIS = isAccum / max(isWeight, 1e-4);\n\t\t\tlet chokeFactor = isChoke / 100.0;\n\t\t\tlet finalISAlpha = clamp(blurredIS / max(1.0 - chokeFactor * 0.95, 0.01), 0.0, 1.0) * isOpacity;\n\n\t\t\tif (finalISAlpha > 0.001) {\n\t\t\t\tlet isBlended = blendRgb(baseRgb, u.innerShadowColor.rgb, isBlendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, isBlended, finalISAlpha);\n\t\t\t}\n\t\t}\n\n\t\t// Inside Stroke\n\t\tif (u.strokeParams.x > 0.5 && u.strokeParams.z > 1.5) { // position == 2: inside\n\t\t\tlet size = u.strokeParams.y;\n\t\t\tlet opacity = u.strokeParams.w;\n\t\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\t\tvar minAlpha = 1.0;\n\t\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\t\t\tlet sizeSq = size * size;\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tif (distSq <= sizeSq) {\n\t\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\t\tminAlpha = min(minAlpha, sAlpha);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet insideStrokeAlpha = clamp(origA - minAlpha, 0.0, 1.0) * opacity;\n\t\t\tif (insideStrokeAlpha > 0.001) {\n\t\t\t\tlet sBlended = blendRgb(baseRgb, u.strokeColor.rgb, blendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, sBlended, insideStrokeAlpha);\n\t\t\t}\n\t\t}\n\n\t\tlet baseLayer = vec4<f32>(baseRgb, origA);\n\t\tresult = compositeLayer(result, baseLayer, 0u);\n\t}\n\n\t// =========================================================================\n\t// 5. CENTER STROKE\n\t// =========================================================================\n\tif (u.strokeParams.x > 0.5 && u.strokeParams.z >= 0.5 && u.strokeParams.z <= 1.5) { // position == 1: center\n\t\tlet size = u.strokeParams.y;\n\t\tlet opacity = u.strokeParams.w;\n\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\tvar maxAlpha = 0.0;\n\t\tvar minAlpha = 1.0;\n\t\tlet halfSize = max(0.5, size * 0.5);\n\t\tlet sampleRadius = min(i32(ceil(halfSize)), ${MAX_KERNEL});\n\t\tlet halfSizeSq = halfSize * halfSize;\n\n\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\tif (distSq <= halfSizeSq) {\n\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\tmaxAlpha = max(maxAlpha, sAlpha);\n\t\t\t\t\tminAlpha = min(minAlpha, sAlpha);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet centerStrokeAlpha = clamp(maxAlpha - minAlpha, 0.0, 1.0) * opacity;\n\t\tif (centerStrokeAlpha > 0.001) {\n\t\t\tlet strokeCol = vec4<f32>(u.strokeColor.rgb, centerStrokeAlpha);\n\t\t\tresult = compositeLayer(result, strokeCol, blendMode);\n\t\t}\n\t}\n\n\t// Output premultiplied alpha for QuadPipeline / WebGPU rendering\n\treturn vec4<f32>(result.rgb * result.a, result.a);\n}\n`;\nconst resourcesCache = /* @__PURE__ */ new WeakMap();\nfunction getLayerStyleResources(device, format) {\n\tlet res = resourcesCache.get(device);\n\tif (res) return res;\n\tconst module = device.createShaderModule({ code: WGSL_LAYER_STYLE_SHADER });\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule,\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tformat,\n\t\t\tblend: PREMULTIPLIED_BLEND\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout\n\t};\n\tresourcesCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(88);\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"LayerStyle\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : (props.frame ?? 0) / (props.fps || 30);\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => {\n\t\tif (handleId && op.inputs?.[handleId]?.connectionValid) {\n\t\t\tconst outputItem = op.inputs[handleId].outputItem;\n\t\t\tif (!outputItem) return Math.max(clampMin, Math.min(clampMax, fallbackVal));\n\t\t\tif (outputItem.type === \"Number\") {\n\t\t\t\tconst numVal = typeof outputItem.data === \"number\" ? outputItem.data : outputItem.data?.value ?? fallbackVal;\n\t\t\t\treturn Math.max(clampMin, Math.min(clampMax, numVal));\n\t\t\t}\n\t\t\tif (outputItem.type === \"Signal\") {\n\t\t\t\tconst data = outputItem.data;\n\t\t\t\tif (typeof data === \"number\") return Math.max(clampMin, Math.min(clampMax, data));\n\t\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\t\tif (typeof data.value === \"number\") return Math.max(clampMin, Math.min(clampMax, data.value));\n\t\t\t\t\tconst amp = typeof data.amplitude === \"number\" ? data.amplitude : 1;\n\t\t\t\t\tconst freq = typeof data.frequency === \"number\" ? data.frequency : 1;\n\t\t\t\t\tconst phase = typeof data.phase === \"number\" ? data.phase : 0;\n\t\t\t\t\tconst offset = typeof data.offset === \"number\" ? data.offset : fallbackVal;\n\t\t\t\t\tconst t = elapsedSeconds;\n\t\t\t\t\tconst computed = offset + amp * Math.sin(2 * Math.PI * freq * t + phase);\n\t\t\t\t\treturn Math.max(clampMin, Math.min(clampMax, computed));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Math.max(clampMin, Math.min(clampMax, fallbackVal));\n\t};\n\tconst childW = width;\n\tconst childH = height;\n\tconst childTex = ctx.renderer.getTemporaryTexture(childW, childH, [...props.excludeTextures || [], targetTexture]);\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, childW, childH, \"clear\").end();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\tcontainerWidth: childW,\n\t\tcontainerHeight: childH\n\t}, childView, childTex, childW, childH);\n\tconst inputTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst inputView = inputTex.createView();\n\tconst inputPass = ctx.renderer.beginFrame(encoder, inputView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\");\n\tctx.renderer.drawTexture(inputPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: childW,\n\t\theight: childH\n\t}, { opacity: 1 });\n\tinputPass.end();\n\tconst { pipeline, uniformLayout, textureLayout } = getLayerStyleResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst ds = op.dropShadow ?? {};\n\tconst is = op.innerShadow ?? {};\n\tconst og = op.outerGlow ?? {};\n\tconst ig = op.innerGlow ?? {};\n\tconst st = op.stroke ?? {};\n\tconst be = op.bevelEmboss ?? {};\n\tconst co = op.colorOverlay ?? {};\n\tconst dsCol = hexToRgba(ds.color ?? \"#000000\");\n\tconst dsOpacity = resolveField(op.dropShadowOpacityHandleId, ds.opacity ?? .75, 0, 1);\n\tconst dsAngle = resolveField(op.dropShadowAngleHandleId, ds.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst dsDist = resolveField(op.dropShadowDistanceHandleId, ds.distance ?? 10, 0, 500);\n\tconst dsSpread = resolveField(op.dropShadowSpreadHandleId, ds.spread ?? 0, 0, 100);\n\tconst dsSize = resolveField(op.dropShadowSizeHandleId, ds.size ?? 10, 0, 250);\n\tconst dsBlend = BLEND_MODE_MAP[ds.blendMode ?? \"multiply\"] ?? 1;\n\tconst isCol = hexToRgba(is.color ?? \"#000000\");\n\tconst isOpacity = resolveField(op.innerShadowOpacityHandleId, is.opacity ?? .75, 0, 1);\n\tconst isAngle = resolveField(op.innerShadowAngleHandleId, is.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst isDist = resolveField(op.innerShadowDistanceHandleId, is.distance ?? 5, 0, 500);\n\tconst isChoke = resolveField(op.innerShadowChokeHandleId, is.choke ?? 0, 0, 100);\n\tconst isSize = resolveField(op.innerShadowSizeHandleId, is.size ?? 5, 0, 250);\n\tconst isBlend = BLEND_MODE_MAP[is.blendMode ?? \"multiply\"] ?? 1;\n\tconst ogCol = hexToRgba(og.color ?? \"#ffffff\");\n\tconst ogOpacity = resolveField(op.outerGlowOpacityHandleId, og.opacity ?? .75, 0, 1);\n\tconst ogSize = resolveField(op.outerGlowSizeHandleId, og.size ?? 15, 0, 250);\n\tconst ogSpread = resolveField(op.outerGlowSpreadHandleId, og.spread ?? 0, 0, 100);\n\tconst ogBlend = BLEND_MODE_MAP[og.blendMode ?? \"screen\"] ?? 2;\n\tconst igCol = hexToRgba(ig.color ?? \"#ffffff\");\n\tconst igOpacity = resolveField(op.innerGlowOpacityHandleId, ig.opacity ?? .75, 0, 1);\n\tconst igSize = resolveField(op.innerGlowSizeHandleId, ig.size ?? 15, 0, 250);\n\tconst igSpread = resolveField(op.innerGlowSpreadHandleId, ig.spread ?? 0, 0, 100);\n\tconst igBlend = BLEND_MODE_MAP[ig.blendMode ?? \"screen\"] ?? 2;\n\tconst stCol = hexToRgba(st.color ?? \"#ffffff\");\n\tconst stSize = resolveField(op.strokeSizeHandleId, st.size ?? 2, 0, 100);\n\tconst stPos = STROKE_POS_MAP[st.position ?? \"outside\"] ?? 0;\n\tconst stOpacity = resolveField(op.strokeOpacityHandleId, st.opacity ?? 1, 0, 1);\n\tconst stBlend = BLEND_MODE_MAP[st.blendMode ?? \"normal\"] ?? 0;\n\tconst beHlCol = hexToRgba(be.highlightColor ?? \"#ffffff\");\n\tconst beShCol = hexToRgba(be.shadowColor ?? \"#000000\");\n\tconst beStyle = BEVEL_STYLE_MAP[be.style ?? \"InnerBevel\"] ?? 0;\n\tconst beTech = BEVEL_TECHNIQUE_MAP[be.technique ?? \"Smooth\"] ?? 0;\n\tconst beDepth = resolveField(op.bevelEmbossDepthHandleId, be.depth ?? 100, 1, 1e3);\n\tconst beDir = be.direction === \"Down\" ? -1 : 1;\n\tconst beSize = resolveField(op.bevelEmbossSizeHandleId, be.size ?? 5, 0, 250);\n\tconst beSoften = resolveField(op.bevelEmbossSoftenHandleId, be.soften ?? 0, 0, 50);\n\tconst beAngle = resolveField(op.bevelEmbossAngleHandleId, be.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst beAltitude = resolveField(op.bevelEmbossAltitudeHandleId, be.altitude ?? 30, 0, 90) * Math.PI / 180;\n\tconst beHlOpacity = resolveField(op.bevelEmbossHighlightOpacityHandleId, be.highlightOpacity ?? .75, 0, 1);\n\tconst beShOpacity = resolveField(op.bevelEmbossShadowOpacityHandleId, be.shadowOpacity ?? .75, 0, 1);\n\tconst coCol = hexToRgba(co.color ?? \"#ff0000\");\n\tconst coOpacity = resolveField(op.colorOverlayOpacityHandleId, co.opacity ?? 1, 0, 1);\n\tconst coBlend = BLEND_MODE_MAP[co.blendMode ?? \"normal\"] ?? 0;\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = dsCol[0];\n\tuniformBufferData[1] = dsCol[1];\n\tuniformBufferData[2] = dsCol[2];\n\tuniformBufferData[3] = dsCol[3];\n\tuniformBufferData[4] = ds.enabled ? 1 : 0;\n\tuniformBufferData[5] = dsOpacity;\n\tuniformBufferData[6] = dsAngle;\n\tuniformBufferData[7] = dsDist;\n\tuniformBufferData[8] = dsSpread;\n\tuniformBufferData[9] = dsSize;\n\tuniformBufferData[10] = dsBlend;\n\tuniformBufferData[11] = 0;\n\tuniformBufferData[12] = isCol[0];\n\tuniformBufferData[13] = isCol[1];\n\tuniformBufferData[14] = isCol[2];\n\tuniformBufferData[15] = isCol[3];\n\tuniformBufferData[16] = is.enabled ? 1 : 0;\n\tuniformBufferData[17] = isOpacity;\n\tuniformBufferData[18] = isAngle;\n\tuniformBufferData[19] = isDist;\n\tuniformBufferData[20] = isChoke;\n\tuniformBufferData[21] = isSize;\n\tuniformBufferData[22] = isBlend;\n\tuniformBufferData[23] = 0;\n\tuniformBufferData[24] = ogCol[0];\n\tuniformBufferData[25] = ogCol[1];\n\tuniformBufferData[26] = ogCol[2];\n\tuniformBufferData[27] = ogCol[3];\n\tuniformBufferData[28] = og.enabled ? 1 : 0;\n\tuniformBufferData[29] = ogOpacity;\n\tuniformBufferData[30] = ogSize;\n\tuniformBufferData[31] = ogSpread;\n\tuniformBufferData[32] = ogBlend;\n\tuniformBufferData[33] = 0;\n\tuniformBufferData[34] = 0;\n\tuniformBufferData[35] = 0;\n\tuniformBufferData[36] = igCol[0];\n\tuniformBufferData[37] = igCol[1];\n\tuniformBufferData[38] = igCol[2];\n\tuniformBufferData[39] = igCol[3];\n\tuniformBufferData[40] = ig.enabled ? 1 : 0;\n\tuniformBufferData[41] = igOpacity;\n\tuniformBufferData[42] = igSize;\n\tuniformBufferData[43] = igSpread;\n\tuniformBufferData[44] = igBlend;\n\tuniformBufferData[45] = 0;\n\tuniformBufferData[46] = 0;\n\tuniformBufferData[47] = 0;\n\tuniformBufferData[48] = stCol[0];\n\tuniformBufferData[49] = stCol[1];\n\tuniformBufferData[50] = stCol[2];\n\tuniformBufferData[51] = stCol[3];\n\tuniformBufferData[52] = st.enabled ? 1 : 0;\n\tuniformBufferData[53] = stSize;\n\tuniformBufferData[54] = stPos;\n\tuniformBufferData[55] = stOpacity;\n\tuniformBufferData[56] = stBlend;\n\tuniformBufferData[57] = 0;\n\tuniformBufferData[58] = 0;\n\tuniformBufferData[59] = 0;\n\tuniformBufferData[60] = beHlCol[0];\n\tuniformBufferData[61] = beHlCol[1];\n\tuniformBufferData[62] = beHlCol[2];\n\tuniformBufferData[63] = beHlCol[3];\n\tuniformBufferData[64] = beShCol[0];\n\tuniformBufferData[65] = beShCol[1];\n\tuniformBufferData[66] = beShCol[2];\n\tuniformBufferData[67] = beShCol[3];\n\tuniformBufferData[68] = be.enabled ? 1 : 0;\n\tuniformBufferData[69] = beStyle;\n\tuniformBufferData[70] = beTech;\n\tuniformBufferData[71] = beDepth;\n\tuniformBufferData[72] = beDir;\n\tuniformBufferData[73] = beSize;\n\tuniformBufferData[74] = beSoften;\n\tuniformBufferData[75] = beAngle;\n\tuniformBufferData[76] = beAltitude;\n\tuniformBufferData[77] = beHlOpacity;\n\tuniformBufferData[78] = beShOpacity;\n\tuniformBufferData[79] = 0;\n\tuniformBufferData[80] = coCol[0];\n\tuniformBufferData[81] = coCol[1];\n\tuniformBufferData[82] = coCol[2];\n\tuniformBufferData[83] = coCol[3];\n\tuniformBufferData[84] = co.enabled ? 1 : 0;\n\tuniformBufferData[85] = coOpacity;\n\tuniformBufferData[86] = coBlend;\n\tuniformBufferData[87] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: inputView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tinputTex,\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n/**\n* How far a LayerStyle draws past its layer: the drop shadow's offset plus\n* its blur, the outer glow, an outside or centred stroke. Unknown (null)\n* when one of those sizes is driven by a connected signal. Keep in step with\n* the shader above: anything it draws farther out must count here, or a\n* compositor running the style over the layer's region will clip it.\n*/\nconst layerStyleReach = (operation) => {\n\tconst op = operation;\n\tconst driven = (handle) => typeof handle === \"string\" && op.inputs?.[handle]?.connectionValid === true;\n\tif (driven(op.dropShadowDistanceHandleId) || driven(op.dropShadowSizeHandleId) || driven(op.outerGlowSizeHandleId) || driven(op.strokeSizeHandleId)) return null;\n\tconst style = (v) => v && typeof v === \"object\" && \"_value\" in v ? v._value : v;\n\tconst kernel = (size) => Math.min(Math.ceil(size ?? 0), MAX_KERNEL);\n\tconst ds = style(op.dropShadow);\n\tconst og = style(op.outerGlow);\n\tconst st = style(op.stroke);\n\tlet r = 0;\n\tif (ds?.enabled) r = Math.max(r, (ds.distance ?? 0) + kernel(ds.size));\n\tif (og?.enabled) r = Math.max(r, kernel(og.size));\n\tif (st?.enabled && st.position !== \"inside\") r = Math.max(r, kernel(st.size));\n\treturn Math.ceil(r) + 2;\n};\nWebGPURenderer.reach = layerStyleReach;\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B2ikmOEm.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BgO6BA_z.mjs","names":[],"sources":["../../../nodes/node-layer-style/dist/renderers-B2ikmOEm.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, PREMULTIPLIED_BLEND, createFullscreenPipeline, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nfunction hexToRgba(hex) {\n\tif (!hex) return [\n\t\t1,\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tlet cleaned = hex.trim().replace(/^#/, \"\");\n\tif (cleaned.length === 3) cleaned = cleaned.split(\"\").map((c) => c + c).join(\"\") + \"ff\";\n\telse if (cleaned.length === 6) cleaned = cleaned + \"ff\";\n\telse if (cleaned.length === 8) {} else return [\n\t\t1,\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tconst r = parseInt(cleaned.slice(0, 2), 16) / 255;\n\tconst g = parseInt(cleaned.slice(2, 4), 16) / 255;\n\tconst b = parseInt(cleaned.slice(4, 6), 16) / 255;\n\tconst a = parseInt(cleaned.slice(6, 8), 16) / 255;\n\treturn [\n\t\tNumber.isFinite(r) ? r : 1,\n\t\tNumber.isFinite(g) ? g : 1,\n\t\tNumber.isFinite(b) ? b : 1,\n\t\tNumber.isFinite(a) ? a : 1\n\t];\n}\nconst BLEND_MODE_MAP = {\n\tnormal: 0,\n\t\"source-over\": 0,\n\tmultiply: 1,\n\tscreen: 2,\n\toverlay: 3,\n\tdarken: 4,\n\tlighten: 5,\n\t\"color-dodge\": 6,\n\t\"color-burn\": 7,\n\t\"hard-light\": 8,\n\t\"soft-light\": 9,\n\tdifference: 10,\n\texclusion: 11,\n\thue: 12,\n\tsaturation: 13,\n\tcolor: 14,\n\tluminosity: 15,\n\t\"mask-in\": 16,\n\t\"destination-in\": 16,\n\t\"mask-out\": 17,\n\t\"destination-out\": 17,\n\t\"source-in\": 18,\n\t\"source-out\": 19,\n\t\"source-atop\": 20,\n\t\"destination-over\": 21,\n\t\"destination-atop\": 22,\n\tlighter: 23,\n\tcopy: 24,\n\txor: 25\n};\nconst BEVEL_STYLE_MAP = {\n\tInnerBevel: 0,\n\tOuterBevel: 1,\n\tEmboss: 2,\n\tPillowEmboss: 3\n};\nconst BEVEL_TECHNIQUE_MAP = {\n\tSmooth: 0,\n\tChiselHard: 1,\n\tChiselSoft: 2\n};\nconst STROKE_POS_MAP = {\n\toutside: 0,\n\tcenter: 1,\n\tinside: 2\n};\n/** Blur, glow and stroke kernels in the shader stop at this radius, px. */\nconst MAX_KERNEL = 24;\nconst WGSL_LAYER_STYLE_SHADER = `\nstruct LayerStyleUniforms {\n\t// Drop Shadow (vec4 x 3)\n\tdropShadowColor : vec4<f32>,\n\tdropShadowParams : vec4<f32>, // x: enabled, y: opacity, z: angle(rad), w: distance\n\tdropShadowParams2 : vec4<f32>, // x: spread, y: size, z: blendMode, w: pad\n\n\t// Inner Shadow (vec4 x 3)\n\tinnerShadowColor : vec4<f32>,\n\tinnerShadowParams : vec4<f32>, // x: enabled, y: opacity, z: angle(rad), w: distance\n\tinnerShadowParams2 : vec4<f32>, // x: choke, y: size, z: blendMode, w: pad\n\n\t// Outer Glow (vec4 x 3)\n\touterGlowColor : vec4<f32>,\n\touterGlowParams : vec4<f32>, // x: enabled, y: opacity, z: size, w: spread\n\touterGlowParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Inner Glow (vec4 x 3)\n\tinnerGlowColor : vec4<f32>,\n\tinnerGlowParams : vec4<f32>, // x: enabled, y: opacity, z: size, w: spread\n\tinnerGlowParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Stroke (vec4 x 3)\n\tstrokeColor : vec4<f32>,\n\tstrokeParams : vec4<f32>, // x: enabled, y: size, z: position(0:out,1:center,2:in), w: opacity\n\tstrokeParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Bevel & Emboss (vec4 x 5)\n\tbevelHighlightColor : vec4<f32>,\n\tbevelShadowColor : vec4<f32>,\n\tbevelParams1 : vec4<f32>, // x: enabled, y: style, z: technique, w: depth\n\tbevelParams2 : vec4<f32>, // x: direction(1:up, -1:down), y: size, z: soften, w: angle(rad)\n\tbevelParams3 : vec4<f32>, // x: altitude(rad), y: hlOpacity, z: shOpacity, w: pad\n\n\t// Color Overlay (vec4 x 2)\n\tcolorOverlayColor : vec4<f32>,\n\tcolorOverlayParams : vec4<f32>, // x: enabled, y: opacity, z: blendMode, w: pad\n};\n\n@group(0) @binding(0) var<uniform> u : LayerStyleUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn sampleAlpha(uv: vec2<f32>) -> f32 {\n\tif (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n\t\treturn 0.0;\n\t}\n\treturn textureSampleLevel(tex, samp, uv, 0.0).a;\n}\n\nfn lum(c: vec3<f32>) -> f32 {\n\treturn 0.3 * c.r + 0.59 * c.g + 0.11 * c.b;\n}\n\nfn clip_color(c: vec3<f32>) -> vec3<f32> {\n\tlet l = lum(c);\n\tlet n = min(min(c.r, c.g), c.b);\n\tlet x = max(max(c.r, c.g), c.b);\n\tvar res = c;\n\tif (n < 0.0) {\n\t\tres = l + (((res - l) * l) / max(l - n, 1e-5));\n\t}\n\tif (x > 1.0) {\n\t\tres = l + (((res - l) * (1.0 - l)) / max(x - l, 1e-5));\n\t}\n\treturn res;\n}\n\nfn set_lum(c: vec3<f32>, l: f32) -> vec3<f32> {\n\tlet diff = l - lum(c);\n\treturn clip_color(c + vec3<f32>(diff));\n}\n\nfn sat(c: vec3<f32>) -> f32 {\n\treturn max(max(c.r, c.g), c.b) - min(min(c.r, c.g), c.b);\n}\n\nfn set_sat(c: vec3<f32>, s: f32) -> vec3<f32> {\n\tlet c_min = min(min(c.r, c.g), c.b);\n\tlet c_max = max(max(c.r, c.g), c.b);\n\tif (c_max <= c_min) {\n\t\treturn vec3<f32>(0.0);\n\t}\n\treturn (c - vec3<f32>(c_min)) * s / max(c_max - c_min, 1e-5);\n}\n\nfn blendRgb(d_rgb: vec3<f32>, s_rgb: vec3<f32>, mode: u32) -> vec3<f32> {\n\tswitch (mode) {\n\t\tcase 1u: { // multiply\n\t\t\treturn d_rgb * s_rgb;\n\t\t}\n\t\tcase 2u: { // screen\n\t\t\treturn d_rgb + s_rgb - d_rgb * s_rgb;\n\t\t}\n\t\tcase 3u: { // overlay\n\t\t\treturn select(\n\t\t\t\t1.0 - 2.0 * (1.0 - d_rgb) * (1.0 - s_rgb),\n\t\t\t\t2.0 * d_rgb * s_rgb,\n\t\t\t\td_rgb < vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 4u: { // darken\n\t\t\treturn min(d_rgb, s_rgb);\n\t\t}\n\t\tcase 5u: { // lighten\n\t\t\treturn max(d_rgb, s_rgb);\n\t\t}\n\t\tcase 6u: { // color-dodge\n\t\t\treturn select(min(d_rgb / max(1.0 - s_rgb, vec3<f32>(1e-4)), vec3<f32>(1.0)), vec3<f32>(1.0), s_rgb >= vec3<f32>(0.999));\n\t\t}\n\t\tcase 7u: { // color-burn\n\t\t\treturn select(1.0 - min((1.0 - d_rgb) / max(s_rgb, vec3<f32>(1e-4)), vec3<f32>(1.0)), vec3<f32>(0.0), s_rgb <= vec3<f32>(0.001));\n\t\t}\n\t\tcase 8u: { // hard-light\n\t\t\treturn select(\n\t\t\t\t1.0 - 2.0 * (1.0 - d_rgb) * (1.0 - s_rgb),\n\t\t\t\t2.0 * d_rgb * s_rgb,\n\t\t\t\ts_rgb < vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 9u: { // soft-light\n\t\t\treturn select(\n\t\t\t\td_rgb + (2.0 * s_rgb - 1.0) * (sqrt(d_rgb) - d_rgb),\n\t\t\t\td_rgb - (1.0 - 2.0 * s_rgb) * d_rgb * (1.0 - d_rgb),\n\t\t\t\ts_rgb <= vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 10u: { // difference\n\t\t\treturn abs(d_rgb - s_rgb);\n\t\t}\n\t\tcase 11u: { // exclusion\n\t\t\treturn d_rgb + s_rgb - 2.0 * d_rgb * s_rgb;\n\t\t}\n\t\tcase 12u: { // hue\n\t\t\treturn set_lum(set_sat(s_rgb, sat(d_rgb)), lum(d_rgb));\n\t\t}\n\t\tcase 13u: { // saturation\n\t\t\treturn set_lum(set_sat(d_rgb, sat(s_rgb)), lum(d_rgb));\n\t\t}\n\t\tcase 14u: { // color\n\t\t\treturn set_lum(s_rgb, lum(d_rgb));\n\t\t}\n\t\tcase 15u: { // luminosity\n\t\t\treturn set_lum(d_rgb, lum(s_rgb));\n\t\t}\n\t\tdefault: { // normal / source-over\n\t\t\treturn s_rgb;\n\t\t}\n\t}\n}\n\nfn compositeLayer(dst: vec4<f32>, src: vec4<f32>, blendMode: u32) -> vec4<f32> {\n\tlet sa = clamp(src.a, 0.0, 1.0);\n\tif (sa <= 0.0001) {\n\t\treturn dst;\n\t}\n\tlet da = clamp(dst.a, 0.0, 1.0);\n\tif (da <= 0.0001) {\n\t\treturn src;\n\t}\n\n\tswitch (blendMode) {\n\t\tcase 16u: { return dst * sa; } // mask-in / destination-in\n\t\tcase 17u: { return dst * (1.0 - sa); } // mask-out / destination-out\n\t\tcase 18u: { return src * da; } // source-in\n\t\tcase 19u: { return src * (1.0 - da); } // source-out\n\t\tcase 20u: { return src * da + dst * (1.0 - sa); } // source-atop\n\t\tcase 21u: { return dst + src * (1.0 - da); } // destination-over\n\t\tcase 22u: { return dst * sa + src * (1.0 - da); } // destination-atop\n\t\tcase 23u: { return src + dst; } // lighter / add\n\t\tcase 24u: { return src; } // copy\n\t\tcase 25u: { return src * (1.0 - da) + dst * (1.0 - sa); } // xor\n\t\tdefault: {}\n\t}\n\n\tlet b_rgb = blendRgb(dst.rgb, src.rgb, blendMode);\n\tlet out_a = sa + da * (1.0 - sa);\n\tlet out_rgb = select(\n\t\t((1.0 - da) * src.rgb + (1.0 - sa) * dst.rgb + sa * da * b_rgb) / max(out_a, 1e-5),\n\t\tb_rgb,\n\t\tout_a <= 1e-4\n\t);\n\n\treturn vec4<f32>(out_rgb, out_a);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / max(dimensions, vec2<f32>(1.0, 1.0));\n\tlet origColor = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tlet origA = origColor.a;\n\n\tvar result = vec4<f32>(0.0);\n\n\t// =========================================================================\n\t// 1. DROP SHADOW (Bottom Layer)\n\t// =========================================================================\n\tif (u.dropShadowParams.x > 0.5) {\n\t\tlet opacity = u.dropShadowParams.y;\n\t\tlet angle = u.dropShadowParams.z;\n\t\tlet distance = u.dropShadowParams.w;\n\t\tlet spread = u.dropShadowParams2.x;\n\t\tlet size = u.dropShadowParams2.y;\n\t\tlet blendMode = u32(u.dropShadowParams2.z);\n\n\t\tlet shadowOffset = vec2<f32>(-cos(angle), sin(angle)) * distance * texelSize;\n\t\tlet shadowCenterUv = in.uv - shadowOffset;\n\n\t\tvar shadowAccum = 0.0;\n\t\tvar shadowWeightSum = 0.0;\n\n\t\tlet sigma = max(0.5, size * 0.4);\n\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\n\t\tif (size <= 0.5) {\n\t\t\tshadowAccum = sampleAlpha(shadowCenterUv);\n\t\t\tshadowWeightSum = 1.0;\n\t\t} else {\n\t\t\tlet stepVal = max(1, sampleRadius / 8);\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tlet weight = exp(-0.5 * distSq / (sigma * sigma));\n\t\t\t\t\tshadowAccum += sampleAlpha(shadowCenterUv + offset) * weight;\n\t\t\t\t\tshadowWeightSum += weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet blurredShadow = shadowAccum / max(shadowWeightSum, 1e-4);\n\t\tlet spreadFactor = spread / 100.0;\n\t\tlet finalShadowAlpha = clamp(blurredShadow / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0) * opacity;\n\n\t\tif (finalShadowAlpha > 0.001) {\n\t\t\tlet shadowCol = vec4<f32>(u.dropShadowColor.rgb, finalShadowAlpha);\n\t\t\tresult = compositeLayer(result, shadowCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 2. OUTER GLOW\n\t// =========================================================================\n\tif (u.outerGlowParams.x > 0.5) {\n\t\tlet opacity = u.outerGlowParams.y;\n\t\tlet size = u.outerGlowParams.z;\n\t\tlet spread = u.outerGlowParams.w;\n\t\tlet blendMode = u32(u.outerGlowParams2.x);\n\n\t\tvar glowAccum = 0.0;\n\t\tvar glowWeightSum = 0.0;\n\t\tlet sigma = max(0.5, size * 0.4);\n\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\n\t\tif (size <= 0.5) {\n\t\t\tglowAccum = origA;\n\t\t\tglowWeightSum = 1.0;\n\t\t} else {\n\t\t\tlet stepVal = max(1, sampleRadius / 8);\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tlet weight = exp(-0.5 * distSq / (sigma * sigma));\n\t\t\t\t\tglowAccum += sampleAlpha(in.uv + offset) * weight;\n\t\t\t\t\tglowWeightSum += weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet blurredGlow = glowAccum / max(glowWeightSum, 1e-4);\n\t\tlet spreadFactor = spread / 100.0;\n\t\tlet spreadGlow = clamp(blurredGlow / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0);\n\t\tlet finalGlowAlpha = max(0.0, spreadGlow - origA) * opacity;\n\n\t\tif (finalGlowAlpha > 0.001) {\n\t\t\tlet glowCol = vec4<f32>(u.outerGlowColor.rgb, finalGlowAlpha);\n\t\t\tresult = compositeLayer(result, glowCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 3. OUTSIDE STROKE\n\t// =========================================================================\n\tif (u.strokeParams.x > 0.5 && u.strokeParams.z < 0.5) { // position == 0: outside\n\t\tlet size = u.strokeParams.y;\n\t\tlet opacity = u.strokeParams.w;\n\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\tvar maxAlpha = 0.0;\n\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\t\tlet sizeSq = size * size;\n\n\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\tif (distSq <= sizeSq) {\n\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\tmaxAlpha = max(maxAlpha, sAlpha);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet strokeAlpha = clamp(maxAlpha - origA, 0.0, 1.0) * opacity;\n\t\tif (strokeAlpha > 0.001) {\n\t\t\tlet strokeCol = vec4<f32>(u.strokeColor.rgb, strokeAlpha);\n\t\t\tresult = compositeLayer(result, strokeCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 4. BASE IMAGE LAYER (with Color Overlay, Bevel & Emboss, Inner Glow/Shadow)\n\t// =========================================================================\n\tif (origA > 0.001) {\n\t\tvar baseRgb = origColor.rgb;\n\n\t\t// Color Overlay\n\t\tif (u.colorOverlayParams.x > 0.5) {\n\t\t\tlet overlayOpacity = u.colorOverlayParams.y;\n\t\t\tlet overlayBlendMode = u32(u.colorOverlayParams.z);\n\t\t\tlet blendedOverlay = blendRgb(baseRgb, u.colorOverlayColor.rgb, overlayBlendMode);\n\t\t\tbaseRgb = mix(baseRgb, blendedOverlay, overlayOpacity);\n\t\t}\n\n\t\t// Bevel & Emboss\n\t\tif (u.bevelParams1.x > 0.5) {\n\t\t\tlet style = u.bevelParams1.y;\n\t\t\tlet technique = u.bevelParams1.z;\n\t\t\tlet depth = u.bevelParams1.w / 100.0;\n\t\t\tlet direction = u.bevelParams2.x;\n\t\t\tlet bevelSize = max(0.5, u.bevelParams2.y);\n\t\t\tlet soften = u.bevelParams2.z;\n\t\t\tlet lightAngle = u.bevelParams2.w;\n\t\t\tlet lightAltitude = u.bevelParams3.x;\n\t\t\tlet hlOpacity = u.bevelParams3.y;\n\t\t\tlet shOpacity = u.bevelParams3.z;\n\n\t\t\tlet lightDir = normalize(vec3<f32>(\n\t\t\t\t-cos(lightAngle) * cos(lightAltitude),\n\t\t\t\tsin(lightAngle) * cos(lightAltitude),\n\t\t\t\tsin(lightAltitude)\n\t\t\t));\n\n\t\t\tlet stepSize = max(1.0, bevelSize * 0.5 + soften) * texelSize;\n\t\t\tlet aL = sampleAlpha(in.uv - vec2<f32>(stepSize.x, 0.0));\n\t\t\tlet aR = sampleAlpha(in.uv + vec2<f32>(stepSize.x, 0.0));\n\t\t\tlet aT = sampleAlpha(in.uv - vec2<f32>(0.0, stepSize.y));\n\t\t\tlet aB = sampleAlpha(in.uv + vec2<f32>(0.0, stepSize.y));\n\n\t\t\tvar dx = (aR - aL) * depth * direction;\n\t\t\tvar dy = (aB - aT) * depth * direction;\n\n\t\t\tif (technique > 0.5) { // ChiselHard or ChiselSoft\n\t\t\t\tlet rampFactor = select(2.0, 1.5, technique > 1.5);\n\t\t\t\tdx = clamp(dx * rampFactor, -1.0, 1.0);\n\t\t\t\tdy = clamp(dy * rampFactor, -1.0, 1.0);\n\t\t\t}\n\n\t\t\tlet normal = normalize(vec3<f32>(-dx, -dy, 1.0));\n\t\t\tlet nDotL = dot(normal, lightDir);\n\n\t\t\tlet highlightAmount = max(0.0, nDotL) * hlOpacity;\n\t\t\tlet shadowAmount = max(0.0, -nDotL) * shOpacity;\n\n\t\t\tlet hlColor = mix(baseRgb, u.bevelHighlightColor.rgb + baseRgb, highlightAmount);\n\t\t\tlet shColor = mix(baseRgb, baseRgb * (1.0 - shadowAmount) + u.bevelShadowColor.rgb * shadowAmount, shadowAmount);\n\t\t\tbaseRgb = mix(shColor, hlColor, clamp(nDotL * 0.5 + 0.5, 0.0, 1.0));\n\t\t}\n\n\t\t// Inner Glow\n\t\tif (u.innerGlowParams.x > 0.5) {\n\t\t\tlet igOpacity = u.innerGlowParams.y;\n\t\t\tlet igSize = u.innerGlowParams.z;\n\t\t\tlet igSpread = u.innerGlowParams.w;\n\t\t\tlet igBlendMode = u32(u.innerGlowParams2.x);\n\n\t\t\tvar innerAccum = 0.0;\n\t\t\tvar innerWeight = 0.0;\n\t\t\tlet sigma = max(0.5, igSize * 0.4);\n\t\t\tlet sampleRadius = min(i32(ceil(igSize)), 16);\n\t\t\tlet stepVal = max(1, sampleRadius / 6);\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet weight = exp(-0.5 * f32(x * x + y * y) / (sigma * sigma));\n\t\t\t\t\tinnerAccum += sampleAlpha(in.uv + offset) * weight;\n\t\t\t\t\tinnerWeight += weight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet blurredInner = innerAccum / max(innerWeight, 1e-4);\n\t\t\tlet innerGlowMask = max(0.0, origA - blurredInner);\n\t\t\tlet spreadFactor = igSpread / 100.0;\n\t\t\tlet finalInnerGlowAlpha = clamp(innerGlowMask / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0) * igOpacity;\n\n\t\t\tif (finalInnerGlowAlpha > 0.001) {\n\t\t\t\tlet igBlended = blendRgb(baseRgb, u.innerGlowColor.rgb, igBlendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, igBlended, finalInnerGlowAlpha);\n\t\t\t}\n\t\t}\n\n\t\t// Inner Shadow\n\t\tif (u.innerShadowParams.x > 0.5) {\n\t\t\tlet isOpacity = u.innerShadowParams.y;\n\t\t\tlet isAngle = u.innerShadowParams.z;\n\t\t\tlet isDistance = u.innerShadowParams.w;\n\t\t\tlet isChoke = u.innerShadowParams2.x;\n\t\t\tlet isSize = u.innerShadowParams2.y;\n\t\t\tlet isBlendMode = u32(u.innerShadowParams2.z);\n\n\t\t\tlet isOffset = vec2<f32>(-cos(isAngle), sin(isAngle)) * isDistance * texelSize;\n\t\t\tlet shiftedA = sampleAlpha(in.uv + isOffset);\n\n\t\t\tvar isAccum = 0.0;\n\t\t\tvar isWeight = 0.0;\n\t\t\tlet sigma = max(0.5, isSize * 0.4);\n\t\t\tlet sampleRadius = min(i32(ceil(isSize)), 16);\n\t\t\tlet stepVal = max(1, sampleRadius / 6);\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet weight = exp(-0.5 * f32(x * x + y * y) / (sigma * sigma));\n\t\t\t\t\tlet sShifted = sampleAlpha(in.uv + isOffset + offset);\n\t\t\t\t\tlet sOrig = sampleAlpha(in.uv + offset);\n\t\t\t\t\tisAccum += max(0.0, sOrig - sShifted) * weight;\n\t\t\t\t\tisWeight += weight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet blurredIS = isAccum / max(isWeight, 1e-4);\n\t\t\tlet chokeFactor = isChoke / 100.0;\n\t\t\tlet finalISAlpha = clamp(blurredIS / max(1.0 - chokeFactor * 0.95, 0.01), 0.0, 1.0) * isOpacity;\n\n\t\t\tif (finalISAlpha > 0.001) {\n\t\t\t\tlet isBlended = blendRgb(baseRgb, u.innerShadowColor.rgb, isBlendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, isBlended, finalISAlpha);\n\t\t\t}\n\t\t}\n\n\t\t// Inside Stroke\n\t\tif (u.strokeParams.x > 0.5 && u.strokeParams.z > 1.5) { // position == 2: inside\n\t\t\tlet size = u.strokeParams.y;\n\t\t\tlet opacity = u.strokeParams.w;\n\t\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\t\tvar minAlpha = 1.0;\n\t\t\tlet sampleRadius = min(i32(ceil(size)), ${MAX_KERNEL});\n\t\t\tlet sizeSq = size * size;\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tif (distSq <= sizeSq) {\n\t\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\t\tminAlpha = min(minAlpha, sAlpha);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet insideStrokeAlpha = clamp(origA - minAlpha, 0.0, 1.0) * opacity;\n\t\t\tif (insideStrokeAlpha > 0.001) {\n\t\t\t\tlet sBlended = blendRgb(baseRgb, u.strokeColor.rgb, blendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, sBlended, insideStrokeAlpha);\n\t\t\t}\n\t\t}\n\n\t\tlet baseLayer = vec4<f32>(baseRgb, origA);\n\t\tresult = compositeLayer(result, baseLayer, 0u);\n\t}\n\n\t// =========================================================================\n\t// 5. CENTER STROKE\n\t// =========================================================================\n\tif (u.strokeParams.x > 0.5 && u.strokeParams.z >= 0.5 && u.strokeParams.z <= 1.5) { // position == 1: center\n\t\tlet size = u.strokeParams.y;\n\t\tlet opacity = u.strokeParams.w;\n\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\tvar maxAlpha = 0.0;\n\t\tvar minAlpha = 1.0;\n\t\tlet halfSize = max(0.5, size * 0.5);\n\t\tlet sampleRadius = min(i32(ceil(halfSize)), ${MAX_KERNEL});\n\t\tlet halfSizeSq = halfSize * halfSize;\n\n\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\tif (distSq <= halfSizeSq) {\n\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\tmaxAlpha = max(maxAlpha, sAlpha);\n\t\t\t\t\tminAlpha = min(minAlpha, sAlpha);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet centerStrokeAlpha = clamp(maxAlpha - minAlpha, 0.0, 1.0) * opacity;\n\t\tif (centerStrokeAlpha > 0.001) {\n\t\t\tlet strokeCol = vec4<f32>(u.strokeColor.rgb, centerStrokeAlpha);\n\t\t\tresult = compositeLayer(result, strokeCol, blendMode);\n\t\t}\n\t}\n\n\t// Output premultiplied alpha for QuadPipeline / WebGPU rendering\n\treturn vec4<f32>(result.rgb * result.a, result.a);\n}\n`;\nconst resourcesCache = /* @__PURE__ */ new WeakMap();\nfunction getLayerStyleResources(device, format) {\n\tlet res = resourcesCache.get(device);\n\tif (res) return res;\n\tconst module = device.createShaderModule({ code: WGSL_LAYER_STYLE_SHADER });\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule,\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tformat,\n\t\t\tblend: PREMULTIPLIED_BLEND\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout\n\t};\n\tresourcesCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(88);\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"LayerStyle\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : (props.frame ?? 0) / (props.fps || 30);\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => {\n\t\tif (handleId && op.inputs?.[handleId]?.connectionValid) {\n\t\t\tconst outputItem = op.inputs[handleId].outputItem;\n\t\t\tif (!outputItem) return Math.max(clampMin, Math.min(clampMax, fallbackVal));\n\t\t\tif (outputItem.type === \"Number\") {\n\t\t\t\tconst numVal = typeof outputItem.data === \"number\" ? outputItem.data : outputItem.data?.value ?? fallbackVal;\n\t\t\t\treturn Math.max(clampMin, Math.min(clampMax, numVal));\n\t\t\t}\n\t\t\tif (outputItem.type === \"Signal\") {\n\t\t\t\tconst data = outputItem.data;\n\t\t\t\tif (typeof data === \"number\") return Math.max(clampMin, Math.min(clampMax, data));\n\t\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\t\tif (typeof data.value === \"number\") return Math.max(clampMin, Math.min(clampMax, data.value));\n\t\t\t\t\tconst amp = typeof data.amplitude === \"number\" ? data.amplitude : 1;\n\t\t\t\t\tconst freq = typeof data.frequency === \"number\" ? data.frequency : 1;\n\t\t\t\t\tconst phase = typeof data.phase === \"number\" ? data.phase : 0;\n\t\t\t\t\tconst offset = typeof data.offset === \"number\" ? data.offset : fallbackVal;\n\t\t\t\t\tconst t = elapsedSeconds;\n\t\t\t\t\tconst computed = offset + amp * Math.sin(2 * Math.PI * freq * t + phase);\n\t\t\t\t\treturn Math.max(clampMin, Math.min(clampMax, computed));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Math.max(clampMin, Math.min(clampMax, fallbackVal));\n\t};\n\tconst childW = width;\n\tconst childH = height;\n\tconst childTex = ctx.renderer.getTemporaryTexture(childW, childH, [...props.excludeTextures || [], targetTexture]);\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, childW, childH, \"clear\").end();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\tcontainerWidth: childW,\n\t\tcontainerHeight: childH\n\t}, childView, childTex, childW, childH);\n\tconst inputTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst inputView = inputTex.createView();\n\tconst inputPass = ctx.renderer.beginFrame(encoder, inputView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\");\n\tctx.renderer.drawTexture(inputPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: childW,\n\t\theight: childH\n\t}, { opacity: 1 });\n\tinputPass.end();\n\tconst { pipeline, uniformLayout, textureLayout } = getLayerStyleResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst ds = op.dropShadow ?? {};\n\tconst is = op.innerShadow ?? {};\n\tconst og = op.outerGlow ?? {};\n\tconst ig = op.innerGlow ?? {};\n\tconst st = op.stroke ?? {};\n\tconst be = op.bevelEmboss ?? {};\n\tconst co = op.colorOverlay ?? {};\n\tconst dsCol = hexToRgba(ds.color ?? \"#000000\");\n\tconst dsOpacity = resolveField(op.dropShadowOpacityHandleId, ds.opacity ?? .75, 0, 1);\n\tconst dsAngle = resolveField(op.dropShadowAngleHandleId, ds.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst dsDist = resolveField(op.dropShadowDistanceHandleId, ds.distance ?? 10, 0, 500);\n\tconst dsSpread = resolveField(op.dropShadowSpreadHandleId, ds.spread ?? 0, 0, 100);\n\tconst dsSize = resolveField(op.dropShadowSizeHandleId, ds.size ?? 10, 0, 250);\n\tconst dsBlend = BLEND_MODE_MAP[ds.blendMode ?? \"multiply\"] ?? 1;\n\tconst isCol = hexToRgba(is.color ?? \"#000000\");\n\tconst isOpacity = resolveField(op.innerShadowOpacityHandleId, is.opacity ?? .75, 0, 1);\n\tconst isAngle = resolveField(op.innerShadowAngleHandleId, is.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst isDist = resolveField(op.innerShadowDistanceHandleId, is.distance ?? 5, 0, 500);\n\tconst isChoke = resolveField(op.innerShadowChokeHandleId, is.choke ?? 0, 0, 100);\n\tconst isSize = resolveField(op.innerShadowSizeHandleId, is.size ?? 5, 0, 250);\n\tconst isBlend = BLEND_MODE_MAP[is.blendMode ?? \"multiply\"] ?? 1;\n\tconst ogCol = hexToRgba(og.color ?? \"#ffffff\");\n\tconst ogOpacity = resolveField(op.outerGlowOpacityHandleId, og.opacity ?? .75, 0, 1);\n\tconst ogSize = resolveField(op.outerGlowSizeHandleId, og.size ?? 15, 0, 250);\n\tconst ogSpread = resolveField(op.outerGlowSpreadHandleId, og.spread ?? 0, 0, 100);\n\tconst ogBlend = BLEND_MODE_MAP[og.blendMode ?? \"screen\"] ?? 2;\n\tconst igCol = hexToRgba(ig.color ?? \"#ffffff\");\n\tconst igOpacity = resolveField(op.innerGlowOpacityHandleId, ig.opacity ?? .75, 0, 1);\n\tconst igSize = resolveField(op.innerGlowSizeHandleId, ig.size ?? 15, 0, 250);\n\tconst igSpread = resolveField(op.innerGlowSpreadHandleId, ig.spread ?? 0, 0, 100);\n\tconst igBlend = BLEND_MODE_MAP[ig.blendMode ?? \"screen\"] ?? 2;\n\tconst stCol = hexToRgba(st.color ?? \"#ffffff\");\n\tconst stSize = resolveField(op.strokeSizeHandleId, st.size ?? 2, 0, 100);\n\tconst stPos = STROKE_POS_MAP[st.position ?? \"outside\"] ?? 0;\n\tconst stOpacity = resolveField(op.strokeOpacityHandleId, st.opacity ?? 1, 0, 1);\n\tconst stBlend = BLEND_MODE_MAP[st.blendMode ?? \"normal\"] ?? 0;\n\tconst beHlCol = hexToRgba(be.highlightColor ?? \"#ffffff\");\n\tconst beShCol = hexToRgba(be.shadowColor ?? \"#000000\");\n\tconst beStyle = BEVEL_STYLE_MAP[be.style ?? \"InnerBevel\"] ?? 0;\n\tconst beTech = BEVEL_TECHNIQUE_MAP[be.technique ?? \"Smooth\"] ?? 0;\n\tconst beDepth = resolveField(op.bevelEmbossDepthHandleId, be.depth ?? 100, 1, 1e3);\n\tconst beDir = be.direction === \"Down\" ? -1 : 1;\n\tconst beSize = resolveField(op.bevelEmbossSizeHandleId, be.size ?? 5, 0, 250);\n\tconst beSoften = resolveField(op.bevelEmbossSoftenHandleId, be.soften ?? 0, 0, 50);\n\tconst beAngle = resolveField(op.bevelEmbossAngleHandleId, be.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst beAltitude = resolveField(op.bevelEmbossAltitudeHandleId, be.altitude ?? 30, 0, 90) * Math.PI / 180;\n\tconst beHlOpacity = resolveField(op.bevelEmbossHighlightOpacityHandleId, be.highlightOpacity ?? .75, 0, 1);\n\tconst beShOpacity = resolveField(op.bevelEmbossShadowOpacityHandleId, be.shadowOpacity ?? .75, 0, 1);\n\tconst coCol = hexToRgba(co.color ?? \"#ff0000\");\n\tconst coOpacity = resolveField(op.colorOverlayOpacityHandleId, co.opacity ?? 1, 0, 1);\n\tconst coBlend = BLEND_MODE_MAP[co.blendMode ?? \"normal\"] ?? 0;\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = dsCol[0];\n\tuniformBufferData[1] = dsCol[1];\n\tuniformBufferData[2] = dsCol[2];\n\tuniformBufferData[3] = dsCol[3];\n\tuniformBufferData[4] = ds.enabled ? 1 : 0;\n\tuniformBufferData[5] = dsOpacity;\n\tuniformBufferData[6] = dsAngle;\n\tuniformBufferData[7] = dsDist;\n\tuniformBufferData[8] = dsSpread;\n\tuniformBufferData[9] = dsSize;\n\tuniformBufferData[10] = dsBlend;\n\tuniformBufferData[11] = 0;\n\tuniformBufferData[12] = isCol[0];\n\tuniformBufferData[13] = isCol[1];\n\tuniformBufferData[14] = isCol[2];\n\tuniformBufferData[15] = isCol[3];\n\tuniformBufferData[16] = is.enabled ? 1 : 0;\n\tuniformBufferData[17] = isOpacity;\n\tuniformBufferData[18] = isAngle;\n\tuniformBufferData[19] = isDist;\n\tuniformBufferData[20] = isChoke;\n\tuniformBufferData[21] = isSize;\n\tuniformBufferData[22] = isBlend;\n\tuniformBufferData[23] = 0;\n\tuniformBufferData[24] = ogCol[0];\n\tuniformBufferData[25] = ogCol[1];\n\tuniformBufferData[26] = ogCol[2];\n\tuniformBufferData[27] = ogCol[3];\n\tuniformBufferData[28] = og.enabled ? 1 : 0;\n\tuniformBufferData[29] = ogOpacity;\n\tuniformBufferData[30] = ogSize;\n\tuniformBufferData[31] = ogSpread;\n\tuniformBufferData[32] = ogBlend;\n\tuniformBufferData[33] = 0;\n\tuniformBufferData[34] = 0;\n\tuniformBufferData[35] = 0;\n\tuniformBufferData[36] = igCol[0];\n\tuniformBufferData[37] = igCol[1];\n\tuniformBufferData[38] = igCol[2];\n\tuniformBufferData[39] = igCol[3];\n\tuniformBufferData[40] = ig.enabled ? 1 : 0;\n\tuniformBufferData[41] = igOpacity;\n\tuniformBufferData[42] = igSize;\n\tuniformBufferData[43] = igSpread;\n\tuniformBufferData[44] = igBlend;\n\tuniformBufferData[45] = 0;\n\tuniformBufferData[46] = 0;\n\tuniformBufferData[47] = 0;\n\tuniformBufferData[48] = stCol[0];\n\tuniformBufferData[49] = stCol[1];\n\tuniformBufferData[50] = stCol[2];\n\tuniformBufferData[51] = stCol[3];\n\tuniformBufferData[52] = st.enabled ? 1 : 0;\n\tuniformBufferData[53] = stSize;\n\tuniformBufferData[54] = stPos;\n\tuniformBufferData[55] = stOpacity;\n\tuniformBufferData[56] = stBlend;\n\tuniformBufferData[57] = 0;\n\tuniformBufferData[58] = 0;\n\tuniformBufferData[59] = 0;\n\tuniformBufferData[60] = beHlCol[0];\n\tuniformBufferData[61] = beHlCol[1];\n\tuniformBufferData[62] = beHlCol[2];\n\tuniformBufferData[63] = beHlCol[3];\n\tuniformBufferData[64] = beShCol[0];\n\tuniformBufferData[65] = beShCol[1];\n\tuniformBufferData[66] = beShCol[2];\n\tuniformBufferData[67] = beShCol[3];\n\tuniformBufferData[68] = be.enabled ? 1 : 0;\n\tuniformBufferData[69] = beStyle;\n\tuniformBufferData[70] = beTech;\n\tuniformBufferData[71] = beDepth;\n\tuniformBufferData[72] = beDir;\n\tuniformBufferData[73] = beSize;\n\tuniformBufferData[74] = beSoften;\n\tuniformBufferData[75] = beAngle;\n\tuniformBufferData[76] = beAltitude;\n\tuniformBufferData[77] = beHlOpacity;\n\tuniformBufferData[78] = beShOpacity;\n\tuniformBufferData[79] = 0;\n\tuniformBufferData[80] = coCol[0];\n\tuniformBufferData[81] = coCol[1];\n\tuniformBufferData[82] = coCol[2];\n\tuniformBufferData[83] = coCol[3];\n\tuniformBufferData[84] = co.enabled ? 1 : 0;\n\tuniformBufferData[85] = coOpacity;\n\tuniformBufferData[86] = coBlend;\n\tuniformBufferData[87] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: inputView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tinputTex,\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n/**\n* How far a LayerStyle draws past its layer: the drop shadow's offset plus\n* its blur, the outer glow, an outside or centred stroke. Unknown (null)\n* when one of those sizes is driven by a connected signal. Keep in step with\n* the shader above: anything it draws farther out must count here, or a\n* compositor running the style over the layer's region will clip it.\n*/\nconst layerStyleReach = (operation) => {\n\tconst op = operation;\n\tconst driven = (handle) => typeof handle === \"string\" && op.inputs?.[handle]?.connectionValid === true;\n\tif (driven(op.dropShadowDistanceHandleId) || driven(op.dropShadowSizeHandleId) || driven(op.outerGlowSizeHandleId) || driven(op.strokeSizeHandleId)) return null;\n\tconst style = (v) => v && typeof v === \"object\" && \"_value\" in v ? v._value : v;\n\tconst kernel = (size) => Math.min(Math.ceil(size ?? 0), MAX_KERNEL);\n\tconst ds = style(op.dropShadow);\n\tconst og = style(op.outerGlow);\n\tconst st = style(op.stroke);\n\tlet r = 0;\n\tif (ds?.enabled) r = Math.max(r, (ds.distance ?? 0) + kernel(ds.size));\n\tif (og?.enabled) r = Math.max(r, kernel(og.size));\n\tif (st?.enabled && st.position !== \"inside\") r = Math.max(r, kernel(st.size));\n\treturn Math.ceil(r) + 2;\n};\nWebGPURenderer.reach = layerStyleReach;\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B2ikmOEm.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer, u as unwrapFrameParam } from "./renderer-mNSyac1V.mjs";
2
2
  import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DVMepKaO.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass } from "./gpu-BoyykRdD.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass } from "./gpu-CMaa63nz.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-patch-heal/dist/renderers-i-B6z1sf.mjs
@@ -561,4 +561,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer
561
561
 
562
562
  //#endregion
563
563
  export { renderers_default as n, PatchHealWebGPURenderer as t };
564
- //# sourceMappingURL=renderer-Dv5yE4LE.mjs.map
564
+ //# sourceMappingURL=renderer-BlPqTEii.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Dv5yE4LE.mjs","names":[],"sources":["../../../nodes/node-patch-heal/dist/renderers-i-B6z1sf.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { 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 = 500;\nconst MAX_FEATHER = 100;\nconst MAX_OFFSET = 4096;\nconst PatchItemSchema = z.object({\n\tid: z.string().default(\"patch\"),\n\tcenterX: z.number().min(0).max(1).default(.5),\n\tcenterY: z.number().min(0).max(1).default(.5),\n\toffsetX: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50),\n\toffsetY: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0),\n\tradius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tsourceRadius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tfeather: z.number().min(0).max(MAX_FEATHER).default(50),\n\topacity: z.number().min(0).max(1).default(1),\n\tmode: z.enum([\n\t\t\"Clone\",\n\t\t\"SeamlessHeal\",\n\t\t\"TextureTransfer\"\n\t]).default(\"SeamlessHeal\")\n});\nconst patchHealConfig = configBuilder().field(\"patches\", z.array(PatchItemSchema).optional(), {\n\tlabel: \"Patches\",\n\tdescription: \"List of patch healing operations applied sequentially.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"Horizontal normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"Vertical normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"offsetX\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset X Signal\",\n\tdescription: \"Horizontal pixel distance from destination to sample source patch.\"\n}).field(\"offsetY\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset Y Signal\",\n\tdescription: \"Vertical pixel distance from destination to sample source patch.\"\n}).field(\"radius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Target Radius Signal\",\n\tdescription: \"Radius of the destination circular patch in pixels (used when no explicit Mask input is connected).\"\n}).field(\"sourceRadius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Radius Signal\",\n\tdescription: \"Radius of the source sample circular patch in pixels.\"\n}).field(\"feather\", z.number().min(0).max(MAX_FEATHER).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Feather Signal\",\n\tdescription: \"Softness edge falloff percentage (0–100%).\"\n}).field(\"opacity\", z.number().min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Opacity Signal\",\n\tdescription: \"Blending opacity of the healed patch (0.0–1.0).\"\n}).field(\"mode\", z.enum([\n\t\"Clone\",\n\t\"SeamlessHeal\",\n\t\"TextureTransfer\"\n]).default(\"SeamlessHeal\"), {\n\tlabel: \"Healing Mode\",\n\tdescription: \"Healing algorithm: Clone (direct stamp), SeamlessHeal (Poisson color/lighting blend), TextureTransfer (luminance structure matching).\"\n}).build();\nconst PatchHealNodeConfigSchema = patchHealConfig.schema;\nfunction normalizePatches(config) {\n\tif (config?.patches && config.patches.length > 0) return config.patches.map((p, idx) => ({\n\t\tid: p.id || `patch-${idx + 1}`,\n\t\tcenterX: p.centerX ?? .5,\n\t\tcenterY: p.centerY ?? .5,\n\t\toffsetX: p.offsetX ?? 50,\n\t\toffsetY: p.offsetY ?? 0,\n\t\tradius: p.radius ?? 25,\n\t\tsourceRadius: p.sourceRadius ?? p.radius ?? 25,\n\t\tfeather: p.feather ?? 50,\n\t\topacity: p.opacity ?? 1,\n\t\tmode: p.mode ?? \"SeamlessHeal\"\n\t}));\n\tconst fallbackRadius = config?.radius ?? 25;\n\treturn [{\n\t\tid: \"patch-1\",\n\t\tcenterX: config?.centerX ?? .5,\n\t\tcenterY: config?.centerY ?? .5,\n\t\toffsetX: config?.offsetX ?? 50,\n\t\toffsetY: config?.offsetY ?? 0,\n\t\tradius: fallbackRadius,\n\t\tsourceRadius: config?.sourceRadius ?? fallbackRadius,\n\t\tfeather: config?.feather ?? 50,\n\t\topacity: config?.opacity ?? 1,\n\t\tmode: config?.mode ?? \"SeamlessHeal\"\n\t}];\n}\nconst PatchHealResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst PATCH_HEAL_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FULLSCREEN_VS = `\nstruct VertexOutput {\n @builtin(position) position : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0)\n );\n var uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n var output : VertexOutput;\n output.position = vec4<f32>(pos[vertexIndex], 0.0, 1.0);\n output.uv = uvs[vertexIndex];\n return output;\n}\n`;\nconst WGSL_PATCHHEAL_FS = `\n\nstruct PatchHealUniforms {\n offsetX : f32,\n offsetY : f32,\n centerX : f32,\n centerY : f32,\n\n radius : f32,\n sourceRadius : f32,\n feather : f32,\n opacity : f32,\n\n mode : f32,\n hasMask : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n hasRadiusSig : f32,\n hasSourceRadSig : f32,\n\n hasFeatherSig : f32,\n hasOpacitySig : f32,\n pad0 : f32,\n pad1 : f32,\n};\n\n\n@group(0) @binding(0) var<uniform> u : PatchHealUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var maskTex : texture_2d<f32>;\n@group(1) @binding(2) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var sourceRadSigTex : texture_2d<f32>;\n@group(2) @binding(6) var featherSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nfn getLuminance(c : vec3<f32>) -> f32 {\n return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn sampleBoxBlur(tex : texture_2d<f32>, smp : sampler, centerUv : vec2<f32>, blurPx : f32, dims : vec2<f32>) -> vec4<f32> {\n let texel = 1.0 / dims;\n let stepSize = max(1.0, blurPx / 3.0);\n var accum = vec4<f32>(0.0);\n var count = 0.0;\n\n for (var y = -2; y <= 2; y++) {\n for (var x = -2; x <= 2; x++) {\n let offset = vec2<f32>(f32(x) * stepSize, f32(y) * stepSize) * texel;\n let sampleUv = clamp(centerUv + offset, vec2<f32>(0.0), vec2<f32>(1.0));\n accum += textureSampleLevel(tex, smp, sampleUv, 0.0);\n count += 1.0;\n }\n }\n return accum / count;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {\n let dimensions = vec2<f32>(textureDimensions(srcTex));\n\n var offsetX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n offsetX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var offsetY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n offsetY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var sourceRadius = u.sourceRadius;\n if (u.hasSourceRadSig > 0.5) {\n sourceRadius = textureSampleLevel(sourceRadSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var feather = u.feather;\n if (u.hasFeatherSig > 0.5) {\n feather = textureSampleLevel(featherSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var opacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n opacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dstCol = textureSampleLevel(srcTex, samp, in.uv, 0.0);\n\n // Calculate mask weight (either from explicit mask or procedural circular patch)\n var maskWeight = 0.0;\n let targetCenterUV = vec2<f32>(centerX, centerY);\n\n if (u.hasMask > 0.5) {\n let maskCol = textureSampleLevel(maskTex, samp, in.uv, 0.0);\n maskWeight = max(maskCol.a, max(maskCol.r, max(maskCol.g, maskCol.b)));\n } else {\n let distPx = length((in.uv - targetCenterUV) * dimensions);\n let innerRadius = radius * max(0.0, 1.0 - feather / 100.0);\n maskWeight = 1.0 - smoothstep(innerRadius, max(innerRadius + 0.001, radius), distPx);\n }\n\n let blendWeight = clamp(maskWeight * opacity, 0.0, 1.0);\n if (blendWeight < 1e-4) {\n return dstCol;\n }\n\n // Compute source sample coordinate (scaling from sourceRadius to target radius if different)\n let sourceCenterUV = targetCenterUV + vec2<f32>(offsetX, offsetY) / dimensions;\n let srcScale = max(1.0, sourceRadius) / max(1.0, radius);\n let uvFromTargetCenter = in.uv - targetCenterUV;\n let srcUV = clamp(sourceCenterUV + uvFromTargetCenter * srcScale, vec2<f32>(0.0), vec2<f32>(1.0));\n let srcCol = textureSampleLevel(srcTex, samp, srcUV, 0.0);\n\n var healedCol = srcCol;\n\n if (u.mode > 0.5 && u.mode < 1.5) {\n // Mode 1: Seamless Heal (Poisson gradient / local illumination matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n let dstBlur = sampleBoxBlur(srcTex, samp, in.uv, blurRadius, dimensions);\n\n let srcDetail = srcCol.rgb - srcBlur.rgb;\n let healedRgb = dstBlur.rgb + srcDetail;\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(srcCol.a));\n healedCol = vec4<f32>(clampedRgb, srcCol.a);\n } else if (u.mode >= 1.5) {\n // Mode 2: Texture Transfer (Luminance structure matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n\n let lumaSrc = getLuminance(srcCol.rgb);\n let lumaSrcBlur = getLuminance(srcBlur.rgb);\n let lumaDelta = lumaSrc - lumaSrcBlur;\n\n let healedRgb = dstCol.rgb + vec3<f32>(lumaDelta);\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(dstCol.a));\n healedCol = vec4<f32>(clampedRgb, dstCol.a);\n }\n\n return mix(dstCol, healedCol, blendWeight);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = texturesLayout(device, 2);\n\tconst signalTextureLayout = texturesLayout(device, 8);\n\tres = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: `${WGSL_FULLSCREEN_VS}\\n${WGSL_PATCHHEAL_FS}` }),\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,\n\t\t\tblend: {\n\t\t\t\tcolor: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t},\n\t\t\t\talpha: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tvertexEntryPoint: \"vs_main\",\n\t\t\tfragmentEntryPoint: \"fs_main\"\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst PatchHealWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"PatchHeal\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"patch_heal_node\";\n\tconst { texture: tmpSrcTex, view: tmpSrcView } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-src`\n\t} });\n\tlet maskTex = null;\n\tif (op.maskMedia) ({texture: maskTex} = await drawChildToTexture(args, op.maskMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskMedia,\n\t\t\trenderId: `${props.renderId}-mask`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tmpSrcTex]\n\t\t},\n\t\texclude: [tmpSrcTex]\n\t}));\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getDeviceResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst patches = normalizePatches(op);\n\tconst resolveBindable = (configKey, fallbackVal, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = fallbackVal;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst numVal = typeof input.outputItem.data === \"number\" ? input.outputItem.data : input.outputItem.data?.value ?? fallbackVal;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(numVal)));\n\t\t} else {\n\t\t\tconst rawVal = unwrapFrameParam(fallbackVal, compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? fallbackVal);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? fallbackVal : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst dummyMaskView = maskTex ? maskTex.createView() : tmpSrcView;\n\tlet currentInputTex = tmpSrcTex;\n\tconst pingTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst pongTex = patches.length > 1 ? ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\tpingTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]) : pingTex;\n\tfor (let i = 0; i < patches.length; i++) {\n\t\tconst patch = patches[i];\n\t\tconst isFirstPatch = i === 0;\n\t\tconst centerXRes = isFirstPatch ? resolveBindable(\"centerX\", patch.centerX, 0, 1) : {\n\t\t\tval: patch.centerX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst centerYRes = isFirstPatch ? resolveBindable(\"centerY\", patch.centerY, 0, 1) : {\n\t\t\tval: patch.centerY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetXRes = isFirstPatch ? resolveBindable(\"offsetX\", patch.offsetX, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetYRes = isFirstPatch ? resolveBindable(\"offsetY\", patch.offsetY, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst radiusRes = isFirstPatch ? resolveBindable(\"radius\", patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst sourceRadiusRes = isFirstPatch ? resolveBindable(\"sourceRadius\", patch.sourceRadius ?? patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.sourceRadius ?? patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst featherRes = isFirstPatch ? resolveBindable(\"feather\", patch.feather, 0, MAX_FEATHER) : {\n\t\t\tval: patch.feather,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst opacityRes = isFirstPatch ? resolveBindable(\"opacity\", patch.opacity, 0, 1) : {\n\t\t\tval: patch.opacity,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst signalContext = {\n\t\t\targs,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tframe,\n\t\t\tfps,\n\t\t\telapsedSeconds,\n\t\t\tdurationSeconds\n\t\t};\n\t\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\t\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\t\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\t\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\t\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\t\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\t\tconst sourceRadiusView = getSignalView(sourceRadiusRes, \"sourceRadius_sig\");\n\t\tconst featherView = getSignalView(featherRes, \"feather_sig\");\n\t\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\t\tconst modeNum = patch.mode === \"Clone\" ? 0 : patch.mode === \"TextureTransfer\" ? 2 : 1;\n\t\tconst patchData = new Float32Array(20);\n\t\tpatchData[0] = offsetXRes.val;\n\t\tpatchData[1] = offsetYRes.val;\n\t\tpatchData[2] = centerXRes.val;\n\t\tpatchData[3] = centerYRes.val;\n\t\tpatchData[4] = radiusRes.val;\n\t\tpatchData[5] = sourceRadiusRes.val;\n\t\tpatchData[6] = featherRes.val;\n\t\tpatchData[7] = opacityRes.val;\n\t\tpatchData[8] = modeNum;\n\t\tpatchData[9] = maskTex ? 1 : 0;\n\t\tpatchData[10] = offsetXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[11] = offsetYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[12] = centerXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[13] = centerYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[14] = radiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[15] = sourceRadiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[16] = featherRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[17] = opacityRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[18] = 0;\n\t\tpatchData[19] = 0;\n\t\tconst uBuffer = ctx.renderer.getTemporaryBuffer(patchData);\n\t\tconst destinationTex = i % 2 === 0 ? pingTex : pongTex;\n\t\tconst texBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: tLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: currentInputTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyMaskView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sourceRadiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: featherView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tdrawFullscreenPass(encoder, destinationTex.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\ttexBindGroup,\n\t\t\tsigBindGroup\n\t\t]);\n\t\tcurrentInputTex = destinationTex;\n\t}\n\tdrawTextureToTarget(args, currentInputTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, PatchHealResultSchema as c, patchHealConfig as d, MAX_OFFSET as i, PatchItemSchema as l, PatchHealWebGPURenderer as n, PATCH_HEAL_OUTPUT_TYPE_MAP as o, MAX_FEATHER as r, PatchHealNodeConfigSchema as s, renderers_default as t, normalizePatches as u };\n//# sourceMappingURL=renderers-i-B6z1sf.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BlPqTEii.mjs","names":[],"sources":["../../../nodes/node-patch-heal/dist/renderers-i-B6z1sf.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { 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 = 500;\nconst MAX_FEATHER = 100;\nconst MAX_OFFSET = 4096;\nconst PatchItemSchema = z.object({\n\tid: z.string().default(\"patch\"),\n\tcenterX: z.number().min(0).max(1).default(.5),\n\tcenterY: z.number().min(0).max(1).default(.5),\n\toffsetX: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50),\n\toffsetY: z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0),\n\tradius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tsourceRadius: z.number().min(1).max(MAX_RADIUS).default(25),\n\tfeather: z.number().min(0).max(MAX_FEATHER).default(50),\n\topacity: z.number().min(0).max(1).default(1),\n\tmode: z.enum([\n\t\t\"Clone\",\n\t\t\"SeamlessHeal\",\n\t\t\"TextureTransfer\"\n\t]).default(\"SeamlessHeal\")\n});\nconst patchHealConfig = configBuilder().field(\"patches\", z.array(PatchItemSchema).optional(), {\n\tlabel: \"Patches\",\n\tdescription: \"List of patch healing operations applied sequentially.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"Horizontal normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"Vertical normalized position of destination patch (0.0 to 1.0).\"\n}).field(\"offsetX\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset X Signal\",\n\tdescription: \"Horizontal pixel distance from destination to sample source patch.\"\n}).field(\"offsetY\", z.number().min(-MAX_OFFSET).max(MAX_OFFSET).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Offset Y Signal\",\n\tdescription: \"Vertical pixel distance from destination to sample source patch.\"\n}).field(\"radius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Target Radius Signal\",\n\tdescription: \"Radius of the destination circular patch in pixels (used when no explicit Mask input is connected).\"\n}).field(\"sourceRadius\", z.number().min(1).max(MAX_RADIUS).default(25), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Source Radius Signal\",\n\tdescription: \"Radius of the source sample circular patch in pixels.\"\n}).field(\"feather\", z.number().min(0).max(MAX_FEATHER).default(50), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Feather Signal\",\n\tdescription: \"Softness edge falloff percentage (0–100%).\"\n}).field(\"opacity\", z.number().min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Opacity Signal\",\n\tdescription: \"Blending opacity of the healed patch (0.0–1.0).\"\n}).field(\"mode\", z.enum([\n\t\"Clone\",\n\t\"SeamlessHeal\",\n\t\"TextureTransfer\"\n]).default(\"SeamlessHeal\"), {\n\tlabel: \"Healing Mode\",\n\tdescription: \"Healing algorithm: Clone (direct stamp), SeamlessHeal (Poisson color/lighting blend), TextureTransfer (luminance structure matching).\"\n}).build();\nconst PatchHealNodeConfigSchema = patchHealConfig.schema;\nfunction normalizePatches(config) {\n\tif (config?.patches && config.patches.length > 0) return config.patches.map((p, idx) => ({\n\t\tid: p.id || `patch-${idx + 1}`,\n\t\tcenterX: p.centerX ?? .5,\n\t\tcenterY: p.centerY ?? .5,\n\t\toffsetX: p.offsetX ?? 50,\n\t\toffsetY: p.offsetY ?? 0,\n\t\tradius: p.radius ?? 25,\n\t\tsourceRadius: p.sourceRadius ?? p.radius ?? 25,\n\t\tfeather: p.feather ?? 50,\n\t\topacity: p.opacity ?? 1,\n\t\tmode: p.mode ?? \"SeamlessHeal\"\n\t}));\n\tconst fallbackRadius = config?.radius ?? 25;\n\treturn [{\n\t\tid: \"patch-1\",\n\t\tcenterX: config?.centerX ?? .5,\n\t\tcenterY: config?.centerY ?? .5,\n\t\toffsetX: config?.offsetX ?? 50,\n\t\toffsetY: config?.offsetY ?? 0,\n\t\tradius: fallbackRadius,\n\t\tsourceRadius: config?.sourceRadius ?? fallbackRadius,\n\t\tfeather: config?.feather ?? 50,\n\t\topacity: config?.opacity ?? 1,\n\t\tmode: config?.mode ?? \"SeamlessHeal\"\n\t}];\n}\nconst PatchHealResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst PATCH_HEAL_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FULLSCREEN_VS = `\nstruct VertexOutput {\n @builtin(position) position : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex\nfn vs_main(@builtin(vertex_index) vertexIndex : u32) -> VertexOutput {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>( 1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>( 1.0, -1.0)\n );\n var uvs = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n var output : VertexOutput;\n output.position = vec4<f32>(pos[vertexIndex], 0.0, 1.0);\n output.uv = uvs[vertexIndex];\n return output;\n}\n`;\nconst WGSL_PATCHHEAL_FS = `\n\nstruct PatchHealUniforms {\n offsetX : f32,\n offsetY : f32,\n centerX : f32,\n centerY : f32,\n\n radius : f32,\n sourceRadius : f32,\n feather : f32,\n opacity : f32,\n\n mode : f32,\n hasMask : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n hasRadiusSig : f32,\n hasSourceRadSig : f32,\n\n hasFeatherSig : f32,\n hasOpacitySig : f32,\n pad0 : f32,\n pad1 : f32,\n};\n\n\n@group(0) @binding(0) var<uniform> u : PatchHealUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var maskTex : texture_2d<f32>;\n@group(1) @binding(2) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var sourceRadSigTex : texture_2d<f32>;\n@group(2) @binding(6) var featherSigTex : texture_2d<f32>;\n@group(2) @binding(7) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(8) var signalSamp : sampler;\n\nfn getLuminance(c : vec3<f32>) -> f32 {\n return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722));\n}\n\nfn sampleBoxBlur(tex : texture_2d<f32>, smp : sampler, centerUv : vec2<f32>, blurPx : f32, dims : vec2<f32>) -> vec4<f32> {\n let texel = 1.0 / dims;\n let stepSize = max(1.0, blurPx / 3.0);\n var accum = vec4<f32>(0.0);\n var count = 0.0;\n\n for (var y = -2; y <= 2; y++) {\n for (var x = -2; x <= 2; x++) {\n let offset = vec2<f32>(f32(x) * stepSize, f32(y) * stepSize) * texel;\n let sampleUv = clamp(centerUv + offset, vec2<f32>(0.0), vec2<f32>(1.0));\n accum += textureSampleLevel(tex, smp, sampleUv, 0.0);\n count += 1.0;\n }\n }\n return accum / count;\n}\n\n@fragment\nfn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {\n let dimensions = vec2<f32>(textureDimensions(srcTex));\n\n var offsetX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n offsetX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var offsetY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n offsetY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var sourceRadius = u.sourceRadius;\n if (u.hasSourceRadSig > 0.5) {\n sourceRadius = textureSampleLevel(sourceRadSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var feather = u.feather;\n if (u.hasFeatherSig > 0.5) {\n feather = textureSampleLevel(featherSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n var opacity = u.opacity;\n if (u.hasOpacitySig > 0.5) {\n opacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let dstCol = textureSampleLevel(srcTex, samp, in.uv, 0.0);\n\n // Calculate mask weight (either from explicit mask or procedural circular patch)\n var maskWeight = 0.0;\n let targetCenterUV = vec2<f32>(centerX, centerY);\n\n if (u.hasMask > 0.5) {\n let maskCol = textureSampleLevel(maskTex, samp, in.uv, 0.0);\n maskWeight = max(maskCol.a, max(maskCol.r, max(maskCol.g, maskCol.b)));\n } else {\n let distPx = length((in.uv - targetCenterUV) * dimensions);\n let innerRadius = radius * max(0.0, 1.0 - feather / 100.0);\n maskWeight = 1.0 - smoothstep(innerRadius, max(innerRadius + 0.001, radius), distPx);\n }\n\n let blendWeight = clamp(maskWeight * opacity, 0.0, 1.0);\n if (blendWeight < 1e-4) {\n return dstCol;\n }\n\n // Compute source sample coordinate (scaling from sourceRadius to target radius if different)\n let sourceCenterUV = targetCenterUV + vec2<f32>(offsetX, offsetY) / dimensions;\n let srcScale = max(1.0, sourceRadius) / max(1.0, radius);\n let uvFromTargetCenter = in.uv - targetCenterUV;\n let srcUV = clamp(sourceCenterUV + uvFromTargetCenter * srcScale, vec2<f32>(0.0), vec2<f32>(1.0));\n let srcCol = textureSampleLevel(srcTex, samp, srcUV, 0.0);\n\n var healedCol = srcCol;\n\n if (u.mode > 0.5 && u.mode < 1.5) {\n // Mode 1: Seamless Heal (Poisson gradient / local illumination matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n let dstBlur = sampleBoxBlur(srcTex, samp, in.uv, blurRadius, dimensions);\n\n let srcDetail = srcCol.rgb - srcBlur.rgb;\n let healedRgb = dstBlur.rgb + srcDetail;\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(srcCol.a));\n healedCol = vec4<f32>(clampedRgb, srcCol.a);\n } else if (u.mode >= 1.5) {\n // Mode 2: Texture Transfer (Luminance structure matching)\n let blurRadius = max(4.0, radius * 0.4);\n let srcBlur = sampleBoxBlur(srcTex, samp, srcUV, blurRadius, dimensions);\n\n let lumaSrc = getLuminance(srcCol.rgb);\n let lumaSrcBlur = getLuminance(srcBlur.rgb);\n let lumaDelta = lumaSrc - lumaSrcBlur;\n\n let healedRgb = dstCol.rgb + vec3<f32>(lumaDelta);\n let clampedRgb = clamp(healedRgb, vec3<f32>(0.0), vec3<f32>(dstCol.a));\n healedCol = vec4<f32>(clampedRgb, dstCol.a);\n }\n\n return mix(dstCol, healedCol, blendWeight);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = texturesLayout(device, 2);\n\tconst signalTextureLayout = texturesLayout(device, 8);\n\tres = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: `${WGSL_FULLSCREEN_VS}\\n${WGSL_PATCHHEAL_FS}` }),\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,\n\t\t\tblend: {\n\t\t\t\tcolor: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t},\n\t\t\t\talpha: {\n\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\tdstFactor: \"zero\",\n\t\t\t\t\toperation: \"add\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tvertexEntryPoint: \"vs_main\",\n\t\t\tfragmentEntryPoint: \"fs_main\"\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst PatchHealWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"PatchHeal\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"patch_heal_node\";\n\tconst { texture: tmpSrcTex, view: tmpSrcView } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-src`\n\t} });\n\tlet maskTex = null;\n\tif (op.maskMedia) ({texture: maskTex} = await drawChildToTexture(args, op.maskMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskMedia,\n\t\t\trenderId: `${props.renderId}-mask`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tmpSrcTex]\n\t\t},\n\t\texclude: [tmpSrcTex]\n\t}));\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout, signalTextureLayout: sigLayout } = getDeviceResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst patches = normalizePatches(op);\n\tconst resolveBindable = (configKey, fallbackVal, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = fallbackVal;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst numVal = typeof input.outputItem.data === \"number\" ? input.outputItem.data : input.outputItem.data?.value ?? fallbackVal;\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(numVal)));\n\t\t} else {\n\t\t\tconst rawVal = unwrapFrameParam(fallbackVal, compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? fallbackVal);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? fallbackVal : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst dummyMaskView = maskTex ? maskTex.createView() : tmpSrcView;\n\tlet currentInputTex = tmpSrcTex;\n\tconst pingTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst pongTex = patches.length > 1 ? ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpSrcTex,\n\t\tpingTex,\n\t\t...maskTex ? [maskTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]) : pingTex;\n\tfor (let i = 0; i < patches.length; i++) {\n\t\tconst patch = patches[i];\n\t\tconst isFirstPatch = i === 0;\n\t\tconst centerXRes = isFirstPatch ? resolveBindable(\"centerX\", patch.centerX, 0, 1) : {\n\t\t\tval: patch.centerX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst centerYRes = isFirstPatch ? resolveBindable(\"centerY\", patch.centerY, 0, 1) : {\n\t\t\tval: patch.centerY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetXRes = isFirstPatch ? resolveBindable(\"offsetX\", patch.offsetX, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetX,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst offsetYRes = isFirstPatch ? resolveBindable(\"offsetY\", patch.offsetY, -MAX_OFFSET, MAX_OFFSET) : {\n\t\t\tval: patch.offsetY,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst radiusRes = isFirstPatch ? resolveBindable(\"radius\", patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst sourceRadiusRes = isFirstPatch ? resolveBindable(\"sourceRadius\", patch.sourceRadius ?? patch.radius, 1, MAX_RADIUS) : {\n\t\t\tval: patch.sourceRadius ?? patch.radius,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst featherRes = isFirstPatch ? resolveBindable(\"feather\", patch.feather, 0, MAX_FEATHER) : {\n\t\t\tval: patch.feather,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst opacityRes = isFirstPatch ? resolveBindable(\"opacity\", patch.opacity, 0, 1) : {\n\t\t\tval: patch.opacity,\n\t\t\thasStaticSig: false,\n\t\t\tsd: null\n\t\t};\n\t\tconst signalContext = {\n\t\t\targs,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tframe,\n\t\t\tfps,\n\t\t\telapsedSeconds,\n\t\t\tdurationSeconds\n\t\t};\n\t\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\t\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\t\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\t\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\t\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\t\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\t\tconst sourceRadiusView = getSignalView(sourceRadiusRes, \"sourceRadius_sig\");\n\t\tconst featherView = getSignalView(featherRes, \"feather_sig\");\n\t\tconst opacityView = getSignalView(opacityRes, \"opacity_sig\");\n\t\tconst modeNum = patch.mode === \"Clone\" ? 0 : patch.mode === \"TextureTransfer\" ? 2 : 1;\n\t\tconst patchData = new Float32Array(20);\n\t\tpatchData[0] = offsetXRes.val;\n\t\tpatchData[1] = offsetYRes.val;\n\t\tpatchData[2] = centerXRes.val;\n\t\tpatchData[3] = centerYRes.val;\n\t\tpatchData[4] = radiusRes.val;\n\t\tpatchData[5] = sourceRadiusRes.val;\n\t\tpatchData[6] = featherRes.val;\n\t\tpatchData[7] = opacityRes.val;\n\t\tpatchData[8] = modeNum;\n\t\tpatchData[9] = maskTex ? 1 : 0;\n\t\tpatchData[10] = offsetXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[11] = offsetYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[12] = centerXRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[13] = centerYRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[14] = radiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[15] = sourceRadiusRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[16] = featherRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[17] = opacityRes.hasStaticSig ? 1 : 0;\n\t\tpatchData[18] = 0;\n\t\tpatchData[19] = 0;\n\t\tconst uBuffer = ctx.renderer.getTemporaryBuffer(patchData);\n\t\tconst destinationTex = i % 2 === 0 ? pingTex : pongTex;\n\t\tconst texBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: tLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: currentInputTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyMaskView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sourceRadiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: featherView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: opacityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tdrawFullscreenPass(encoder, destinationTex.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\ttexBindGroup,\n\t\t\tsigBindGroup\n\t\t]);\n\t\tcurrentInputTex = destinationTex;\n\t}\n\tdrawTextureToTarget(args, currentInputTex);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: PatchHealWebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, PatchHealResultSchema as c, patchHealConfig as d, MAX_OFFSET as i, PatchItemSchema as l, PatchHealWebGPURenderer as n, PATCH_HEAL_OUTPUT_TYPE_MAP as o, MAX_FEATHER as r, PatchHealNodeConfigSchema as s, renderers_default as t, normalizePatches as u };\n//# sourceMappingURL=renderers-i-B6z1sf.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { s as resolveHandleParam } from "./renderer-mNSyac1V.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-BoyykRdD.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CMaa63nz.mjs";
3
3
 
4
4
  //#region ../../nodes/node-color-balance/dist/renderers-BaZtHi33.mjs
5
5
  const deviceResourceCache = /* @__PURE__ */ new WeakMap();
@@ -307,4 +307,4 @@ var renderers_default = { WebGPURenderer: ColorBalanceWebGPURenderer };
307
307
 
308
308
  //#endregion
309
309
  export { renderers_default as n, ColorBalanceWebGPURenderer as t };
310
- //# sourceMappingURL=renderer-CuK1lPnA.mjs.map
310
+ //# sourceMappingURL=renderer-BlvGcyAN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CuK1lPnA.mjs","names":[],"sources":["../../../nodes/node-color-balance/dist/renderers-BaZtHi33.mjs"],"sourcesContent":["import { resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_COLOR_BALANCE_SHADER = `\nstruct ColorBalanceUniforms {\n\tshadows : vec4<f32>,\n\tmidtones : vec4<f32>,\n\thighlights : vec4<f32>,\n\tpreserveLuminosity : f32,\n\thasShadowsCyanRedSig : f32,\n\thasShadowsMagentaGreenSig : f32,\n\thasShadowsYellowBlueSig : f32,\n\n\thasMidtonesCyanRedSig : f32,\n\thasMidtonesMagentaGreenSig : f32,\n\thasMidtonesYellowBlueSig : f32,\n\thasHighlightsCyanRedSig : f32,\n\n\thasHighlightsMagentaGreenSig : f32,\n\thasHighlightsYellowBlueSig : f32,\n\t_pad0 : f32,\n\t_pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorBalanceUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var shadowsCyanRedSigTex : texture_2d<f32>;\n@group(2) @binding(1) var shadowsMagentaGreenSigTex : texture_2d<f32>;\n@group(2) @binding(2) var shadowsYellowBlueSigTex : texture_2d<f32>;\n@group(2) @binding(3) var midtonesCyanRedSigTex : texture_2d<f32>;\n@group(2) @binding(4) var midtonesMagentaGreenSigTex: texture_2d<f32>;\n@group(2) @binding(5) var midtonesYellowBlueSigTex : texture_2d<f32>;\n@group(2) @binding(6) var highlightsCyanRedSigTex : texture_2d<f32>;\n@group(2) @binding(7) var highlightsMagentaGreenSigTex: texture_2d<f32>;\n@group(2) @binding(8) var highlightsYellowBlueSigTex: texture_2d<f32>;\n@group(2) @binding(9) 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\nfn set_luminance(c: vec3<f32>, l: f32) -> vec3<f32> {\n\tlet d = l - get_luminance(c);\n\tvar res = c + vec3<f32>(d);\n\tlet min_c = min(res.r, min(res.g, res.b));\n\tlet max_c = max(res.r, max(res.g, res.b));\n\tif (min_c < 0.0) {\n\t\tres = l + ((res - vec3<f32>(l)) * l) / max(l - min_c, 1e-5);\n\t}\n\tif (max_c > 1.0) {\n\t\tres = l + ((res - vec3<f32>(l)) * (1.0 - l)) / max(max_c - l, 1e-5);\n\t}\n\treturn clamp(res, vec3<f32>(0.0), vec3<f32>(1.0));\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 alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\tvar sShift = u.shadows.rgb;\n\tif (u.hasShadowsCyanRedSig > 0.5) {\n\t\tsShift.r = clamp(textureSampleLevel(shadowsCyanRedSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasShadowsMagentaGreenSig > 0.5) {\n\t\tsShift.g = clamp(textureSampleLevel(shadowsMagentaGreenSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasShadowsYellowBlueSig > 0.5) {\n\t\tsShift.b = clamp(textureSampleLevel(shadowsYellowBlueSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\n\tvar mShift = u.midtones.rgb;\n\tif (u.hasMidtonesCyanRedSig > 0.5) {\n\t\tmShift.r = clamp(textureSampleLevel(midtonesCyanRedSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasMidtonesMagentaGreenSig > 0.5) {\n\t\tmShift.g = clamp(textureSampleLevel(midtonesMagentaGreenSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasMidtonesYellowBlueSig > 0.5) {\n\t\tmShift.b = clamp(textureSampleLevel(midtonesYellowBlueSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\n\tvar hShift = u.highlights.rgb;\n\tif (u.hasHighlightsCyanRedSig > 0.5) {\n\t\thShift.r = clamp(textureSampleLevel(highlightsCyanRedSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasHighlightsMagentaGreenSig > 0.5) {\n\t\thShift.g = clamp(textureSampleLevel(highlightsMagentaGreenSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasHighlightsYellowBlueSig > 0.5) {\n\t\thShift.b = clamp(textureSampleLevel(highlightsYellowBlueSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\n\tlet origLum = get_luminance(rgb);\n\n\t// Tonal range weighting curves\n\tlet wShadows = clamp((1.0 - origLum) * (1.0 - origLum * 1.5), 0.0, 1.0);\n\tlet wMidtones = clamp(1.0 - 4.0 * (origLum - 0.5) * (origLum - 0.5), 0.0, 1.0);\n\tlet wHighlights = clamp(origLum * (origLum * 1.5 - 0.5), 0.0, 1.0);\n\n\tlet delta = wShadows * sShift + wMidtones * mShift + wHighlights * hShift;\n\tvar adjustedRgb = clamp(rgb + delta, vec3<f32>(0.0), vec3<f32>(1.0));\n\n\tif (u.preserveLuminosity > 0.5) {\n\t\tadjustedRgb = set_luminance(adjustedRgb, origLum);\n\t}\n\n\treturn vec4<f32>(adjustedRgb * alpha, alpha);\n}\n`;\nfunction getColorBalanceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"], \"ColorBalanceUniformLayout\");\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"ColorBalanceTextureLayout\");\n\tconst signalTextureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"ColorBalanceSignalTextureLayout\");\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tlabel: \"ColorBalancePipeline\",\n\t\t\tmodule: device.createShaderModule({\n\t\t\t\tlabel: \"ColorBalanceShaderModule\",\n\t\t\t\tcode: WGSL_COLOR_BALANCE_SHADER\n\t\t\t}),\n\t\t\tlayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(24);\nconst ColorBalanceWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ColorBalance\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst childMedia = props.virtualMedia.children[0];\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 || \"colorbalance_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = -100, clampMax = 100) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst resolveVal = (val) => {\n\t\tif (val !== void 0 && val !== null) {\n\t\t\tif (typeof val === \"object\" && val !== null) {\n\t\t\t\tif (\"get\" in val && typeof val.get === \"function\") val = val.get({\n\t\t\t\t\tframe: compositionFrame,\n\t\t\t\t\tfps\n\t\t\t\t});\n\t\t\t\telse if (\"value\" in val) val = val.value;\n\t\t\t} else if (typeof val === \"function\") val = val(compositionFrame, fps);\n\t\t}\n\t\tconst n = Number(val ?? 0);\n\t\treturn isNaN(n) ? 0 : n;\n\t};\n\tconst sCR = resolveField(op.shadows_cyanRedHandleId, resolveVal(op.shadows?.cyanRed));\n\tconst sMG = resolveField(op.shadows_magentaGreenHandleId, resolveVal(op.shadows?.magentaGreen));\n\tconst sYB = resolveField(op.shadows_yellowBlueHandleId, resolveVal(op.shadows?.yellowBlue));\n\tconst mCR = resolveField(op.midtones_cyanRedHandleId, resolveVal(op.midtones?.cyanRed));\n\tconst mMG = resolveField(op.midtones_magentaGreenHandleId, resolveVal(op.midtones?.magentaGreen));\n\tconst mYB = resolveField(op.midtones_yellowBlueHandleId, resolveVal(op.midtones?.yellowBlue));\n\tconst hCR = resolveField(op.highlights_cyanRedHandleId, resolveVal(op.highlights?.cyanRed));\n\tconst hMG = resolveField(op.highlights_magentaGreenHandleId, resolveVal(op.highlights?.magentaGreen));\n\tconst hYB = resolveField(op.highlights_yellowBlueHandleId, resolveVal(op.highlights?.yellowBlue));\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { pipeline, uniformLayout, textureLayout, signalTextureLayout } = getColorBalanceResources(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 sCRView = getSignalView(sCR, \"shadows_cyanRed_sig\");\n\tconst sMGView = getSignalView(sMG, \"shadows_magentaGreen_sig\");\n\tconst sYBView = getSignalView(sYB, \"shadows_yellowBlue_sig\");\n\tconst mCRView = getSignalView(mCR, \"midtones_cyanRed_sig\");\n\tconst mMGView = getSignalView(mMG, \"midtones_magentaGreen_sig\");\n\tconst mYBView = getSignalView(mYB, \"midtones_yellowBlue_sig\");\n\tconst hCRView = getSignalView(hCR, \"highlights_cyanRed_sig\");\n\tconst hMGView = getSignalView(hMG, \"highlights_magentaGreen_sig\");\n\tconst hYBView = getSignalView(hYB, \"highlights_yellowBlue_sig\");\n\tconst preserveLum = op.preserveLuminosity === false ? 0 : 1;\n\tuniformBufferData[0] = sCR.val / 100;\n\tuniformBufferData[1] = sMG.val / 100;\n\tuniformBufferData[2] = sYB.val / 100;\n\tuniformBufferData[3] = 0;\n\tuniformBufferData[4] = mCR.val / 100;\n\tuniformBufferData[5] = mMG.val / 100;\n\tuniformBufferData[6] = mYB.val / 100;\n\tuniformBufferData[7] = 0;\n\tuniformBufferData[8] = hCR.val / 100;\n\tuniformBufferData[9] = hMG.val / 100;\n\tuniformBufferData[10] = hYB.val / 100;\n\tuniformBufferData[11] = 0;\n\tuniformBufferData[12] = preserveLum;\n\tuniformBufferData[13] = sCR.hasStaticSig ? 1 : 0;\n\tuniformBufferData[14] = sMG.hasStaticSig ? 1 : 0;\n\tuniformBufferData[15] = sYB.hasStaticSig ? 1 : 0;\n\tuniformBufferData[16] = mCR.hasStaticSig ? 1 : 0;\n\tuniformBufferData[17] = mMG.hasStaticSig ? 1 : 0;\n\tuniformBufferData[18] = mYB.hasStaticSig ? 1 : 0;\n\tuniformBufferData[19] = hCR.hasStaticSig ? 1 : 0;\n\tuniformBufferData[20] = hMG.hasStaticSig ? 1 : 0;\n\tuniformBufferData[21] = hYB.hasStaticSig ? 1 : 0;\n\tuniformBufferData[22] = 0;\n\tuniformBufferData[23] = 0;\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\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: signalTextureLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: sCRView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sMGView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sYBView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: mCRView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: mMGView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: mYBView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: hCRView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tresource: hMGView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tresource: hYBView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 9,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: ColorBalanceWebGPURenderer };\n\n//#endregion\nexport { ColorBalanceWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BaZtHi33.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BlvGcyAN.mjs","names":[],"sources":["../../../nodes/node-color-balance/dist/renderers-BaZtHi33.mjs"],"sourcesContent":["import { resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_COLOR_BALANCE_SHADER = `\nstruct ColorBalanceUniforms {\n\tshadows : vec4<f32>,\n\tmidtones : vec4<f32>,\n\thighlights : vec4<f32>,\n\tpreserveLuminosity : f32,\n\thasShadowsCyanRedSig : f32,\n\thasShadowsMagentaGreenSig : f32,\n\thasShadowsYellowBlueSig : f32,\n\n\thasMidtonesCyanRedSig : f32,\n\thasMidtonesMagentaGreenSig : f32,\n\thasMidtonesYellowBlueSig : f32,\n\thasHighlightsCyanRedSig : f32,\n\n\thasHighlightsMagentaGreenSig : f32,\n\thasHighlightsYellowBlueSig : f32,\n\t_pad0 : f32,\n\t_pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorBalanceUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var shadowsCyanRedSigTex : texture_2d<f32>;\n@group(2) @binding(1) var shadowsMagentaGreenSigTex : texture_2d<f32>;\n@group(2) @binding(2) var shadowsYellowBlueSigTex : texture_2d<f32>;\n@group(2) @binding(3) var midtonesCyanRedSigTex : texture_2d<f32>;\n@group(2) @binding(4) var midtonesMagentaGreenSigTex: texture_2d<f32>;\n@group(2) @binding(5) var midtonesYellowBlueSigTex : texture_2d<f32>;\n@group(2) @binding(6) var highlightsCyanRedSigTex : texture_2d<f32>;\n@group(2) @binding(7) var highlightsMagentaGreenSigTex: texture_2d<f32>;\n@group(2) @binding(8) var highlightsYellowBlueSigTex: texture_2d<f32>;\n@group(2) @binding(9) 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\nfn set_luminance(c: vec3<f32>, l: f32) -> vec3<f32> {\n\tlet d = l - get_luminance(c);\n\tvar res = c + vec3<f32>(d);\n\tlet min_c = min(res.r, min(res.g, res.b));\n\tlet max_c = max(res.r, max(res.g, res.b));\n\tif (min_c < 0.0) {\n\t\tres = l + ((res - vec3<f32>(l)) * l) / max(l - min_c, 1e-5);\n\t}\n\tif (max_c > 1.0) {\n\t\tres = l + ((res - vec3<f32>(l)) * (1.0 - l)) / max(max_c - l, 1e-5);\n\t}\n\treturn clamp(res, vec3<f32>(0.0), vec3<f32>(1.0));\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 alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\tvar sShift = u.shadows.rgb;\n\tif (u.hasShadowsCyanRedSig > 0.5) {\n\t\tsShift.r = clamp(textureSampleLevel(shadowsCyanRedSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasShadowsMagentaGreenSig > 0.5) {\n\t\tsShift.g = clamp(textureSampleLevel(shadowsMagentaGreenSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasShadowsYellowBlueSig > 0.5) {\n\t\tsShift.b = clamp(textureSampleLevel(shadowsYellowBlueSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\n\tvar mShift = u.midtones.rgb;\n\tif (u.hasMidtonesCyanRedSig > 0.5) {\n\t\tmShift.r = clamp(textureSampleLevel(midtonesCyanRedSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasMidtonesMagentaGreenSig > 0.5) {\n\t\tmShift.g = clamp(textureSampleLevel(midtonesMagentaGreenSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasMidtonesYellowBlueSig > 0.5) {\n\t\tmShift.b = clamp(textureSampleLevel(midtonesYellowBlueSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\n\tvar hShift = u.highlights.rgb;\n\tif (u.hasHighlightsCyanRedSig > 0.5) {\n\t\thShift.r = clamp(textureSampleLevel(highlightsCyanRedSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasHighlightsMagentaGreenSig > 0.5) {\n\t\thShift.g = clamp(textureSampleLevel(highlightsMagentaGreenSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\tif (u.hasHighlightsYellowBlueSig > 0.5) {\n\t\thShift.b = clamp(textureSampleLevel(highlightsYellowBlueSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, -100.0, 100.0) / 100.0;\n\t}\n\n\tlet origLum = get_luminance(rgb);\n\n\t// Tonal range weighting curves\n\tlet wShadows = clamp((1.0 - origLum) * (1.0 - origLum * 1.5), 0.0, 1.0);\n\tlet wMidtones = clamp(1.0 - 4.0 * (origLum - 0.5) * (origLum - 0.5), 0.0, 1.0);\n\tlet wHighlights = clamp(origLum * (origLum * 1.5 - 0.5), 0.0, 1.0);\n\n\tlet delta = wShadows * sShift + wMidtones * mShift + wHighlights * hShift;\n\tvar adjustedRgb = clamp(rgb + delta, vec3<f32>(0.0), vec3<f32>(1.0));\n\n\tif (u.preserveLuminosity > 0.5) {\n\t\tadjustedRgb = set_luminance(adjustedRgb, origLum);\n\t}\n\n\treturn vec4<f32>(adjustedRgb * alpha, alpha);\n}\n`;\nfunction getColorBalanceResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"], \"ColorBalanceUniformLayout\");\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"ColorBalanceTextureLayout\");\n\tconst signalTextureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"ColorBalanceSignalTextureLayout\");\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tlabel: \"ColorBalancePipeline\",\n\t\t\tmodule: device.createShaderModule({\n\t\t\t\tlabel: \"ColorBalanceShaderModule\",\n\t\t\t\tcode: WGSL_COLOR_BALANCE_SHADER\n\t\t\t}),\n\t\t\tlayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(24);\nconst ColorBalanceWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ColorBalance\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst childMedia = props.virtualMedia.children[0];\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 || \"colorbalance_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = -100, clampMax = 100) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst resolveVal = (val) => {\n\t\tif (val !== void 0 && val !== null) {\n\t\t\tif (typeof val === \"object\" && val !== null) {\n\t\t\t\tif (\"get\" in val && typeof val.get === \"function\") val = val.get({\n\t\t\t\t\tframe: compositionFrame,\n\t\t\t\t\tfps\n\t\t\t\t});\n\t\t\t\telse if (\"value\" in val) val = val.value;\n\t\t\t} else if (typeof val === \"function\") val = val(compositionFrame, fps);\n\t\t}\n\t\tconst n = Number(val ?? 0);\n\t\treturn isNaN(n) ? 0 : n;\n\t};\n\tconst sCR = resolveField(op.shadows_cyanRedHandleId, resolveVal(op.shadows?.cyanRed));\n\tconst sMG = resolveField(op.shadows_magentaGreenHandleId, resolveVal(op.shadows?.magentaGreen));\n\tconst sYB = resolveField(op.shadows_yellowBlueHandleId, resolveVal(op.shadows?.yellowBlue));\n\tconst mCR = resolveField(op.midtones_cyanRedHandleId, resolveVal(op.midtones?.cyanRed));\n\tconst mMG = resolveField(op.midtones_magentaGreenHandleId, resolveVal(op.midtones?.magentaGreen));\n\tconst mYB = resolveField(op.midtones_yellowBlueHandleId, resolveVal(op.midtones?.yellowBlue));\n\tconst hCR = resolveField(op.highlights_cyanRedHandleId, resolveVal(op.highlights?.cyanRed));\n\tconst hMG = resolveField(op.highlights_magentaGreenHandleId, resolveVal(op.highlights?.magentaGreen));\n\tconst hYB = resolveField(op.highlights_yellowBlueHandleId, resolveVal(op.highlights?.yellowBlue));\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { pipeline, uniformLayout, textureLayout, signalTextureLayout } = getColorBalanceResources(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 sCRView = getSignalView(sCR, \"shadows_cyanRed_sig\");\n\tconst sMGView = getSignalView(sMG, \"shadows_magentaGreen_sig\");\n\tconst sYBView = getSignalView(sYB, \"shadows_yellowBlue_sig\");\n\tconst mCRView = getSignalView(mCR, \"midtones_cyanRed_sig\");\n\tconst mMGView = getSignalView(mMG, \"midtones_magentaGreen_sig\");\n\tconst mYBView = getSignalView(mYB, \"midtones_yellowBlue_sig\");\n\tconst hCRView = getSignalView(hCR, \"highlights_cyanRed_sig\");\n\tconst hMGView = getSignalView(hMG, \"highlights_magentaGreen_sig\");\n\tconst hYBView = getSignalView(hYB, \"highlights_yellowBlue_sig\");\n\tconst preserveLum = op.preserveLuminosity === false ? 0 : 1;\n\tuniformBufferData[0] = sCR.val / 100;\n\tuniformBufferData[1] = sMG.val / 100;\n\tuniformBufferData[2] = sYB.val / 100;\n\tuniformBufferData[3] = 0;\n\tuniformBufferData[4] = mCR.val / 100;\n\tuniformBufferData[5] = mMG.val / 100;\n\tuniformBufferData[6] = mYB.val / 100;\n\tuniformBufferData[7] = 0;\n\tuniformBufferData[8] = hCR.val / 100;\n\tuniformBufferData[9] = hMG.val / 100;\n\tuniformBufferData[10] = hYB.val / 100;\n\tuniformBufferData[11] = 0;\n\tuniformBufferData[12] = preserveLum;\n\tuniformBufferData[13] = sCR.hasStaticSig ? 1 : 0;\n\tuniformBufferData[14] = sMG.hasStaticSig ? 1 : 0;\n\tuniformBufferData[15] = sYB.hasStaticSig ? 1 : 0;\n\tuniformBufferData[16] = mCR.hasStaticSig ? 1 : 0;\n\tuniformBufferData[17] = mMG.hasStaticSig ? 1 : 0;\n\tuniformBufferData[18] = mYB.hasStaticSig ? 1 : 0;\n\tuniformBufferData[19] = hCR.hasStaticSig ? 1 : 0;\n\tuniformBufferData[20] = hMG.hasStaticSig ? 1 : 0;\n\tuniformBufferData[21] = hYB.hasStaticSig ? 1 : 0;\n\tuniformBufferData[22] = 0;\n\tuniformBufferData[23] = 0;\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\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: signalTextureLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: sCRView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sMGView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sYBView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: mCRView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: mMGView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: mYBView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: hCRView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tresource: hMGView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tresource: hYBView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 9,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: ColorBalanceWebGPURenderer };\n\n//#endregion\nexport { ColorBalanceWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BaZtHi33.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-BcJoO4Nm.mjs";
2
2
  import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import "./dist-CnFcSau0.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-BoyykRdD.mjs";
3
+ import "./dist-C1cCW7Bt.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-CMaa63nz.mjs";
5
5
 
6
6
  //#region ../../nodes/node-op-art/dist/renderers-BYCqPRmD.mjs
7
7
  const OP = "OpArt";
@@ -230,4 +230,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: OpArtWebGPURenderer });
230
230
 
231
231
  //#endregion
232
232
  export { OpArtWebGPURenderer, renderers_default as default };
233
- //# sourceMappingURL=renderer-DX5ZpEBB.mjs.map
233
+ //# sourceMappingURL=renderer-BpIF1QIE.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DX5ZpEBB.mjs","names":[],"sources":["../../../nodes/node-op-art/dist/renderers-BYCqPRmD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"OpArt\";\nconst UNIFORM_FLOATS = 20;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 5> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet pattern = u32(u.v[1].x + 0.5);\n\tlet frequency = u.v[1].y;\n\tlet angle = u.v[1].z;\n\tlet warp = u.v[1].w;\n\tlet source = u.v[2].x;\n\tlet colorA = u.v[3];\n\tlet colorB = u.v[4];\n\n\tlet R = res();\n\tlet c = sampleS(in.uv);\n\tlet l = luma(c.rgb) * c.a + (1.0 - c.a);\n\tvar p = (in.uv - 0.5) * vec2<f32>(R.x / R.y, 1.0);\n\tp = rot2(radians(angle)) * p;\n\tvar v = p.y * frequency;\n\tif (pattern == 1u) { v = length(p) * frequency; }\n\tif (pattern == 3u) { v = p.y * frequency + sin(p.x * frequency * 0.25) * 2.0; }\n\tv += (1.0 - l) * warp * 3.0;\n\tvar v2 = p.x * frequency + (1.0 - l) * warp * 3.0;\n\tlet duty = mix(0.5, clamp(1.0 - l, 0.05, 0.95), source);\n\tlet e = max(fwidth(v), 1e-4);\n\tlet e2 = max(fwidth(v2), 1e-4);\n\tlet s = fract(v);\n\tvar ink = smoothstep(duty + e, duty - e, s) * smoothstep(-e, e, s);\n\tif (pattern == 2u) {\n\t\tlet s2 = fract(v2);\n\t\tlet a = step(0.5, s);\n\t\tlet b = step(0.5, s2);\n\t\tink = abs(a - b);\n\t\tink = mix(ink, 1.0 - ink, step(duty, 0.5) * 0.0);\n\t\tlet edgeA = smoothstep(0.0, e, min(s, 1.0 - s)) * smoothstep(0.0, e, abs(s - 0.5));\n\t\tlet edgeB = smoothstep(0.0, e2, min(s2, 1.0 - s2)) * smoothstep(0.0, e2, abs(s2 - 0.5));\n\t\tink = mix(0.5, ink, edgeA * edgeB);\n\t}\n\treturn vec4<f32>(mix(colorB.rgb, colorA.rgb, ink), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = Math.max(0, [\n\t\t\"stripes\",\n\t\t\"rings\",\n\t\t\"checker\",\n\t\t\"waves\"\n\t].indexOf(String(raw.pattern ?? \"stripes\")));\n\tdata[5] = num(raw.frequency, 48);\n\tdata[6] = num(raw.angle, 0);\n\tdata[7] = num(raw.warp, .6);\n\tdata[8] = num(raw.source, 1);\n\tdata.set(hexToRgba(String(raw.colorA ?? \"#0a0a0a\")), 12);\n\tdata.set(hexToRgba(String(raw.colorB ?? \"#f5f5f5\")), 16);\n}\nconst OpArtWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: OpArtWebGPURenderer });\n\n//#endregion\nexport { OpArtWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BYCqPRmD.mjs.map"],"mappings":";;;;;;AAIA,MAAM,KAAK;AACX,MAAM,iBAAiB;;AAEvB,MAAM,SAAS,CAAC;;;;;EAKd,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmFrB;AACF,MAAM,YAAY,WAAW,YAAY;CACxC,QAAQ,wBAAwB,QAAQ;EACvC;EACA;EACA;EACA;EACA,EAAE,GAAG,GAAG,SAAS;CAClB,2BAA2B,IAAI,KAAK;CACpC,SAAS,OAAO,cAAc;EAC7B,WAAW;EACX,WAAW;EACX,cAAc;EACd,cAAc;EACd,CAAC;CACF,EAAE;AACH,SAAS,aAAa,QAAQ,QAAQ;CACrC,MAAM,IAAI,UAAU,OAAO;CAC3B,IAAI,OAAO,EAAE,UAAU,IAAI,OAAO;AAClC,KAAI,CAAC,MAAM;AACV,SAAO,OAAO,KAAK,MAAM,MAAM;GAC9B,MAAM,SAAS,OAAO,mBAAmB;IACxC;IACA,OAAO,GAAG,GAAG,GAAG,EAAE;IAClB,CAAC;AACF,UAAO,OAAO,qBAAqB;IAClC,OAAO,GAAG,GAAG,GAAG;IAChB,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;IACrE,QAAQ;KACP;KACA,YAAY;KACZ;IACD,UAAU;KACT;KACA,YAAY;KACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;KACrB;IACD,WAAW,EAAE,UAAU,kBAAkB;IACzC,CAAC;IACD;AACF,IAAE,UAAU,IAAI,QAAQ,KAAK;;AAE9B,QAAO;;AAER,SAAS,IAAI,GAAG,UAAU;CACzB,MAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,EAAE;AAC/C,QAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;AAEjC,SAAS,UAAU,KAAK;CACvB,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG;AACnC,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,KAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,GAAG;CAC3E,MAAM,KAAK,MAAM,OAAO,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG;AAC1D,QAAO;EACN,EAAE,EAAE;EACJ,EAAE,EAAE;EACJ,EAAE,EAAE;EACJ,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG;EACvB;;;AAGF,SAAS,KAAK,KAAK,MAAM,MAAM,OAAO;AACrC,MAAK,KAAK,EAAE;AACZ,MAAK,KAAK;AACV,MAAK,KAAK;AACV,MAAK,KAAK,KAAK,IAAI,GAAG;EACrB;EACA;EACA;EACA;EACA,CAAC,QAAQ,OAAO,IAAI,WAAW,UAAU,CAAC,CAAC;AAC5C,MAAK,KAAK,IAAI,IAAI,WAAW,GAAG;AAChC,MAAK,KAAK,IAAI,IAAI,OAAO,EAAE;AAC3B,MAAK,KAAK,IAAI,IAAI,MAAM,GAAG;AAC3B,MAAK,KAAK,IAAI,IAAI,QAAQ,EAAE;AAC5B,MAAK,IAAI,UAAU,OAAO,IAAI,UAAU,UAAU,CAAC,EAAE,GAAG;AACxD,MAAK,IAAI,UAAU,OAAO,IAAI,UAAU,UAAU,CAAC,EAAE,GAAG;;AAEzD,MAAM,sBAAsB,OAAO,SAAS;CAC3C,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,GAAI;CACnB,MAAM,QAAQ,MAAM,cAAc,WAAW;AAC7C,KAAI,CAAC,MAAO;AACZ,MAAK,KAAK;CACV,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,MAAM,MAAM,oBAAoB,MAAM,SAAS,EAAE;CACpE,MAAM,MAAM,GAAG,QAAQ,kBAAkB,GAAG,OAAO,gBAAgB;EAClE;EACA;EACA,MAAM,QAAQ;EACd,CAAC,GAAG;CACL,MAAM,OAAO,IAAI,aAAa,eAAe;AAC7C,MAAK,KAAK,MAAM,QAAQ,KAAK,MAAM;CACnC,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,MAAM;CACnE,MAAM,SAAS,IAAI;CACnB,MAAM,IAAI,UAAU,OAAO;CAC3B,MAAM,YAAY,aAAa,QAAQ,IAAI,SAAS,OAAO;CAC3D,MAAM,MAAM,IAAI,SAAS,mBAAmB,KAAK;CACjD,IAAI,OAAO;AACX,MAAK,MAAM,YAAY,WAAW;EACjC,MAAM,MAAM,IAAI,SAAS,oBAAoB,aAAa,cAAc;GACvE;GACA;GACA;GACA,GAAG,MAAM,mBAAmB,EAAE;GAC9B,CAAC;AACF,qBAAmB,SAAS,IAAI,YAAY,EAAE,UAAU,CAAC,OAAO,gBAAgB;GAC/E,QAAQ,EAAE;GACV,SAAS;IACR;KACC,SAAS;KACT,UAAU,EAAE,QAAQ,KAAK;KACzB;IACD;KACC,SAAS;KACT,UAAU,SAAS,YAAY;KAC/B;IACD;KACC,SAAS;KACT,UAAU,KAAK,YAAY;KAC3B;IACD;KACC,SAAS;KACT,UAAU,EAAE;KACZ;IACD;GACD,CAAC,CAAC,CAAC;AACJ,SAAO;;AAER,qBAAoB,MAAM,KAAK;;AAKhC,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,qBAAqB,CAAC"}
1
+ {"version":3,"file":"renderer-BpIF1QIE.mjs","names":[],"sources":["../../../nodes/node-op-art/dist/renderers-BYCqPRmD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"OpArt\";\nconst UNIFORM_FLOATS = 20;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 5> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet pattern = u32(u.v[1].x + 0.5);\n\tlet frequency = u.v[1].y;\n\tlet angle = u.v[1].z;\n\tlet warp = u.v[1].w;\n\tlet source = u.v[2].x;\n\tlet colorA = u.v[3];\n\tlet colorB = u.v[4];\n\n\tlet R = res();\n\tlet c = sampleS(in.uv);\n\tlet l = luma(c.rgb) * c.a + (1.0 - c.a);\n\tvar p = (in.uv - 0.5) * vec2<f32>(R.x / R.y, 1.0);\n\tp = rot2(radians(angle)) * p;\n\tvar v = p.y * frequency;\n\tif (pattern == 1u) { v = length(p) * frequency; }\n\tif (pattern == 3u) { v = p.y * frequency + sin(p.x * frequency * 0.25) * 2.0; }\n\tv += (1.0 - l) * warp * 3.0;\n\tvar v2 = p.x * frequency + (1.0 - l) * warp * 3.0;\n\tlet duty = mix(0.5, clamp(1.0 - l, 0.05, 0.95), source);\n\tlet e = max(fwidth(v), 1e-4);\n\tlet e2 = max(fwidth(v2), 1e-4);\n\tlet s = fract(v);\n\tvar ink = smoothstep(duty + e, duty - e, s) * smoothstep(-e, e, s);\n\tif (pattern == 2u) {\n\t\tlet s2 = fract(v2);\n\t\tlet a = step(0.5, s);\n\t\tlet b = step(0.5, s2);\n\t\tink = abs(a - b);\n\t\tink = mix(ink, 1.0 - ink, step(duty, 0.5) * 0.0);\n\t\tlet edgeA = smoothstep(0.0, e, min(s, 1.0 - s)) * smoothstep(0.0, e, abs(s - 0.5));\n\t\tlet edgeB = smoothstep(0.0, e2, min(s2, 1.0 - s2)) * smoothstep(0.0, e2, abs(s2 - 0.5));\n\t\tink = mix(0.5, ink, edgeA * edgeB);\n\t}\n\treturn vec4<f32>(mix(colorB.rgb, colorA.rgb, ink), 1.0);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = Math.max(0, [\n\t\t\"stripes\",\n\t\t\"rings\",\n\t\t\"checker\",\n\t\t\"waves\"\n\t].indexOf(String(raw.pattern ?? \"stripes\")));\n\tdata[5] = num(raw.frequency, 48);\n\tdata[6] = num(raw.angle, 0);\n\tdata[7] = num(raw.warp, .6);\n\tdata[8] = num(raw.source, 1);\n\tdata.set(hexToRgba(String(raw.colorA ?? \"#0a0a0a\")), 12);\n\tdata.set(hexToRgba(String(raw.colorB ?? \"#f5f5f5\")), 16);\n}\nconst OpArtWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: OpArtWebGPURenderer });\n\n//#endregion\nexport { OpArtWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BYCqPRmD.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-BcJoO4Nm.mjs";
2
+ import "./dist-C1cCW7Bt.mjs";
3
+ import { t as renderers_default } from "./renderer-BAusZ6Vu.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-BcJoO4Nm.mjs";
2
+ import "./dist-C1cCW7Bt.mjs";
3
+ import { t as renderers_default } from "./renderer-DpruWmZU.mjs";
4
+
5
+ export { renderers_default as default };