framefields 2.8.1 → 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 (431) hide show
  1. package/README.md +30 -1
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-vatRe308.mjs → audio-BfQg37MW.mjs} +3 -3
  4. package/dist/{audio-vatRe308.mjs.map → audio-BfQg37MW.mjs.map} +1 -1
  5. package/dist/cli/check-worker.mjs +44 -44
  6. package/dist/components/index.d.mts +2 -2
  7. package/dist/components/index.mjs +43 -43
  8. package/dist/{dist-CFe1fC9l.mjs → dist-C1cCW7Bt.mjs} +8 -1
  9. package/dist/{dist-CFe1fC9l.mjs.map → dist-C1cCW7Bt.mjs.map} +1 -1
  10. package/dist/{dist-BbwtlSZO.mjs → dist-C8Xq3zgx.mjs} +2 -2
  11. package/dist/{dist-BbwtlSZO.mjs.map → dist-C8Xq3zgx.mjs.map} +1 -1
  12. package/dist/effects/index.d.mts +1 -1
  13. package/dist/effects/index.mjs +35 -35
  14. package/dist/{effects-CCyfjbhZ.mjs → effects-CemgqEPv.mjs} +2 -2
  15. package/dist/{effects-CCyfjbhZ.mjs.map → effects-CemgqEPv.mjs.map} +1 -1
  16. package/dist/fonts/index.mjs +2 -2
  17. package/dist/{fonts-C1mgtkCa.mjs → fonts-BW0pPcvJ.mjs} +2 -2
  18. package/dist/{fonts-C1mgtkCa.mjs.map → fonts-BW0pPcvJ.mjs.map} +1 -1
  19. package/dist/{gpu-CU2tEKJJ.mjs → gpu-CMaa63nz.mjs} +2 -2
  20. package/dist/{gpu-CU2tEKJJ.mjs.map → gpu-CMaa63nz.mjs.map} +1 -1
  21. package/dist/{index-BwRrsP_V.d.mts → index-CZjrnylh.d.mts} +457 -417
  22. package/dist/index-CZjrnylh.d.mts.map +1 -0
  23. package/dist/index-D5UDyVMb.d.mts.map +1 -1
  24. package/dist/{index-UDDAfHAF.d.mts → index-Du5YgdzM.d.mts} +50 -12
  25. package/dist/index-Du5YgdzM.d.mts.map +1 -0
  26. package/dist/index.d.mts +3 -3
  27. package/dist/index.mjs +50 -50
  28. package/dist/preview/index.mjs +10 -10
  29. package/dist/{preview-WXbsf6Dv.mjs → preview-BQVgn6Ho.mjs} +2 -2
  30. package/dist/{preview-WXbsf6Dv.mjs.map → preview-BQVgn6Ho.mjs.map} +1 -1
  31. package/dist/preview-engine/audio.mjs +1 -1
  32. package/dist/preview-engine/{chunk-JGDZQCNU.mjs → chunk-2B722GXM.mjs} +1 -1
  33. package/dist/preview-engine/{chunk-GFW3D464.mjs → chunk-2DWY7UBV.mjs} +1 -1
  34. package/dist/preview-engine/{chunk-72DYOIMP.mjs → chunk-2PYTDN2C.mjs} +1 -1
  35. package/dist/preview-engine/{chunk-PF3SXQNV.mjs → chunk-34DL53D5.mjs} +1 -1
  36. package/dist/preview-engine/{chunk-GLXJOXBE.mjs → chunk-34RJ7GAS.mjs} +1 -1
  37. package/dist/preview-engine/{chunk-6OY4YLTC.mjs → chunk-35HMRW4I.mjs} +1 -1
  38. package/dist/preview-engine/chunk-374QY63R.mjs +1974 -0
  39. package/dist/preview-engine/{chunk-W26U6BP2.mjs → chunk-4WYM72ZN.mjs} +1 -1
  40. package/dist/preview-engine/{chunk-EQ4VBUWM.mjs → chunk-5AWAOMBR.mjs} +1 -1
  41. package/dist/preview-engine/{chunk-J4SHMCTG.mjs → chunk-6R3UJBL5.mjs} +1 -1
  42. package/dist/preview-engine/{chunk-VHGC72XP.mjs → chunk-73CNXGAK.mjs} +1 -1
  43. package/dist/preview-engine/{chunk-KYOPOCO5.mjs → chunk-AHQCDTD6.mjs} +1 -1
  44. package/dist/preview-engine/{chunk-ADV2TIKA.mjs → chunk-BEYA25UZ.mjs} +1 -1
  45. package/dist/preview-engine/{chunk-RBDIRBEI.mjs → chunk-BJV2LBII.mjs} +1 -1
  46. package/dist/preview-engine/{chunk-LBJBBEKP.mjs → chunk-BVDWS3D2.mjs} +1 -1
  47. package/dist/preview-engine/chunk-BXPM5SJ3.mjs +1 -0
  48. package/dist/preview-engine/{chunk-NIPWL6Z5.mjs → chunk-C4M3B2Q2.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-LLUFOFF4.mjs → chunk-CC4NNNIY.mjs} +1 -1
  50. package/dist/preview-engine/chunk-CCB3VTY2.mjs +39 -0
  51. package/dist/preview-engine/{chunk-NX66555S.mjs → chunk-CN2VLYLB.mjs} +1 -1
  52. package/dist/preview-engine/{chunk-SK7PUBTC.mjs → chunk-DMSZXG56.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-WC257OBY.mjs → chunk-DVZITDQS.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-COZG35ZR.mjs → chunk-FTCEG3SF.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-57LES7TL.mjs → chunk-GA4HNR44.mjs} +1 -1
  56. package/dist/preview-engine/chunk-GEUUXTDL.mjs +138 -0
  57. package/dist/preview-engine/{chunk-S4WNCEMO.mjs → chunk-GIICZZQI.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-RTHU7REC.mjs → chunk-GRJJVSOV.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-RGDM6PQ5.mjs → chunk-GZWA5QJS.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-LZNNM5OB.mjs → chunk-H7BSN7V7.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-JXUENEQO.mjs → chunk-HOV6DDBZ.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-C6XLAJLL.mjs → chunk-JSYG6OWZ.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-GZVPVOHB.mjs → chunk-K3C6GUQD.mjs} +1 -1
  64. package/dist/preview-engine/chunk-KOVN277Z.mjs +1 -0
  65. package/dist/preview-engine/{chunk-Y6TWMUJC.mjs → chunk-LVYVXVZO.mjs} +1 -1
  66. package/dist/preview-engine/{chunk-NKAVHU7H.mjs → chunk-MIEH74UH.mjs} +7 -7
  67. package/dist/preview-engine/{chunk-AVDHZNIZ.mjs → chunk-OH5W5EL6.mjs} +1 -1
  68. package/dist/preview-engine/{chunk-22F33PPP.mjs → chunk-P5FKRQFU.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-7X2AUKTU.mjs → chunk-PM2W4VLT.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-PYX6Q2EJ.mjs → chunk-QCSVT73T.mjs} +1 -1
  71. package/dist/preview-engine/{chunk-523CTDOC.mjs → chunk-RJIAES3X.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-DPQN7WYQ.mjs → chunk-S2ABWY5G.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-G7JJ6HVL.mjs → chunk-SF37HXAH.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-OKLYIQ5F.mjs → chunk-SPJPM43P.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-UOTMBWBJ.mjs → chunk-TNJEZKXM.mjs} +1 -1
  76. package/dist/preview-engine/chunk-ULOFDFHJ.mjs +1 -0
  77. package/dist/preview-engine/{chunk-LLB3AGBQ.mjs → chunk-UQKPDGEH.mjs} +1 -1
  78. package/dist/preview-engine/{chunk-DISKQ5MH.mjs → chunk-UXYM2G6J.mjs} +1 -1
  79. package/dist/preview-engine/{chunk-U5YNECNG.mjs → chunk-VN36PRVD.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-PMOKPVSD.mjs → chunk-VVE2QHVG.mjs} +1 -1
  81. package/dist/preview-engine/{chunk-PEUQRSIM.mjs → chunk-Y5K5LVOR.mjs} +1 -1
  82. package/dist/preview-engine/chunk-YGKO4NIU.mjs +1 -0
  83. package/dist/preview-engine/{chunk-PSEMCJBH.mjs → chunk-ZJ5SWTCW.mjs} +1 -1
  84. package/dist/preview-engine/chunk-ZY47XIRK.mjs +5 -0
  85. package/dist/preview-engine/components.mjs +1 -1
  86. package/dist/preview-engine/effects.mjs +1 -1
  87. package/dist/preview-engine/framefields.mjs +1 -1
  88. package/dist/preview-engine/player.mjs +1 -1
  89. package/dist/preview-engine/renderers-3BOQOUEU.mjs +1 -0
  90. package/dist/preview-engine/renderers-3M2FESR2.mjs +1 -0
  91. package/dist/preview-engine/{renderers-FEEIDQF3.mjs → renderers-4F7WLQD5.mjs} +1 -1
  92. package/dist/preview-engine/{renderers-OP6MKYRM.mjs → renderers-5KANN7XF.mjs} +1 -1
  93. package/dist/preview-engine/{renderers-TVRR7PGN.mjs → renderers-5TO2SXFR.mjs} +1 -1
  94. package/dist/preview-engine/{renderers-DR7UZ3QR.mjs → renderers-5UZ3YFBD.mjs} +1 -1
  95. package/dist/preview-engine/renderers-6LHIWKMZ.mjs +1 -0
  96. package/dist/preview-engine/{renderers-7F2KF5RE.mjs → renderers-6Z7DWAPH.mjs} +1 -1
  97. package/dist/preview-engine/renderers-77PDUMYI.mjs +1 -0
  98. package/dist/preview-engine/{renderers-3J3NCOAI.mjs → renderers-7C5RA3R5.mjs} +1 -1
  99. package/dist/preview-engine/{renderers-KPCQGBIY.mjs → renderers-7XHO6M3B.mjs} +1 -1
  100. package/dist/preview-engine/{renderers-KJAOPYAU.mjs → renderers-A24KZK2Q.mjs} +1 -1
  101. package/dist/preview-engine/renderers-A43VCJ7X.mjs +1 -0
  102. package/dist/preview-engine/renderers-AKY464RY.mjs +1 -0
  103. package/dist/preview-engine/renderers-C5UO6PL5.mjs +1 -0
  104. package/dist/preview-engine/renderers-C64QSZO4.mjs +1 -0
  105. package/dist/preview-engine/renderers-CIRCR6NG.mjs +1 -0
  106. package/dist/preview-engine/renderers-CIWOPETY.mjs +1 -0
  107. package/dist/preview-engine/renderers-CUMVIVHI.mjs +1 -0
  108. package/dist/preview-engine/renderers-CZEZCELP.mjs +1 -0
  109. package/dist/preview-engine/{renderers-R3YVLWKV.mjs → renderers-ENMY4DKF.mjs} +1 -1
  110. package/dist/preview-engine/{renderers-AAENCA7X.mjs → renderers-FSI5KNGZ.mjs} +1 -1
  111. package/dist/preview-engine/renderers-FSQMWHQM.mjs +1 -0
  112. package/dist/preview-engine/renderers-FZEW5C23.mjs +1 -0
  113. package/dist/preview-engine/renderers-HCET2IML.mjs +1 -0
  114. package/dist/preview-engine/{renderers-LBX7GPDU.mjs → renderers-IHGAWLUF.mjs} +1 -1
  115. package/dist/preview-engine/renderers-IUOOC6K7.mjs +1 -0
  116. package/dist/preview-engine/{renderers-VXMR47WZ.mjs → renderers-KC6ZSKCW.mjs} +1 -1
  117. package/dist/preview-engine/renderers-KYYJLVIJ.mjs +1 -0
  118. package/dist/preview-engine/renderers-L4GE7WV3.mjs +1 -0
  119. package/dist/preview-engine/renderers-L6YDX6GS.mjs +1 -0
  120. package/dist/preview-engine/renderers-LRAFWKCO.mjs +1 -0
  121. package/dist/preview-engine/renderers-LU3XZWEB.mjs +1 -0
  122. package/dist/preview-engine/{renderers-4YYGKLDK.mjs → renderers-MD3PRFZL.mjs} +1 -1
  123. package/dist/preview-engine/renderers-MOEC2XZZ.mjs +1 -0
  124. package/dist/preview-engine/{renderers-RGDTRVZM.mjs → renderers-NCGH2WWJ.mjs} +1 -1
  125. package/dist/preview-engine/renderers-ND2WV4K3.mjs +1 -0
  126. package/dist/preview-engine/renderers-NJ5CWVVH.mjs +1 -0
  127. package/dist/preview-engine/renderers-NKXYPR3V.mjs +1 -0
  128. package/dist/preview-engine/{renderers-WVQQZQ6Y.mjs → renderers-NUAI4TO5.mjs} +1 -1
  129. package/dist/preview-engine/renderers-NWR66CGK.mjs +1 -0
  130. package/dist/preview-engine/renderers-O22WTBRM.mjs +1 -0
  131. package/dist/preview-engine/renderers-O55BEDQZ.mjs +1 -0
  132. package/dist/preview-engine/renderers-PBBA7LQB.mjs +1 -0
  133. package/dist/preview-engine/{renderers-BL7Z3FTF.mjs → renderers-PIIEUKFE.mjs} +1 -1
  134. package/dist/preview-engine/renderers-PPZK6VEW.mjs +1 -0
  135. package/dist/preview-engine/renderers-Q6LJRZ7R.mjs +1 -0
  136. package/dist/preview-engine/{renderers-7TNEKJZS.mjs → renderers-QA2HKUJJ.mjs} +1 -1
  137. package/dist/preview-engine/renderers-RMEACSRL.mjs +1 -0
  138. package/dist/preview-engine/{renderers-AWRIELVX.mjs → renderers-RN2MHIFK.mjs} +1 -1
  139. package/dist/preview-engine/renderers-SEIAUKJF.mjs +1 -0
  140. package/dist/preview-engine/renderers-SP42LCSI.mjs +1 -0
  141. package/dist/preview-engine/{renderers-OE55O27K.mjs → renderers-T74CQCEN.mjs} +1 -1
  142. package/dist/preview-engine/renderers-T7SZA3BX.mjs +1 -0
  143. package/dist/preview-engine/{renderers-ZUQ2ZBYY.mjs → renderers-TGJSOKDY.mjs} +1 -1
  144. package/dist/preview-engine/renderers-TSBV4KPE.mjs +1 -0
  145. package/dist/preview-engine/{renderers-2SE5BLLB.mjs → renderers-U4M7ZCV4.mjs} +1 -1
  146. package/dist/preview-engine/{renderers-YEI4K4W4.mjs → renderers-V3AQO7AR.mjs} +1 -1
  147. package/dist/preview-engine/renderers-VADTDAHD.mjs +1 -0
  148. package/dist/preview-engine/renderers-VNNWI5C3.mjs +1 -0
  149. package/dist/preview-engine/{renderers-YYMRKHAA.mjs → renderers-WEYAHOBK.mjs} +1 -1
  150. package/dist/preview-engine/renderers-WZ75MLP3.mjs +1 -0
  151. package/dist/preview-engine/renderers-XB5R4UQA.mjs +1 -0
  152. package/dist/preview-engine/{renderers-YIVPMPQS.mjs → renderers-Y22VSOXF.mjs} +1 -1
  153. package/dist/preview-engine/{renderers-Y53D5CQ7.mjs → renderers-YBIUZDGQ.mjs} +1 -1
  154. package/dist/preview-engine/renderers-YESJR4O7.mjs +1 -0
  155. package/dist/preview-engine/renderers-YKSRZRRT.mjs +1 -0
  156. package/dist/preview-engine/{renderers-V4VML5IG.mjs → renderers-ZACSHGNZ.mjs} +1 -1
  157. package/dist/preview-engine/signals.mjs +1 -1
  158. package/dist/preview-engine/src-NGVAJYHC.mjs +8 -0
  159. package/dist/{program-Cq4gP9Dd.mjs → program-CKpKkllV.mjs} +2 -2
  160. package/dist/{program-Cq4gP9Dd.mjs.map → program-CKpKkllV.mjs.map} +1 -1
  161. package/dist/renderer/index.mjs +2 -2
  162. package/dist/renderer--Ac-dg4A.mjs +5 -0
  163. package/dist/renderer--N7TMqzU.mjs +5 -0
  164. package/dist/{renderer-CXWAdRqn.mjs → renderer--fkmiVjl.mjs} +2 -2
  165. package/dist/{renderer-CXWAdRqn.mjs.map → renderer--fkmiVjl.mjs.map} +1 -1
  166. package/dist/{renderer-CZyJ72JZ.mjs → renderer-1r-Uq-Ae.mjs} +2 -2
  167. package/dist/{renderer-CZyJ72JZ.mjs.map → renderer-1r-Uq-Ae.mjs.map} +1 -1
  168. package/dist/renderer-2ecmdOae.mjs +5 -0
  169. package/dist/{renderer-D8CMakyz.mjs → renderer-8QIwXh7O.mjs} +3 -3
  170. package/dist/{renderer-D8CMakyz.mjs.map → renderer-8QIwXh7O.mjs.map} +1 -1
  171. package/dist/{renderer-B4iCFvJh.mjs → renderer-B-ur0Ej8.mjs} +3 -3
  172. package/dist/{renderer-B4iCFvJh.mjs.map → renderer-B-ur0Ej8.mjs.map} +1 -1
  173. package/dist/{renderer-BD25uND8.mjs → renderer-B0piZg9r.mjs} +383 -171
  174. package/dist/renderer-B0piZg9r.mjs.map +1 -0
  175. package/dist/{renderer-BZKkT-6Q.mjs → renderer-B2jjxsjO.mjs} +2 -2
  176. package/dist/{renderer-BZKkT-6Q.mjs.map → renderer-B2jjxsjO.mjs.map} +1 -1
  177. package/dist/{renderer-DEcbSNQd.mjs → renderer-B39I6CQw.mjs} +3 -3
  178. package/dist/{renderer-DEcbSNQd.mjs.map → renderer-B39I6CQw.mjs.map} +1 -1
  179. package/dist/{renderer-DIPyUVX2.mjs → renderer-B522Dkdk.mjs} +3 -3
  180. package/dist/{renderer-DIPyUVX2.mjs.map → renderer-B522Dkdk.mjs.map} +1 -1
  181. package/dist/renderer-B5RJp5g-.mjs +5 -0
  182. package/dist/renderer-B7xyT1Vb.mjs +5 -0
  183. package/dist/{renderer-CeX7uUXB.mjs → renderer-BAYTI6jj.mjs} +2 -2
  184. package/dist/{renderer-CeX7uUXB.mjs.map → renderer-BAYTI6jj.mjs.map} +1 -1
  185. package/dist/{renderer-DoRazdp_.mjs → renderer-BAusZ6Vu.mjs} +2 -2
  186. package/dist/{renderer-DoRazdp_.mjs.map → renderer-BAusZ6Vu.mjs.map} +1 -1
  187. package/dist/renderer-BBeArN_x.mjs +5 -0
  188. package/dist/renderer-BCAZDu-r.mjs +5 -0
  189. package/dist/{renderer-D41gHat4.mjs → renderer-BF0hx_iJ.mjs} +3 -3
  190. package/dist/{renderer-D41gHat4.mjs.map → renderer-BF0hx_iJ.mjs.map} +1 -1
  191. package/dist/renderer-BJnhik7Y.mjs +5 -0
  192. package/dist/{renderer-BeQrWrOa.mjs → renderer-BPWDsufX.mjs} +2 -2
  193. package/dist/{renderer-BeQrWrOa.mjs.map → renderer-BPWDsufX.mjs.map} +1 -1
  194. package/dist/{renderer-CxEBV-w0.mjs → renderer-BXJXziIt.mjs} +2 -2
  195. package/dist/{renderer-CxEBV-w0.mjs.map → renderer-BXJXziIt.mjs.map} +1 -1
  196. package/dist/{renderer-Ce8VPaog.mjs → renderer-BdyopiLC.mjs} +2 -2
  197. package/dist/{renderer-Ce8VPaog.mjs.map → renderer-BdyopiLC.mjs.map} +1 -1
  198. package/dist/{renderer-Bkqg-U2F.mjs → renderer-Bfk6A7UO.mjs} +3 -3
  199. package/dist/{renderer-Bkqg-U2F.mjs.map → renderer-Bfk6A7UO.mjs.map} +1 -1
  200. package/dist/{renderer-CAagaRag.mjs → renderer-BgO6BA_z.mjs} +2 -2
  201. package/dist/{renderer-CAagaRag.mjs.map → renderer-BgO6BA_z.mjs.map} +1 -1
  202. package/dist/{renderer-DlZwbO-A.mjs → renderer-BlPqTEii.mjs} +2 -2
  203. package/dist/{renderer-DlZwbO-A.mjs.map → renderer-BlPqTEii.mjs.map} +1 -1
  204. package/dist/{renderer-BEuU7qlG.mjs → renderer-BlvGcyAN.mjs} +2 -2
  205. package/dist/{renderer-BEuU7qlG.mjs.map → renderer-BlvGcyAN.mjs.map} +1 -1
  206. package/dist/{renderer-BrWOcJ9Q.mjs → renderer-BpIF1QIE.mjs} +3 -3
  207. package/dist/{renderer-BrWOcJ9Q.mjs.map → renderer-BpIF1QIE.mjs.map} +1 -1
  208. package/dist/renderer-BxRW8MZO.mjs +5 -0
  209. package/dist/renderer-C-lfsEAN.mjs +5 -0
  210. package/dist/{renderer-eAVNsuX8.mjs → renderer-C41U1tK6.mjs} +5 -5
  211. package/dist/{renderer-eAVNsuX8.mjs.map → renderer-C41U1tK6.mjs.map} +1 -1
  212. package/dist/renderer-C6nOFN4-.mjs +5 -0
  213. package/dist/{renderer-CjklM-KD.mjs → renderer-C7L8Ceqr.mjs} +2 -2
  214. package/dist/{renderer-CjklM-KD.mjs.map → renderer-C7L8Ceqr.mjs.map} +1 -1
  215. package/dist/{renderer-xLQ_nkmy.mjs → renderer-C7eFJf0_.mjs} +3 -3
  216. package/dist/{renderer-xLQ_nkmy.mjs.map → renderer-C7eFJf0_.mjs.map} +1 -1
  217. package/dist/renderer-C84TSQmS.mjs +5 -0
  218. package/dist/renderer-C8_6YofT.mjs +5 -0
  219. package/dist/{renderer-DsAoxQ8O.mjs → renderer-CCycwCEB.mjs} +2 -2
  220. package/dist/{renderer-DsAoxQ8O.mjs.map → renderer-CCycwCEB.mjs.map} +1 -1
  221. package/dist/{renderer-Cjx3x7xM.mjs → renderer-CHr7MiYW.mjs} +3 -3
  222. package/dist/{renderer-Cjx3x7xM.mjs.map → renderer-CHr7MiYW.mjs.map} +1 -1
  223. package/dist/renderer-COR66Sby.mjs +3 -0
  224. package/dist/renderer-COb3tOPG.mjs +5 -0
  225. package/dist/{renderer-DSpTGqUU.mjs → renderer-CQvmbRQ5.mjs} +3 -3
  226. package/dist/{renderer-DSpTGqUU.mjs.map → renderer-CQvmbRQ5.mjs.map} +1 -1
  227. package/dist/renderer-CSCIzaLy.mjs +5 -0
  228. package/dist/{renderer-D7Kk7VxM.mjs → renderer-CYC32bDW.mjs} +3 -3
  229. package/dist/{renderer-D7Kk7VxM.mjs.map → renderer-CYC32bDW.mjs.map} +1 -1
  230. package/dist/{renderer-Ci9x2WUd.mjs → renderer-CcvvoKiZ.mjs} +3 -3
  231. package/dist/{renderer-Ci9x2WUd.mjs.map → renderer-CcvvoKiZ.mjs.map} +1 -1
  232. package/dist/{renderer-DTgO5LPf.mjs → renderer-CiQhD8Gg.mjs} +3 -3
  233. package/dist/{renderer-DTgO5LPf.mjs.map → renderer-CiQhD8Gg.mjs.map} +1 -1
  234. package/dist/renderer-CmI4c8MS.mjs +5 -0
  235. package/dist/{renderer-BlVmbzPs.mjs → renderer-CpUJBOfb.mjs} +2 -2
  236. package/dist/renderer-CqVltdX9.mjs +5 -0
  237. package/dist/{renderer-LY2MiIj0.mjs → renderer-CwFqqpWY.mjs} +3 -3
  238. package/dist/{renderer-LY2MiIj0.mjs.map → renderer-CwFqqpWY.mjs.map} +1 -1
  239. package/dist/renderer-D-FpMzLY.mjs +5 -0
  240. package/dist/renderer-D-Oyn9mG.mjs +5 -0
  241. package/dist/renderer-D2QrkA8_.mjs +5 -0
  242. package/dist/{renderer-D7Cu9OZx.mjs → renderer-D47AEJE_.mjs} +2 -2
  243. package/dist/{renderer-D7Cu9OZx.mjs.map → renderer-D47AEJE_.mjs.map} +1 -1
  244. package/dist/{renderer-DPn2DhMU.mjs → renderer-D61B9bXF.mjs} +2 -2
  245. package/dist/{renderer-DPn2DhMU.mjs.map → renderer-D61B9bXF.mjs.map} +1 -1
  246. package/dist/renderer-D64r4iN-.mjs +5 -0
  247. package/dist/{renderer-CUq2qgyc.mjs → renderer-D7Al3_-5.mjs} +3 -3
  248. package/dist/{renderer-CUq2qgyc.mjs.map → renderer-D7Al3_-5.mjs.map} +1 -1
  249. package/dist/{renderer-CyWRvKUI.mjs → renderer-D7r6onRT.mjs} +2 -2
  250. package/dist/{renderer-CyWRvKUI.mjs.map → renderer-D7r6onRT.mjs.map} +1 -1
  251. package/dist/{renderer-DxHICEk3.mjs → renderer-D8bBHrWC.mjs} +3 -3
  252. package/dist/{renderer-DxHICEk3.mjs.map → renderer-D8bBHrWC.mjs.map} +1 -1
  253. package/dist/renderer-DCq6YkgP.mjs +5 -0
  254. package/dist/{renderer-Dk45W8Zd.mjs → renderer-DDEkFbVI.mjs} +3 -3
  255. package/dist/{renderer-Dk45W8Zd.mjs.map → renderer-DDEkFbVI.mjs.map} +1 -1
  256. package/dist/renderer-DDHG3GdR.mjs +5 -0
  257. package/dist/{renderer-BWlMAacF.mjs → renderer-DEmYyaqj.mjs} +2 -2
  258. package/dist/{renderer-BWlMAacF.mjs.map → renderer-DEmYyaqj.mjs.map} +1 -1
  259. package/dist/{renderer-DRGa6tlX.mjs → renderer-DF-yvIrV.mjs} +2 -2
  260. package/dist/{renderer-DRGa6tlX.mjs.map → renderer-DF-yvIrV.mjs.map} +1 -1
  261. package/dist/{renderer-C-5RNIeX.mjs → renderer-DFzI3yI_.mjs} +2 -2
  262. package/dist/{renderer-C-5RNIeX.mjs.map → renderer-DFzI3yI_.mjs.map} +1 -1
  263. package/dist/{renderer-AMBVtZ_G.mjs → renderer-DIw3UtEU.mjs} +3 -3
  264. package/dist/{renderer-AMBVtZ_G.mjs.map → renderer-DIw3UtEU.mjs.map} +1 -1
  265. package/dist/renderer-DMdNfcud.mjs +6 -0
  266. package/dist/{renderer-DnPzvIHK.mjs → renderer-DMvmf3T2.mjs} +2 -2
  267. package/dist/{renderer-Gw1ICOJ3.mjs → renderer-DNQvOrkY.mjs} +3 -3
  268. package/dist/{renderer-Gw1ICOJ3.mjs.map → renderer-DNQvOrkY.mjs.map} +1 -1
  269. package/dist/{renderer-CP2FOWyJ.mjs → renderer-DO-KbpYZ.mjs} +3 -3
  270. package/dist/{renderer-CP2FOWyJ.mjs.map → renderer-DO-KbpYZ.mjs.map} +1 -1
  271. package/dist/{renderer-cg06hb82.mjs → renderer-DTqDy2m9.mjs} +3 -3
  272. package/dist/{renderer-cg06hb82.mjs.map → renderer-DTqDy2m9.mjs.map} +1 -1
  273. package/dist/{renderer-BXAgUuAq.mjs → renderer-DVCJjVn7.mjs} +2 -2
  274. package/dist/{renderer-BXAgUuAq.mjs.map → renderer-DVCJjVn7.mjs.map} +1 -1
  275. package/dist/{renderer-D6X9vWkN.mjs → renderer-DX41niRU.mjs} +2 -2
  276. package/dist/{renderer-D6X9vWkN.mjs.map → renderer-DX41niRU.mjs.map} +1 -1
  277. package/dist/{renderer-D3K9FEQk.mjs → renderer-DXEWbnRF.mjs} +3 -3
  278. package/dist/{renderer-D3K9FEQk.mjs.map → renderer-DXEWbnRF.mjs.map} +1 -1
  279. package/dist/renderer-DZQXZ4lK.mjs +5 -0
  280. package/dist/{renderer-CiMIftlS.mjs → renderer-DbRZe0Re.mjs} +3 -3
  281. package/dist/{renderer-CiMIftlS.mjs.map → renderer-DbRZe0Re.mjs.map} +1 -1
  282. package/dist/renderer-DczJJLA1.mjs +5 -0
  283. package/dist/renderer-DfqJj9oe.mjs +5 -0
  284. package/dist/renderer-DgO9ihVJ.mjs +5 -0
  285. package/dist/renderer-DhgnQZYb.mjs +5 -0
  286. package/dist/{renderer-CrgfMDbh.mjs → renderer-DiY70S8S.mjs} +3 -3
  287. package/dist/{renderer-CrgfMDbh.mjs.map → renderer-DiY70S8S.mjs.map} +1 -1
  288. package/dist/renderer-DjxKjHMf.mjs +5 -0
  289. package/dist/{renderer-Br4UZvfL.mjs → renderer-DkRSZg5g.mjs} +3 -3
  290. package/dist/{renderer-Br4UZvfL.mjs.map → renderer-DkRSZg5g.mjs.map} +1 -1
  291. package/dist/{renderer-CCSzKnvs.mjs → renderer-DmkWrWAk.mjs} +2 -2
  292. package/dist/{renderer-CCSzKnvs.mjs.map → renderer-DmkWrWAk.mjs.map} +1 -1
  293. package/dist/{renderer-D2JOseb1.mjs → renderer-DpruWmZU.mjs} +2 -2
  294. package/dist/{renderer-D2JOseb1.mjs.map → renderer-DpruWmZU.mjs.map} +1 -1
  295. package/dist/renderer-DqLA5cdR.mjs +5 -0
  296. package/dist/{renderer-DxbFjINv.mjs → renderer-DqvoMLca.mjs} +3 -3
  297. package/dist/{renderer-DxbFjINv.mjs.map → renderer-DqvoMLca.mjs.map} +1 -1
  298. package/dist/{renderer-BeFiQfzV.mjs → renderer-DsEyjwfT.mjs} +70 -70
  299. package/dist/{renderer-BeFiQfzV.mjs.map → renderer-DsEyjwfT.mjs.map} +1 -1
  300. package/dist/renderer-Dudp6ZlH.mjs +5 -0
  301. package/dist/{renderer-COQc1jn6.mjs → renderer-EaLUCobW.mjs} +2 -2
  302. package/dist/{renderer-COQc1jn6.mjs.map → renderer-EaLUCobW.mjs.map} +1 -1
  303. package/dist/{renderer-BioUC9zE.mjs → renderer-GBmWjBvy.mjs} +2 -2
  304. package/dist/{renderer-BioUC9zE.mjs.map → renderer-GBmWjBvy.mjs.map} +1 -1
  305. package/dist/{renderer-BNzT34UV.mjs → renderer-Lth37j17.mjs} +2 -2
  306. package/dist/{renderer-D-17HVPb.mjs → renderer-SSBL4M1o.mjs} +3 -3
  307. package/dist/{renderer-D-17HVPb.mjs.map → renderer-SSBL4M1o.mjs.map} +1 -1
  308. package/dist/{renderer-C8rxyjaE.mjs → renderer-SWr3vbrV.mjs} +2 -2
  309. package/dist/{renderer-C8rxyjaE.mjs.map → renderer-SWr3vbrV.mjs.map} +1 -1
  310. package/dist/{renderer-LwrcnEtI.mjs → renderer-WCZu2Rf5.mjs} +3 -3
  311. package/dist/{renderer-LwrcnEtI.mjs.map → renderer-WCZu2Rf5.mjs.map} +1 -1
  312. package/dist/{renderer-BIGILDEA.mjs → renderer-Xv6GfNUI.mjs} +2 -2
  313. package/dist/{renderer-BIGILDEA.mjs.map → renderer-Xv6GfNUI.mjs.map} +1 -1
  314. package/dist/renderer-_jC5KIT1.mjs +5 -0
  315. package/dist/{renderer-DveQQCi8.mjs → renderer-bAKUeHF3.mjs} +3 -3
  316. package/dist/{renderer-DveQQCi8.mjs.map → renderer-bAKUeHF3.mjs.map} +1 -1
  317. package/dist/renderer-cTgAuVmJ.mjs +5 -0
  318. package/dist/{renderer-DGPaKIFf.mjs → renderer-cod5Ona9.mjs} +2 -2
  319. package/dist/{renderer-DgLt0TPo.mjs → renderer-g_vrrAQU.mjs} +2 -2
  320. package/dist/{renderer-DgLt0TPo.mjs.map → renderer-g_vrrAQU.mjs.map} +1 -1
  321. package/dist/{renderer-uorPCWdC.mjs → renderer-hSCfnvaK.mjs} +3 -3
  322. package/dist/{renderer-uorPCWdC.mjs.map → renderer-hSCfnvaK.mjs.map} +1 -1
  323. package/dist/{renderer-BGPnCRFI.mjs → renderer-ktWXVYka.mjs} +3 -3
  324. package/dist/{renderer-BGPnCRFI.mjs.map → renderer-ktWXVYka.mjs.map} +1 -1
  325. package/dist/renderer-nVKDvDLO.mjs +5 -0
  326. package/dist/{renderer-U-12BOhe.mjs → renderer-oKRF4A0M.mjs} +2 -2
  327. package/dist/{renderer-U-12BOhe.mjs.map → renderer-oKRF4A0M.mjs.map} +1 -1
  328. package/dist/{renderer-CsilJwL-.mjs → renderer-pHWEHDnM.mjs} +3 -3
  329. package/dist/{renderer-CsilJwL-.mjs.map → renderer-pHWEHDnM.mjs.map} +1 -1
  330. package/dist/renderer-pZ6_pUo1.mjs +5 -0
  331. package/dist/{renderer-BD00i68i.mjs → renderer-sCovEubT.mjs} +3 -3
  332. package/dist/{renderer-BD00i68i.mjs.map → renderer-sCovEubT.mjs.map} +1 -1
  333. package/dist/{renderer-BdbGTz7z.mjs → renderer-sYSkIUfo.mjs} +3 -3
  334. package/dist/{renderer-BdbGTz7z.mjs.map → renderer-sYSkIUfo.mjs.map} +1 -1
  335. package/dist/{renderer-BLU0PQTB.mjs → renderer-zXPVLRlD.mjs} +3 -3
  336. package/dist/{renderer-BLU0PQTB.mjs.map → renderer-zXPVLRlD.mjs.map} +1 -1
  337. package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs → renderers-CP8CFWDs-DH2oktaC.mjs} +2 -2
  338. package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs.map → renderers-CP8CFWDs-DH2oktaC.mjs.map} +1 -1
  339. package/dist/signals/index.mjs +4 -4
  340. package/dist/{src-B0KFNjj4.mjs → src-CK5rGVbh.mjs} +382 -20
  341. package/dist/src-CK5rGVbh.mjs.map +1 -0
  342. package/package.json +67 -58
  343. package/dist/index-BwRrsP_V.d.mts.map +0 -1
  344. package/dist/index-UDDAfHAF.d.mts.map +0 -1
  345. package/dist/preview-engine/chunk-3U2A3RW4.mjs +0 -5
  346. package/dist/preview-engine/chunk-6E3JSPJN.mjs +0 -1
  347. package/dist/preview-engine/chunk-F4F2UDRX.mjs +0 -1
  348. package/dist/preview-engine/chunk-KFNVUGNN.mjs +0 -1974
  349. package/dist/preview-engine/chunk-PYSBWKIJ.mjs +0 -1
  350. package/dist/preview-engine/chunk-U2IFQMS3.mjs +0 -174
  351. package/dist/preview-engine/renderers-2GMY2ZNK.mjs +0 -1
  352. package/dist/preview-engine/renderers-2QJNKL7Q.mjs +0 -1
  353. package/dist/preview-engine/renderers-3OYU6O6F.mjs +0 -1
  354. package/dist/preview-engine/renderers-433Y2PCK.mjs +0 -1
  355. package/dist/preview-engine/renderers-4AGPGEL4.mjs +0 -1
  356. package/dist/preview-engine/renderers-54DBHGUW.mjs +0 -1
  357. package/dist/preview-engine/renderers-5M2O55U3.mjs +0 -1
  358. package/dist/preview-engine/renderers-6FVMDEAY.mjs +0 -1
  359. package/dist/preview-engine/renderers-6R7ZJ7DU.mjs +0 -1
  360. package/dist/preview-engine/renderers-75GCMFOD.mjs +0 -1
  361. package/dist/preview-engine/renderers-7LWLUCVQ.mjs +0 -1
  362. package/dist/preview-engine/renderers-BLDENIEV.mjs +0 -1
  363. package/dist/preview-engine/renderers-CDB3YK3R.mjs +0 -1
  364. package/dist/preview-engine/renderers-D6D4XDFY.mjs +0 -1
  365. package/dist/preview-engine/renderers-DJVFQZYU.mjs +0 -1
  366. package/dist/preview-engine/renderers-DMXSV7VO.mjs +0 -1
  367. package/dist/preview-engine/renderers-EBMASIOE.mjs +0 -1
  368. package/dist/preview-engine/renderers-F262HDFS.mjs +0 -1
  369. package/dist/preview-engine/renderers-FMXKIF22.mjs +0 -1
  370. package/dist/preview-engine/renderers-GJKSZ6DR.mjs +0 -1
  371. package/dist/preview-engine/renderers-GR3RLYDZ.mjs +0 -1
  372. package/dist/preview-engine/renderers-GT3W2QIA.mjs +0 -1
  373. package/dist/preview-engine/renderers-IHC7HUK3.mjs +0 -1
  374. package/dist/preview-engine/renderers-J56ZGEVM.mjs +0 -1
  375. package/dist/preview-engine/renderers-KYM6352U.mjs +0 -1
  376. package/dist/preview-engine/renderers-LFXX6TWI.mjs +0 -1
  377. package/dist/preview-engine/renderers-NAHUPFPU.mjs +0 -1
  378. package/dist/preview-engine/renderers-NM3FZLHH.mjs +0 -1
  379. package/dist/preview-engine/renderers-NNB4BTJA.mjs +0 -1
  380. package/dist/preview-engine/renderers-OYVQW6QI.mjs +0 -1
  381. package/dist/preview-engine/renderers-P5RIFU3C.mjs +0 -1
  382. package/dist/preview-engine/renderers-QB7HJUTS.mjs +0 -1
  383. package/dist/preview-engine/renderers-QRQVOCDC.mjs +0 -1
  384. package/dist/preview-engine/renderers-QVFHJTZA.mjs +0 -1
  385. package/dist/preview-engine/renderers-R3WQIE4L.mjs +0 -1
  386. package/dist/preview-engine/renderers-SQBVOLG7.mjs +0 -1
  387. package/dist/preview-engine/renderers-TLXMYEDI.mjs +0 -1
  388. package/dist/preview-engine/renderers-X4S3WELJ.mjs +0 -1
  389. package/dist/preview-engine/renderers-XT7U25I7.mjs +0 -1
  390. package/dist/preview-engine/renderers-XVGLMBB3.mjs +0 -1
  391. package/dist/preview-engine/renderers-YUWU3TQZ.mjs +0 -1
  392. package/dist/preview-engine/renderers-ZNUD5OVO.mjs +0 -1
  393. package/dist/renderer-01zxT4CK.mjs +0 -5
  394. package/dist/renderer-35LHkj36.mjs +0 -5
  395. package/dist/renderer-B0OIdCGj.mjs +0 -5
  396. package/dist/renderer-B3IPtkK9.mjs +0 -5
  397. package/dist/renderer-BD25uND8.mjs.map +0 -1
  398. package/dist/renderer-BMC39abo.mjs +0 -5
  399. package/dist/renderer-BQj3nlAI.mjs +0 -5
  400. package/dist/renderer-BnBvSmp_.mjs +0 -5
  401. package/dist/renderer-BsDSpTpL.mjs +0 -5
  402. package/dist/renderer-BtW6_gvE.mjs +0 -5
  403. package/dist/renderer-By8U44Rt.mjs +0 -5
  404. package/dist/renderer-C3lDmxuX.mjs +0 -5
  405. package/dist/renderer-C6SZAE_x.mjs +0 -5
  406. package/dist/renderer-CA3IVeZj.mjs +0 -5
  407. package/dist/renderer-CFoCH_mO.mjs +0 -5
  408. package/dist/renderer-CLhZqJF8.mjs +0 -6
  409. package/dist/renderer-CYJXQS8E.mjs +0 -5
  410. package/dist/renderer-C_vj6_WJ.mjs +0 -5
  411. package/dist/renderer-CeqfC6OR.mjs +0 -5
  412. package/dist/renderer-CkZCGMAc.mjs +0 -5
  413. package/dist/renderer-Clxju1r9.mjs +0 -5
  414. package/dist/renderer-Cvz22ZSh.mjs +0 -3
  415. package/dist/renderer-CyWtKBF7.mjs +0 -5
  416. package/dist/renderer-D27STGoB.mjs +0 -5
  417. package/dist/renderer-D78Aq9YK.mjs +0 -5
  418. package/dist/renderer-DHEffABL.mjs +0 -5
  419. package/dist/renderer-DUuNCgzW.mjs +0 -5
  420. package/dist/renderer-DVD5pzRq.mjs +0 -5
  421. package/dist/renderer-Dsp6xDw5.mjs +0 -5
  422. package/dist/renderer-DuC-BFXR.mjs +0 -5
  423. package/dist/renderer-DuWs_Wsv.mjs +0 -5
  424. package/dist/renderer-OSgsiIrW.mjs +0 -5
  425. package/dist/renderer-OZaMFYtZ.mjs +0 -5
  426. package/dist/renderer-T79TmHET.mjs +0 -5
  427. package/dist/renderer-UhsC9oTU.mjs +0 -5
  428. package/dist/renderer-WYZV1jWf.mjs +0 -5
  429. package/dist/renderer-Y7evDjHH.mjs +0 -5
  430. package/dist/renderer-mcePkmUe.mjs +0 -5
  431. package/dist/src-B0KFNjj4.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-D6X9vWkN.mjs","names":[],"sources":["../../../nodes/node-mask-math/dist/renderers-YQJYtdXA.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 200;\nconst MaskOperationEnum = z.enum([\n\t\"Union\",\n\t\"Intersect\",\n\t\"Subtract\",\n\t\"Difference\",\n\t\"Invert\",\n\t\"Dilate\",\n\t\"Erode\",\n\t\"Choke\",\n\t\"Feather\"\n]);\nconst MaskChannelEnum = z.enum([\n\t\"Alpha\",\n\t\"Luminance\",\n\t\"Red\",\n\t\"Green\",\n\t\"Blue\"\n]);\nconst MaskOutputFormatEnum = z.enum([\n\t\"WhiteWithAlpha\",\n\t\"GrayscaleRGB\",\n\t\"AlphaOnly\",\n\t\"PassthroughRGB\"\n]);\nconst maskMathConfig = configBuilder().field(\"operation\", MaskOperationEnum.default(\"Union\"), {\n\tlabel: \"Operation\",\n\tdescription: \"Morphological or Boolean set operation applied to input alpha masks.\"\n}).field(\"radius\", z.number().min(0).max(MAX_RADIUS).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Radius / Width (px)\",\n\tdescription: \"Kernel radius in pixels for Dilate, Erode, Choke, or Feather operations.\"\n}).field(\"threshold\", z.number().multipleOf(.01).min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Threshold\",\n\tdescription: \"Cutoff threshold level (0.0–1.0) for binarization step or non-linear choke.\"\n}).field(\"clampMin\", z.number().multipleOf(.01).min(0).max(1).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Clamp Min\",\n\tdescription: \"Minimum alpha matte cutoff limit (0.0–1.0).\"\n}).field(\"clampMax\", z.number().multipleOf(.01).min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Clamp Max\",\n\tdescription: \"Maximum alpha matte cutoff limit (0.0–1.0).\"\n}).field(\"channelA\", MaskChannelEnum.default(\"Alpha\"), {\n\tlabel: \"Mask A Channel\",\n\tdescription: \"Source channel to extract mask from Mask A (Alpha, Luminance, Red, Green, Blue).\"\n}).field(\"channelB\", MaskChannelEnum.default(\"Alpha\"), {\n\tlabel: \"Mask B Channel\",\n\tdescription: \"Source channel to extract mask from Mask B (Alpha, Luminance, Red, Green, Blue).\"\n}).field(\"binarize\", z.boolean().default(false), {\n\tlabel: \"Binarize\",\n\tdescription: \"When enabled, outputs crisp 1-bit binary matte based on threshold.\"\n}).field(\"invertResult\", z.boolean().default(false), {\n\tlabel: \"Invert Result\",\n\tdescription: \"Inverts final matte output.\"\n}).field(\"outputFormat\", MaskOutputFormatEnum.default(\"WhiteWithAlpha\"), {\n\tlabel: \"Output Format\",\n\tdescription: \"WhiteWithAlpha (rgba(1,1,1,a)), GrayscaleRGB (rgba(a,a,a,1)), AlphaOnly (rgba(0,0,0,a)), PassthroughRGB (Mask A RGB with new alpha).\"\n}).build();\nconst MaskMathNodeConfigSchema = maskMathConfig.schema;\nconst MaskMathResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst MASK_MATH_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 OPERATION_MAP = {\n\tUnion: 0,\n\tIntersect: 1,\n\tSubtract: 2,\n\tDifference: 3,\n\tInvert: 4,\n\tDilate: 5,\n\tErode: 6,\n\tChoke: 7,\n\tFeather: 8\n};\nconst CHANNEL_MAP = {\n\tAlpha: 0,\n\tLuminance: 1,\n\tRed: 2,\n\tGreen: 3,\n\tBlue: 4\n};\nconst OUTPUT_FORMAT_MAP = {\n\tWhiteWithAlpha: 0,\n\tGrayscaleRGB: 1,\n\tAlphaOnly: 2,\n\tPassthroughRGB: 3\n};\nconst WGSL_MASKMATH = `\nstruct MaskMathUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tradius : f32,\n\tthreshold : f32,\n\n\tclampMin : f32,\n\tclampMax : f32,\n\toperation : f32,\n\tchannelA : f32,\n\n\tchannelB : f32,\n\tbinarize : f32,\n\tinvertResult : f32,\n\toutputFormat : f32,\n\n\thasMaskB : f32,\n\thasRadiusSig : f32,\n\thasThreshSig : f32,\n\thasClampMinSig : f32,\n\n\thasClampMaxSig : f32,\n\tisSecondPass : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : MaskMathUniforms;\n\n@group(1) @binding(0) var texA : texture_2d<f32>;\n@group(1) @binding(1) var texB : texture_2d<f32>;\n@group(1) @binding(2) var origTexA : texture_2d<f32>;\n@group(1) @binding(3) var samp : sampler;\n\n@group(2) @binding(0) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(1) var threshSigTex : texture_2d<f32>;\n@group(2) @binding(2) var clampMinSigTex : texture_2d<f32>;\n@group(2) @binding(3) var clampMaxSigTex : texture_2d<f32>;\n@group(2) @binding(4) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn extractChannel(color : vec4<f32>, chCode : f32) -> f32 {\n\tif (chCode < 0.5) {\n\t\t// Alpha\n\t\treturn color.a;\n\t} else if (chCode < 1.5) {\n\t\t// Luminance\n\t\tlet luma = dot(color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, luma / color.a);\n\t\t}\n\t\treturn luma;\n\t} else if (chCode < 2.5) {\n\t\t// Red\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, color.r / color.a);\n\t\t}\n\t\treturn color.r;\n\t} else if (chCode < 3.5) {\n\t\t// Green\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, color.g / color.a);\n\t\t}\n\t\treturn color.g;\n\t} else {\n\t\t// Blue\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, color.b / color.a);\n\t\t}\n\t\treturn color.b;\n\t}\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(texA));\n\tlet texelSize = 1.0 / max(dimensions, vec2<f32>(1.0, 1.0));\n\n\tvar radius = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradius = clamp(textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 200.0);\n\t}\n\tvar threshold = u.threshold;\n\tif (u.hasThreshSig > 0.5) {\n\t\tthreshold = clamp(textureSampleLevel(threshSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 1.0);\n\t}\n\tvar clampMin = u.clampMin;\n\tif (u.hasClampMinSig > 0.5) {\n\t\tclampMin = clamp(textureSampleLevel(clampMinSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 1.0);\n\t}\n\tvar clampMax = u.clampMax;\n\tif (u.hasClampMaxSig > 0.5) {\n\t\tclampMax = clamp(textureSampleLevel(clampMaxSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 1.0);\n\t}\n\n\tlet op = u.operation;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar val = 0.0;\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// -------------------------------------------------------------\n\t\t// PASS 1: Horizontal pass / Boolean operation\n\t\t// -------------------------------------------------------------\n\t\tlet sampleA = textureSampleLevel(texA, samp, in.uv, 0.0);\n\t\tlet sampleB = textureSampleLevel(texB, samp, in.uv, 0.0);\n\n\t\tlet a = extractChannel(sampleA, u.channelA);\n\t\tlet b = select(0.0, extractChannel(sampleB, u.channelB), u.hasMaskB > 0.5);\n\n\t\tif (op < 0.5) {\n\t\t\t// Union (A + B)\n\t\t\tval = select(a, clamp(a + b, 0.0, 1.0), u.hasMaskB > 0.5);\n\t\t} else if (op < 1.5) {\n\t\t\t// Intersect (min(A, B))\n\t\t\tval = select(a, min(a, b), u.hasMaskB > 0.5);\n\t\t} else if (op < 2.5) {\n\t\t\t// Subtract (clamp(A - B, 0, 1))\n\t\t\tval = select(a, clamp(a - b, 0.0, 1.0), u.hasMaskB > 0.5);\n\t\t} else if (op < 3.5) {\n\t\t\t// Difference (|A - B|)\n\t\t\tval = select(a, abs(a - b), u.hasMaskB > 0.5);\n\t\t} else if (op < 4.5) {\n\t\t\t// Invert (1 - A)\n\t\t\tval = 1.0 - a;\n\t\t} else if (op < 5.5) {\n\t\t\t// Dilate (Horizontal Max)\n\t\t\tif (radius <= 0.0) {\n\t\t\t\tval = a;\n\t\t\t} else {\n\t\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\t\tvar maxVal = a;\n\t\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\t\tmaxVal = max(maxVal, extractChannel(s, u.channelA));\n\t\t\t\t}\n\t\t\t\tval = maxVal;\n\t\t\t}\n\t\t} else if (op < 7.5) {\n\t\t\t// Erode & Choke (Horizontal Min)\n\t\t\tif (radius <= 0.0) {\n\t\t\t\tval = a;\n\t\t\t} else {\n\t\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\t\tvar minVal = a;\n\t\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\t\tminVal = min(minVal, extractChannel(s, u.channelA));\n\t\t\t\t}\n\t\t\t\tval = minVal;\n\t\t\t}\n\t\t} else {\n\t\t\t// Feather (Horizontal Gaussian Blur)\n\t\t\tif (radius <= 0.0) {\n\t\t\t\tval = a;\n\t\t\t} else {\n\t\t\t\tlet spatial_sigma = max(0.1, radius / 2.0);\n\t\t\t\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\t\t\t\tlet effectiveSigma = spatial_sigma / stepScale;\n\t\t\t\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 48);\n\t\t\t\tvar accum = 0.0;\n\t\t\t\tvar totalWeight = 0.0;\n\t\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\t\tlet x = f32(i) * stepScale;\n\t\t\t\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\t\taccum += extractChannel(s, u.channelA) * weight;\n\t\t\t\t\ttotalWeight += weight;\n\t\t\t\t}\n\t\t\t\tval = accum / max(totalWeight, 1e-5);\n\t\t\t}\n\t\t}\n\n\t\treturn vec4<f32>(val, val, val, val);\n\t}\n\n\t// -------------------------------------------------------------\n\t// PASS 2: Vertical pass & Post-processing (clamp, binarize, format)\n\t// -------------------------------------------------------------\n\tlet samplePass1 = textureSampleLevel(texA, samp, in.uv, 0.0);\n\tvar matte = samplePass1.r;\n\n\t// 1. Spatial kernel processing (Dilate, Erode, Choke, Feather) when radius > 0\n\tif (radius > 0.0) {\n\t\tif (op >= 4.5 && op < 5.5) {\n\t\t\t// Dilate (Vertical Max)\n\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\tvar maxVal = matte;\n\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\tmaxVal = max(maxVal, s.r);\n\t\t\t}\n\t\t\tmatte = maxVal;\n\t\t} else if (op >= 5.5 && op < 7.5) {\n\t\t\t// Erode & Choke (Vertical Min)\n\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\tvar minVal = matte;\n\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\tminVal = min(minVal, s.r);\n\t\t\t}\n\t\t\tmatte = minVal;\n\t\t} else if (op >= 7.5) {\n\t\t\t// Feather (Vertical Gaussian Blur)\n\t\t\tlet spatial_sigma = max(0.1, radius / 2.0);\n\t\t\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\t\t\tlet effectiveSigma = spatial_sigma / stepScale;\n\t\t\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 48);\n\t\t\tvar accum = 0.0;\n\t\t\tvar totalWeight = 0.0;\n\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\tlet x = f32(i) * stepScale;\n\t\t\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\taccum += s.r * weight;\n\t\t\t\ttotalWeight += weight;\n\t\t\t}\n\t\t\tmatte = accum / max(totalWeight, 1e-5);\n\t\t}\n\t}\n\n\t// 2. Choke non-linear threshold contraction curve (applies even if radius == 0)\n\tif (op >= 6.5 && op < 7.5) {\n\t\tlet threshRange = max(0.01, 1.0 - threshold);\n\t\tmatte = clamp((matte - threshold) / threshRange, 0.0, 1.0);\n\t}\n\n\t// Range clamping\n\tlet lowerLimit = min(clampMin, clampMax);\n\tlet upperLimit = max(clampMin, clampMax);\n\tmatte = clamp(matte, lowerLimit, upperLimit);\n\n\t// Optional Binarization\n\tif (u.binarize > 0.5) {\n\t\tmatte = select(0.0, 1.0, matte >= threshold);\n\t}\n\n\t// Optional Inversion\n\tif (u.invertResult > 0.5) {\n\t\tmatte = 1.0 - matte;\n\t}\n\n\t// Output format conversion\n\tlet fmt = u.outputFormat;\n\tif (fmt < 0.5) {\n\t\t// WhiteWithAlpha: vec4(matte, matte, matte, matte) (premultiplied standard mask)\n\t\treturn vec4<f32>(matte, matte, matte, matte);\n\t} else if (fmt < 1.5) {\n\t\t// GrayscaleRGB: vec4(matte, matte, matte, 1.0)\n\t\treturn vec4<f32>(matte, matte, matte, 1.0);\n\t} else if (fmt < 2.5) {\n\t\t// AlphaOnly: vec4(0.0, 0.0, 0.0, matte)\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, matte);\n\t} else {\n\t\t// PassthroughRGB: Mask A color with new alpha\n\t\tlet origCol = textureSampleLevel(origTexA, samp, in.uv, 0.0);\n\t\tif (origCol.a < 1e-4) {\n\t\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t\t}\n\t\tlet unpremult = origCol.rgb / origCol.a;\n\t\treturn vec4<f32>(unpremult * matte, matte);\n\t}\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getMaskMathResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = texturesLayout(device, 3);\n\tconst signalTextureLayout = texturesLayout(device, 4);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_MASKMATH }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"MaskMath\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst radiusRes = resolveField(op.radiusHandleId, Number(op.radius ?? 0), 0, MAX_RADIUS);\n\tconst thresholdRes = resolveField(op.thresholdHandleId, Number(op.threshold ?? .5), 0, 1);\n\tconst clampMinRes = resolveField(op.clampMinHandleId, Number(op.clampMin ?? 0), 0, 1);\n\tconst clampMaxRes = resolveField(op.clampMaxHandleId, Number(op.clampMax ?? 1), 0, 1);\n\tconst { texture: tmpATex, view: tmpAView } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-maskA`\n\t} });\n\tlet tmpBTex = null;\n\tif (op.maskBMedia) ({texture: tmpBTex} = await drawChildToTexture(args, op.maskBMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskBMedia,\n\t\t\trenderId: `${props.renderId}-maskB`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tmpATex]\n\t\t},\n\t\texclude: [tmpATex]\n\t}));\n\tconst { pipeline, uniformLayout, textureLayout, signalTextureLayout } = getMaskMathResources(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, res.handleId ?? `${props.renderId ?? \"maskmath\"}_${suffix}`);\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst threshView = getSignalView(thresholdRes, \"threshold_sig\");\n\tconst clampMinView = getSignalView(clampMinRes, \"clampMin_sig\");\n\tconst clampMaxView = getSignalView(clampMaxRes, \"clampMax_sig\");\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: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: threshView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: clampMinView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: clampMaxView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tconst operationCode = OPERATION_MAP[op.operation ?? \"Union\"] ?? 0;\n\tconst channelACode = CHANNEL_MAP[op.channelA ?? \"Alpha\"] ?? 0;\n\tconst channelBCode = CHANNEL_MAP[op.channelB ?? \"Alpha\"] ?? 0;\n\tconst outputFormatCode = OUTPUT_FORMAT_MAP[op.outputFormat ?? \"WhiteWithAlpha\"] ?? 0;\n\tconst dummyBView = tmpBTex ? tmpBTex.createView() : tmpAView;\n\tconst hUniformData = new Float32Array(20);\n\tconst vUniformData = new Float32Array(20);\n\tconst baseUniforms = [\n\t\t0,\n\t\t0,\n\t\tradiusRes.val,\n\t\tthresholdRes.val,\n\t\tclampMinRes.val,\n\t\tclampMaxRes.val,\n\t\toperationCode,\n\t\tchannelACode,\n\t\tchannelBCode,\n\t\top.binarize ? 1 : 0,\n\t\top.invertResult ? 1 : 0,\n\t\toutputFormatCode,\n\t\ttmpBTex ? 1 : 0,\n\t\tradiusRes.hasStaticSig ? 1 : 0,\n\t\tthresholdRes.hasStaticSig ? 1 : 0,\n\t\tclampMinRes.hasStaticSig ? 1 : 0,\n\t\tclampMaxRes.hasStaticSig ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t];\n\thUniformData.set(baseUniforms);\n\thUniformData[0] = 1;\n\thUniformData[1] = 0;\n\thUniformData[17] = 0;\n\tvUniformData.set(baseUniforms);\n\tvUniformData[0] = 0;\n\tvUniformData[1] = 1;\n\tvUniformData[17] = 1;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpATex,\n\t\t...tmpBTex ? [tmpBTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpATex,\n\t\t...tmpBTex ? [tmpBTex] : [],\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(hUniformData);\n\tdrawFullscreenPass(encoder, outTex1.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: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: textureLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: tmpAView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyBView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: tmpAView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t}),\n\t\tsigBindGroup\n\t]);\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(vUniformData);\n\tdrawFullscreenPass(encoder, outTex2.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: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: textureLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: outTex1.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyBView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: tmpAView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t}),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, props.opacity ?? op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { MaskChannelEnum as a, MaskOperationEnum as c, MAX_RADIUS as i, MaskOutputFormatEnum as l, WebGPURenderer as n, MaskMathNodeConfigSchema as o, MASK_MATH_OUTPUT_TYPE_MAP as r, MaskMathResultSchema as s, renderers_default as t, maskMathConfig as u };\n//# sourceMappingURL=renderers-YQJYtdXA.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DX41niRU.mjs","names":[],"sources":["../../../nodes/node-mask-math/dist/renderers-YQJYtdXA.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 200;\nconst MaskOperationEnum = z.enum([\n\t\"Union\",\n\t\"Intersect\",\n\t\"Subtract\",\n\t\"Difference\",\n\t\"Invert\",\n\t\"Dilate\",\n\t\"Erode\",\n\t\"Choke\",\n\t\"Feather\"\n]);\nconst MaskChannelEnum = z.enum([\n\t\"Alpha\",\n\t\"Luminance\",\n\t\"Red\",\n\t\"Green\",\n\t\"Blue\"\n]);\nconst MaskOutputFormatEnum = z.enum([\n\t\"WhiteWithAlpha\",\n\t\"GrayscaleRGB\",\n\t\"AlphaOnly\",\n\t\"PassthroughRGB\"\n]);\nconst maskMathConfig = configBuilder().field(\"operation\", MaskOperationEnum.default(\"Union\"), {\n\tlabel: \"Operation\",\n\tdescription: \"Morphological or Boolean set operation applied to input alpha masks.\"\n}).field(\"radius\", z.number().min(0).max(MAX_RADIUS).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Radius / Width (px)\",\n\tdescription: \"Kernel radius in pixels for Dilate, Erode, Choke, or Feather operations.\"\n}).field(\"threshold\", z.number().multipleOf(.01).min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Threshold\",\n\tdescription: \"Cutoff threshold level (0.0–1.0) for binarization step or non-linear choke.\"\n}).field(\"clampMin\", z.number().multipleOf(.01).min(0).max(1).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Clamp Min\",\n\tdescription: \"Minimum alpha matte cutoff limit (0.0–1.0).\"\n}).field(\"clampMax\", z.number().multipleOf(.01).min(0).max(1).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Clamp Max\",\n\tdescription: \"Maximum alpha matte cutoff limit (0.0–1.0).\"\n}).field(\"channelA\", MaskChannelEnum.default(\"Alpha\"), {\n\tlabel: \"Mask A Channel\",\n\tdescription: \"Source channel to extract mask from Mask A (Alpha, Luminance, Red, Green, Blue).\"\n}).field(\"channelB\", MaskChannelEnum.default(\"Alpha\"), {\n\tlabel: \"Mask B Channel\",\n\tdescription: \"Source channel to extract mask from Mask B (Alpha, Luminance, Red, Green, Blue).\"\n}).field(\"binarize\", z.boolean().default(false), {\n\tlabel: \"Binarize\",\n\tdescription: \"When enabled, outputs crisp 1-bit binary matte based on threshold.\"\n}).field(\"invertResult\", z.boolean().default(false), {\n\tlabel: \"Invert Result\",\n\tdescription: \"Inverts final matte output.\"\n}).field(\"outputFormat\", MaskOutputFormatEnum.default(\"WhiteWithAlpha\"), {\n\tlabel: \"Output Format\",\n\tdescription: \"WhiteWithAlpha (rgba(1,1,1,a)), GrayscaleRGB (rgba(a,a,a,1)), AlphaOnly (rgba(0,0,0,a)), PassthroughRGB (Mask A RGB with new alpha).\"\n}).build();\nconst MaskMathNodeConfigSchema = maskMathConfig.schema;\nconst MaskMathResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst MASK_MATH_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 OPERATION_MAP = {\n\tUnion: 0,\n\tIntersect: 1,\n\tSubtract: 2,\n\tDifference: 3,\n\tInvert: 4,\n\tDilate: 5,\n\tErode: 6,\n\tChoke: 7,\n\tFeather: 8\n};\nconst CHANNEL_MAP = {\n\tAlpha: 0,\n\tLuminance: 1,\n\tRed: 2,\n\tGreen: 3,\n\tBlue: 4\n};\nconst OUTPUT_FORMAT_MAP = {\n\tWhiteWithAlpha: 0,\n\tGrayscaleRGB: 1,\n\tAlphaOnly: 2,\n\tPassthroughRGB: 3\n};\nconst WGSL_MASKMATH = `\nstruct MaskMathUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tradius : f32,\n\tthreshold : f32,\n\n\tclampMin : f32,\n\tclampMax : f32,\n\toperation : f32,\n\tchannelA : f32,\n\n\tchannelB : f32,\n\tbinarize : f32,\n\tinvertResult : f32,\n\toutputFormat : f32,\n\n\thasMaskB : f32,\n\thasRadiusSig : f32,\n\thasThreshSig : f32,\n\thasClampMinSig : f32,\n\n\thasClampMaxSig : f32,\n\tisSecondPass : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : MaskMathUniforms;\n\n@group(1) @binding(0) var texA : texture_2d<f32>;\n@group(1) @binding(1) var texB : texture_2d<f32>;\n@group(1) @binding(2) var origTexA : texture_2d<f32>;\n@group(1) @binding(3) var samp : sampler;\n\n@group(2) @binding(0) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(1) var threshSigTex : texture_2d<f32>;\n@group(2) @binding(2) var clampMinSigTex : texture_2d<f32>;\n@group(2) @binding(3) var clampMaxSigTex : texture_2d<f32>;\n@group(2) @binding(4) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn extractChannel(color : vec4<f32>, chCode : f32) -> f32 {\n\tif (chCode < 0.5) {\n\t\t// Alpha\n\t\treturn color.a;\n\t} else if (chCode < 1.5) {\n\t\t// Luminance\n\t\tlet luma = dot(color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, luma / color.a);\n\t\t}\n\t\treturn luma;\n\t} else if (chCode < 2.5) {\n\t\t// Red\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, color.r / color.a);\n\t\t}\n\t\treturn color.r;\n\t} else if (chCode < 3.5) {\n\t\t// Green\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, color.g / color.a);\n\t\t}\n\t\treturn color.g;\n\t} else {\n\t\t// Blue\n\t\tif (color.a > 1e-4) {\n\t\t\treturn min(1.0, color.b / color.a);\n\t\t}\n\t\treturn color.b;\n\t}\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(texA));\n\tlet texelSize = 1.0 / max(dimensions, vec2<f32>(1.0, 1.0));\n\n\tvar radius = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradius = clamp(textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 200.0);\n\t}\n\tvar threshold = u.threshold;\n\tif (u.hasThreshSig > 0.5) {\n\t\tthreshold = clamp(textureSampleLevel(threshSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 1.0);\n\t}\n\tvar clampMin = u.clampMin;\n\tif (u.hasClampMinSig > 0.5) {\n\t\tclampMin = clamp(textureSampleLevel(clampMinSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 1.0);\n\t}\n\tvar clampMax = u.clampMax;\n\tif (u.hasClampMaxSig > 0.5) {\n\t\tclampMax = clamp(textureSampleLevel(clampMaxSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r, 0.0, 1.0);\n\t}\n\n\tlet op = u.operation;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar val = 0.0;\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// -------------------------------------------------------------\n\t\t// PASS 1: Horizontal pass / Boolean operation\n\t\t// -------------------------------------------------------------\n\t\tlet sampleA = textureSampleLevel(texA, samp, in.uv, 0.0);\n\t\tlet sampleB = textureSampleLevel(texB, samp, in.uv, 0.0);\n\n\t\tlet a = extractChannel(sampleA, u.channelA);\n\t\tlet b = select(0.0, extractChannel(sampleB, u.channelB), u.hasMaskB > 0.5);\n\n\t\tif (op < 0.5) {\n\t\t\t// Union (A + B)\n\t\t\tval = select(a, clamp(a + b, 0.0, 1.0), u.hasMaskB > 0.5);\n\t\t} else if (op < 1.5) {\n\t\t\t// Intersect (min(A, B))\n\t\t\tval = select(a, min(a, b), u.hasMaskB > 0.5);\n\t\t} else if (op < 2.5) {\n\t\t\t// Subtract (clamp(A - B, 0, 1))\n\t\t\tval = select(a, clamp(a - b, 0.0, 1.0), u.hasMaskB > 0.5);\n\t\t} else if (op < 3.5) {\n\t\t\t// Difference (|A - B|)\n\t\t\tval = select(a, abs(a - b), u.hasMaskB > 0.5);\n\t\t} else if (op < 4.5) {\n\t\t\t// Invert (1 - A)\n\t\t\tval = 1.0 - a;\n\t\t} else if (op < 5.5) {\n\t\t\t// Dilate (Horizontal Max)\n\t\t\tif (radius <= 0.0) {\n\t\t\t\tval = a;\n\t\t\t} else {\n\t\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\t\tvar maxVal = a;\n\t\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\t\tmaxVal = max(maxVal, extractChannel(s, u.channelA));\n\t\t\t\t}\n\t\t\t\tval = maxVal;\n\t\t\t}\n\t\t} else if (op < 7.5) {\n\t\t\t// Erode & Choke (Horizontal Min)\n\t\t\tif (radius <= 0.0) {\n\t\t\t\tval = a;\n\t\t\t} else {\n\t\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\t\tvar minVal = a;\n\t\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\t\tminVal = min(minVal, extractChannel(s, u.channelA));\n\t\t\t\t}\n\t\t\t\tval = minVal;\n\t\t\t}\n\t\t} else {\n\t\t\t// Feather (Horizontal Gaussian Blur)\n\t\t\tif (radius <= 0.0) {\n\t\t\t\tval = a;\n\t\t\t} else {\n\t\t\t\tlet spatial_sigma = max(0.1, radius / 2.0);\n\t\t\t\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\t\t\t\tlet effectiveSigma = spatial_sigma / stepScale;\n\t\t\t\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 48);\n\t\t\t\tvar accum = 0.0;\n\t\t\t\tvar totalWeight = 0.0;\n\t\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\t\tlet x = f32(i) * stepScale;\n\t\t\t\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\t\taccum += extractChannel(s, u.channelA) * weight;\n\t\t\t\t\ttotalWeight += weight;\n\t\t\t\t}\n\t\t\t\tval = accum / max(totalWeight, 1e-5);\n\t\t\t}\n\t\t}\n\n\t\treturn vec4<f32>(val, val, val, val);\n\t}\n\n\t// -------------------------------------------------------------\n\t// PASS 2: Vertical pass & Post-processing (clamp, binarize, format)\n\t// -------------------------------------------------------------\n\tlet samplePass1 = textureSampleLevel(texA, samp, in.uv, 0.0);\n\tvar matte = samplePass1.r;\n\n\t// 1. Spatial kernel processing (Dilate, Erode, Choke, Feather) when radius > 0\n\tif (radius > 0.0) {\n\t\tif (op >= 4.5 && op < 5.5) {\n\t\t\t// Dilate (Vertical Max)\n\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\tvar maxVal = matte;\n\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\tmaxVal = max(maxVal, s.r);\n\t\t\t}\n\t\t\tmatte = maxVal;\n\t\t} else if (op >= 5.5 && op < 7.5) {\n\t\t\t// Erode & Choke (Vertical Min)\n\t\t\tlet stepScale = max(1.0, radius / 20.0);\n\t\t\tlet sampleRadius = min(i32(ceil(radius / stepScale)), 48);\n\t\t\tvar minVal = matte;\n\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\tminVal = min(minVal, s.r);\n\t\t\t}\n\t\t\tmatte = minVal;\n\t\t} else if (op >= 7.5) {\n\t\t\t// Feather (Vertical Gaussian Blur)\n\t\t\tlet spatial_sigma = max(0.1, radius / 2.0);\n\t\t\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\t\t\tlet effectiveSigma = spatial_sigma / stepScale;\n\t\t\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 48);\n\t\t\tvar accum = 0.0;\n\t\t\tvar totalWeight = 0.0;\n\t\t\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\t\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\t\t\tlet x = f32(i) * stepScale;\n\t\t\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\t\t\tlet s = textureSampleLevel(texA, samp, in.uv + offset, 0.0);\n\t\t\t\taccum += s.r * weight;\n\t\t\t\ttotalWeight += weight;\n\t\t\t}\n\t\t\tmatte = accum / max(totalWeight, 1e-5);\n\t\t}\n\t}\n\n\t// 2. Choke non-linear threshold contraction curve (applies even if radius == 0)\n\tif (op >= 6.5 && op < 7.5) {\n\t\tlet threshRange = max(0.01, 1.0 - threshold);\n\t\tmatte = clamp((matte - threshold) / threshRange, 0.0, 1.0);\n\t}\n\n\t// Range clamping\n\tlet lowerLimit = min(clampMin, clampMax);\n\tlet upperLimit = max(clampMin, clampMax);\n\tmatte = clamp(matte, lowerLimit, upperLimit);\n\n\t// Optional Binarization\n\tif (u.binarize > 0.5) {\n\t\tmatte = select(0.0, 1.0, matte >= threshold);\n\t}\n\n\t// Optional Inversion\n\tif (u.invertResult > 0.5) {\n\t\tmatte = 1.0 - matte;\n\t}\n\n\t// Output format conversion\n\tlet fmt = u.outputFormat;\n\tif (fmt < 0.5) {\n\t\t// WhiteWithAlpha: vec4(matte, matte, matte, matte) (premultiplied standard mask)\n\t\treturn vec4<f32>(matte, matte, matte, matte);\n\t} else if (fmt < 1.5) {\n\t\t// GrayscaleRGB: vec4(matte, matte, matte, 1.0)\n\t\treturn vec4<f32>(matte, matte, matte, 1.0);\n\t} else if (fmt < 2.5) {\n\t\t// AlphaOnly: vec4(0.0, 0.0, 0.0, matte)\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, matte);\n\t} else {\n\t\t// PassthroughRGB: Mask A color with new alpha\n\t\tlet origCol = textureSampleLevel(origTexA, samp, in.uv, 0.0);\n\t\tif (origCol.a < 1e-4) {\n\t\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t\t}\n\t\tlet unpremult = origCol.rgb / origCol.a;\n\t\treturn vec4<f32>(unpremult * matte, matte);\n\t}\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getMaskMathResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = texturesLayout(device, 3);\n\tconst signalTextureLayout = texturesLayout(device, 4);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalTextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_MASKMATH }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"MaskMath\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst radiusRes = resolveField(op.radiusHandleId, Number(op.radius ?? 0), 0, MAX_RADIUS);\n\tconst thresholdRes = resolveField(op.thresholdHandleId, Number(op.threshold ?? .5), 0, 1);\n\tconst clampMinRes = resolveField(op.clampMinHandleId, Number(op.clampMin ?? 0), 0, 1);\n\tconst clampMaxRes = resolveField(op.clampMaxHandleId, Number(op.clampMax ?? 1), 0, 1);\n\tconst { texture: tmpATex, view: tmpAView } = await drawChildToTexture(args, childMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\trenderId: `${props.renderId}-maskA`\n\t} });\n\tlet tmpBTex = null;\n\tif (op.maskBMedia) ({texture: tmpBTex} = await drawChildToTexture(args, op.maskBMedia, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: op.maskBMedia,\n\t\t\trenderId: `${props.renderId}-maskB`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tmpATex]\n\t\t},\n\t\texclude: [tmpATex]\n\t}));\n\tconst { pipeline, uniformLayout, textureLayout, signalTextureLayout } = getMaskMathResources(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, res.handleId ?? `${props.renderId ?? \"maskmath\"}_${suffix}`);\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst threshView = getSignalView(thresholdRes, \"threshold_sig\");\n\tconst clampMinView = getSignalView(clampMinRes, \"clampMin_sig\");\n\tconst clampMaxView = getSignalView(clampMaxRes, \"clampMax_sig\");\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: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: threshView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: clampMinView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: clampMaxView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tconst operationCode = OPERATION_MAP[op.operation ?? \"Union\"] ?? 0;\n\tconst channelACode = CHANNEL_MAP[op.channelA ?? \"Alpha\"] ?? 0;\n\tconst channelBCode = CHANNEL_MAP[op.channelB ?? \"Alpha\"] ?? 0;\n\tconst outputFormatCode = OUTPUT_FORMAT_MAP[op.outputFormat ?? \"WhiteWithAlpha\"] ?? 0;\n\tconst dummyBView = tmpBTex ? tmpBTex.createView() : tmpAView;\n\tconst hUniformData = new Float32Array(20);\n\tconst vUniformData = new Float32Array(20);\n\tconst baseUniforms = [\n\t\t0,\n\t\t0,\n\t\tradiusRes.val,\n\t\tthresholdRes.val,\n\t\tclampMinRes.val,\n\t\tclampMaxRes.val,\n\t\toperationCode,\n\t\tchannelACode,\n\t\tchannelBCode,\n\t\top.binarize ? 1 : 0,\n\t\top.invertResult ? 1 : 0,\n\t\toutputFormatCode,\n\t\ttmpBTex ? 1 : 0,\n\t\tradiusRes.hasStaticSig ? 1 : 0,\n\t\tthresholdRes.hasStaticSig ? 1 : 0,\n\t\tclampMinRes.hasStaticSig ? 1 : 0,\n\t\tclampMaxRes.hasStaticSig ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t];\n\thUniformData.set(baseUniforms);\n\thUniformData[0] = 1;\n\thUniformData[1] = 0;\n\thUniformData[17] = 0;\n\tvUniformData.set(baseUniforms);\n\tvUniformData[0] = 0;\n\tvUniformData[1] = 1;\n\tvUniformData[17] = 1;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpATex,\n\t\t...tmpBTex ? [tmpBTex] : [],\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpATex,\n\t\t...tmpBTex ? [tmpBTex] : [],\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(hUniformData);\n\tdrawFullscreenPass(encoder, outTex1.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: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: textureLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: tmpAView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyBView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: tmpAView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t}),\n\t\tsigBindGroup\n\t]);\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(vUniformData);\n\tdrawFullscreenPass(encoder, outTex2.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: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: textureLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: outTex1.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: dummyBView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: tmpAView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t}),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, props.opacity ?? op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { MaskChannelEnum as a, MaskOperationEnum as c, MAX_RADIUS as i, MaskOutputFormatEnum as l, WebGPURenderer as n, MaskMathNodeConfigSchema as o, MASK_MATH_OUTPUT_TYPE_MAP as r, MaskMathResultSchema as s, renderers_default as t, maskMathConfig as u };\n//# sourceMappingURL=renderers-YQJYtdXA.mjs.map"],"mappings":";;;;;;AAMA,MAAM,aAAa;AACnB,MAAM,oBAAoB,EAAE,KAAK;CAChC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,CAAC;AACF,MAAM,kBAAkB,EAAE,KAAK;CAC9B;CACA;CACA;CACA;CACA;CACA,CAAC;AACF,MAAM,uBAAuB,EAAE,KAAK;CACnC;CACA;CACA;CACA;CACA,CAAC;AACF,MAAM,iBAAiB,eAAe,CAAC,MAAM,aAAa,kBAAkB,QAAQ,QAAQ,EAAE;CAC7F,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE;CAChE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,aAAa,EAAE,QAAQ,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,GAAG,EAAE;CAC3E,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,YAAY,EAAE,QAAQ,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;CACzE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,YAAY,EAAE,QAAQ,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE;CACzE,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,YAAY,gBAAgB,QAAQ,QAAQ,EAAE;CACtD,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,YAAY,gBAAgB,QAAQ,QAAQ,EAAE;CACtD,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,YAAY,EAAE,SAAS,CAAC,QAAQ,MAAM,EAAE;CAChD,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,gBAAgB,EAAE,SAAS,CAAC,QAAQ,MAAM,EAAE;CACpD,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,gBAAgB,qBAAqB,QAAQ,iBAAiB,EAAE;CACxE,OAAO;CACP,aAAa;CACb,CAAC,CAAC,OAAO;AACV,MAAM,2BAA2B,eAAe;AAChD,MAAM,uBAAuB,EAAE,MAAM,CAAC,mBAAmB,kBAAkB,CAAC;AAW5E,MAAM,gBAAgB;CACrB,OAAO;CACP,WAAW;CACX,UAAU;CACV,YAAY;CACZ,QAAQ;CACR,QAAQ;CACR,OAAO;CACP,OAAO;CACP,SAAS;CACT;AACD,MAAM,cAAc;CACnB,OAAO;CACP,WAAW;CACX,KAAK;CACL,OAAO;CACP,MAAM;CACN;AACD,MAAM,oBAAoB;CACzB,gBAAgB;CAChB,cAAc;CACd,WAAW;CACX,gBAAgB;CAChB;AACD,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwCpB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0OvB,MAAM,sCAAsC,IAAI,SAAS;AACzD,SAAS,qBAAqB,QAAQ,cAAc;CACnD,MAAM,SAAS,oBAAoB,IAAI,OAAO;AAC9C,KAAI,OAAQ,QAAO;CACnB,MAAM,gBAAgB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAClE,MAAM,gBAAgB,eAAe,QAAQ,EAAE;CAC/C,MAAM,sBAAsB,eAAe,QAAQ,EAAE;CACrD,MAAM,MAAM;EACX;EACA;EACA;EACA,UAAU,yBAAyB,QAAQ;GAC1C,QAAQ,OAAO,mBAAmB,EAAE,MAAM,eAAe,CAAC;GAC1D,SAAS,OAAO,qBAAqB,EAAE,kBAAkB;IACxD;IACA;IACA;IACA,EAAE,CAAC;GACJ,QAAQ;GACR,CAAC;EACF;AACD,qBAAoB,IAAI,QAAQ,IAAI;AACpC,QAAO;;AAER,MAAM,iBAAiB,OAAO,SAAS;CACtC,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,cAAc,CAAC,GAAI;CAClC,MAAM,aAAa,MAAM,cAAc,WAAW;AAClD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,gBAAgB,UAAU,aAAa,WAAW,GAAG,WAAW,QAAQ,mBAAmB,GAAG,QAAQ,UAAU,aAAa,UAAU,SAAS;CACtJ,MAAM,YAAY,aAAa,GAAG,gBAAgB,OAAO,GAAG,UAAU,EAAE,EAAE,GAAG,WAAW;CACxF,MAAM,eAAe,aAAa,GAAG,mBAAmB,OAAO,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE;CACzF,MAAM,cAAc,aAAa,GAAG,kBAAkB,OAAO,GAAG,YAAY,EAAE,EAAE,GAAG,EAAE;CACrF,MAAM,cAAc,aAAa,GAAG,kBAAkB,OAAO,GAAG,YAAY,EAAE,EAAE,GAAG,EAAE;CACrF,MAAM,EAAE,SAAS,SAAS,MAAM,aAAa,MAAM,mBAAmB,MAAM,YAAY,EAAE,OAAO;EAChG,GAAG;EACH,cAAc;EACd,UAAU,GAAG,MAAM,SAAS;EAC5B,EAAE,CAAC;CACJ,IAAI,UAAU;AACd,KAAI,GAAG,WAAY,EAAC,CAAC,SAAS,WAAW,MAAM,mBAAmB,MAAM,GAAG,YAAY;EACtF,OAAO;GACN,GAAG;GACH,cAAc,GAAG;GACjB,UAAU,GAAG,MAAM,SAAS;GAC5B,iBAAiB,CAAC,GAAG,MAAM,mBAAmB,EAAE,EAAE,QAAQ;GAC1D;EACD,SAAS,CAAC,QAAQ;EAClB,CAAC;CACF,MAAM,EAAE,UAAU,eAAe,eAAe,wBAAwB,qBAAqB,IAAI,QAAQ,IAAI,SAAS,OAAO;CAC7H,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;CAC3E,MAAM,gBAAgB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,MAAM,iBAAiB,KAAK,WAAW,kBAAkB,eAAe,KAAK,IAAI,YAAY,GAAG,MAAM,YAAY,WAAW,GAAG,SAAS;CACzI,MAAM,aAAa,cAAc,WAAW,aAAa;CACzD,MAAM,aAAa,cAAc,cAAc,gBAAgB;CAC/D,MAAM,eAAe,cAAc,aAAa,eAAe;CAC/D,MAAM,eAAe,cAAc,aAAa,eAAe;CAC/D,MAAM,eAAe,IAAI,OAAO,gBAAgB;EAC/C,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;EACD,CAAC;CACF,MAAM,gBAAgB,cAAc,GAAG,aAAa,YAAY;CAChE,MAAM,eAAe,YAAY,GAAG,YAAY,YAAY;CAC5D,MAAM,eAAe,YAAY,GAAG,YAAY,YAAY;CAC5D,MAAM,mBAAmB,kBAAkB,GAAG,gBAAgB,qBAAqB;CACnF,MAAM,aAAa,UAAU,QAAQ,YAAY,GAAG;CACpD,MAAM,eAAe,IAAI,aAAa,GAAG;CACzC,MAAM,eAAe,IAAI,aAAa,GAAG;CACzC,MAAM,eAAe;EACpB;EACA;EACA,UAAU;EACV,aAAa;EACb,YAAY;EACZ,YAAY;EACZ;EACA;EACA;EACA,GAAG,WAAW,IAAI;EAClB,GAAG,eAAe,IAAI;EACtB;EACA,UAAU,IAAI;EACd,UAAU,eAAe,IAAI;EAC7B,aAAa,eAAe,IAAI;EAChC,YAAY,eAAe,IAAI;EAC/B,YAAY,eAAe,IAAI;EAC/B;EACA;EACA;EACA;AACD,cAAa,IAAI,aAAa;AAC9B,cAAa,KAAK;AAClB,cAAa,KAAK;AAClB,cAAa,MAAM;AACnB,cAAa,IAAI,aAAa;AAC9B,cAAa,KAAK;AAClB,cAAa,KAAK;AAClB,cAAa,MAAM;CACnB,MAAM,UAAU,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC/D;EACA,GAAG,UAAU,CAAC,QAAQ,GAAG,EAAE;EAC3B;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC/D;EACA,GAAG,UAAU,CAAC,QAAQ,GAAG,EAAE;EAC3B;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,mBAAmB,aAAa;AAC7D,oBAAmB,SAAS,QAAQ,YAAY,EAAE,UAAU;EAC3D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,SAAS;IAC7B,CAAC;GACF,CAAC;EACF,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS;IACR;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;GACD,CAAC;EACF;EACA,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,mBAAmB,aAAa;AAC7D,oBAAmB,SAAS,QAAQ,YAAY,EAAE,UAAU;EAC3D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,SAAS;IAC7B,CAAC;GACF,CAAC;EACF,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS;IACR;KACC,SAAS;KACT,UAAU,QAAQ,YAAY;KAC9B;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;KACC,SAAS;KACT,UAAU;KACV;IACD;GACD,CAAC;EACF;EACA,CAAC;AACF,qBAAoB,MAAM,SAAS,MAAM,WAAW,GAAG,WAAW,EAAE;;AAKrE,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
2
- import { Rn as signalRegistry } from "./dist-CFe1fC9l.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CU2tEKJJ.mjs";
2
+ import { Rn as signalRegistry } from "./dist-C1cCW7Bt.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CMaa63nz.mjs";
4
4
 
5
5
  //#region ../../nodes/node-film-grain/dist/renderers-C10tt2eD.mjs
6
6
  const FILM_GRAIN_SHADER = `
@@ -247,4 +247,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: FilmGrainWebGPURenderer
247
247
 
248
248
  //#endregion
249
249
  export { renderers_default as t };
250
- //# sourceMappingURL=renderer-D3K9FEQk.mjs.map
250
+ //# sourceMappingURL=renderer-DXEWbnRF.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-D3K9FEQk.mjs","names":[],"sources":["../../../nodes/node-film-grain/dist/renderers-C10tt2eD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst FILM_GRAIN_SHADER = `\nstruct FilmUniforms {\n strength : f32,\n size : f32,\n monochrome : f32,\n animated : f32,\n\n frameIndex : f32, // discrete per-output-frame counter (speed-scaled), NOT continuous time\n shadows : f32,\n midtones : f32,\n highlights : f32,\n\n hasSignal : f32,\n _pad0 : f32,\n _pad1 : f32,\n _pad2 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : FilmUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var signalTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hash2D(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn smoothNoise(p: vec2<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n\n // Quintic interpolation\n let w = pf * pf * pf * (pf * (pf * 6.0 - 15.0) + 10.0);\n\n let h00 = hash2D(pi + vec2<f32>(0.0, 0.0));\n let h10 = hash2D(pi + vec2<f32>(1.0, 0.0));\n let h01 = hash2D(pi + vec2<f32>(0.0, 1.0));\n let h11 = hash2D(pi + vec2<f32>(1.0, 1.0));\n\n let n0 = mix(h00, h10, w.x);\n let n1 = mix(h01, h11, w.x);\n\n return mix(n0, n1, w.y);\n}\n\n// Produces a pseudo-random, NON-directional offset that changes once per\n// output frame. This replaces the old time * constant translation, which\n// smoothly scrolled the noise lattice in a fixed direction (17.31, 43.19)\n// every frame -- that's why grain visibly drifted instead of flickering.\n//\n// The frame index is wrapped into a bounded range before hashing so the\n// pattern stays high quality over long renders (f32 precision degrades on\n// very large hash inputs); the wrap period is long enough that any repeat\n// is imperceptible in grain.\nfn frameJitter(frameIndex: f32) -> vec2<f32> {\n let raw = floor(frameIndex);\n let n = raw - floor(raw / 4096.0) * 4096.0;\n let hx = hash2D(vec2<f32>(n, n * 1.6180339887));\n let hy = hash2D(vec2<f32>(n * 3.14159265, n + 91.7));\n return vec2<f32>(hx, hy) * 1024.0;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n var color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n var strength = u.strength;\n if (u.hasSignal > 0.5) {\n let sigVal = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n strength = sigVal;\n }\n\n if (strength <= 0.0) {\n return color;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let grainCoord = (in.uv * dimensions) / u.size;\n\n let jitter = select(vec2<f32>(0.0), frameJitter(u.frameIndex), u.animated > 0.5);\n\n let luminance = dot(color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n // Luminance response curve logic\n let shadowFactor = exp(-luminance * luminance / 0.1);\n let highlightFactor = exp(-(1.0 - luminance) * (1.0 - luminance) / 0.1);\n let midtoneFactor = max(0.0, 1.0 - shadowFactor - highlightFactor);\n\n let response = (u.shadows * shadowFactor) + (u.midtones * midtoneFactor) + (u.highlights * highlightFactor);\n let finalGrainStrength = (strength / 100.0) * response * 0.15; // Normalized scale\n\n if (u.monochrome > 0.5) {\n let seed = grainCoord + jitter;\n let noiseVal = smoothNoise(seed);\n let grain = (noiseVal - 0.5) * finalGrainStrength;\n color.r += grain;\n color.g += grain;\n color.b += grain;\n } else {\n // Fixed per-channel spatial offsets (unrelated to time) keep the\n // R/G/B lattices decorrelated from each other; temporal variation\n // comes entirely from jitter now.\n let seedR = grainCoord + jitter;\n let seedG = grainCoord + jitter + vec2<f32>(173.3, 281.9);\n let seedB = grainCoord + jitter + vec2<f32>(391.7, 127.1);\n\n let noiseR = smoothNoise(seedR);\n let noiseG = smoothNoise(seedG);\n let noiseB = smoothNoise(seedB);\n\n color.r += (noiseR - 0.5) * finalGrainStrength;\n color.g += (noiseG - 0.5) * finalGrainStrength;\n color.b += (noiseB - 0.5) * finalGrainStrength;\n }\n\n return clamp(color, vec4<f32>(0.0), vec4<f32>(1.0));\n}\n`;\nconst filmGrainUniformData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tfilmUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getFilmGrainResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `filmgrain_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst filmModule = device.createShaderModule({\n\t\t\tlabel: `filmgrain_${format}.wgsl`,\n\t\t\tcode: FILM_GRAIN_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `FilmGrainPipeline_${format}`,\n\t\t\tmodule: filmModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.filmUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tfilmPipeline: pipeline,\n\t\tfilmUniformLayout: layouts.filmUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst FilmGrainWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"FilmGrain\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst signalInput = op.strengthHandleId ? op.inputs?.[op.strengthHandleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && (signalInput.outputItem?.type === \"Signal\" || signalInput.outputItem?.type === \"Numeric\"));\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tconst resolveVal = (val, fallback) => {\n\t\tif (val === void 0 || val === null) return fallback;\n\t\tif (typeof val === \"object\" && val !== null) {\n\t\t\tif (\"get\" in val && typeof val.get === \"function\") val = val.get({\n\t\t\t\tframe: compositionFrame,\n\t\t\t\tfps\n\t\t\t});\n\t\t\telse if (\"value\" in val) val = val.value;\n\t\t} else if (typeof val === \"function\") val = val(compositionFrame, fps);\n\t\tconst n = Number(val);\n\t\treturn Number.isFinite(n) ? n : fallback;\n\t};\n\tlet strength = 0;\n\tlet hasStaticSignal = false;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") strength = Math.max(0, Number(signalInput.outputItem.data ?? 0));\n\telse strength = Math.max(0, resolveVal(op.strength, 15));\n\telse if (sd) {\n\t\tstrength = Math.max(0, Number(sd.offset ?? 0));\n\t\thasStaticSignal = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { filmPipeline: pipeline, filmUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getFilmGrainResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tlet signalView;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tif (hasStaticSignal && sd) signalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, sd.nodeId ?? \"filmgrain_strength_sig\", elapsedSeconds, durationSeconds, sd, width, height, props.renderId, frame, fps);\n\telse signalView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst size = Math.max(.5, resolveVal(op.size, 1.5)) * dpiScale;\n\tconst animated = op.animated ?? true;\n\tconst grainFrameIndex = frame * (resolveVal(op.speed, 50) / 50);\n\tfilmGrainUniformData[0] = strength;\n\tfilmGrainUniformData[1] = size;\n\tfilmGrainUniformData[2] = op.monochrome ?? true ? 1 : 0;\n\tfilmGrainUniformData[3] = animated ? 1 : 0;\n\tfilmGrainUniformData[4] = grainFrameIndex;\n\tfilmGrainUniformData[5] = resolveVal(op.shadows, .2);\n\tfilmGrainUniformData[6] = resolveVal(op.midtones, 1);\n\tfilmGrainUniformData[7] = resolveVal(op.highlights, .2);\n\tfilmGrainUniformData[8] = hasStaticSignal ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(filmGrainUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, resolveVal(op.opacity, 1));\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: FilmGrainWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C10tt2eD.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DXEWbnRF.mjs","names":[],"sources":["../../../nodes/node-film-grain/dist/renderers-C10tt2eD.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst FILM_GRAIN_SHADER = `\nstruct FilmUniforms {\n strength : f32,\n size : f32,\n monochrome : f32,\n animated : f32,\n\n frameIndex : f32, // discrete per-output-frame counter (speed-scaled), NOT continuous time\n shadows : f32,\n midtones : f32,\n highlights : f32,\n\n hasSignal : f32,\n _pad0 : f32,\n _pad1 : f32,\n _pad2 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : FilmUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var signalTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hash2D(p: vec2<f32>) -> f32 {\n var p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfn smoothNoise(p: vec2<f32>) -> f32 {\n let pi = floor(p);\n let pf = fract(p);\n\n // Quintic interpolation\n let w = pf * pf * pf * (pf * (pf * 6.0 - 15.0) + 10.0);\n\n let h00 = hash2D(pi + vec2<f32>(0.0, 0.0));\n let h10 = hash2D(pi + vec2<f32>(1.0, 0.0));\n let h01 = hash2D(pi + vec2<f32>(0.0, 1.0));\n let h11 = hash2D(pi + vec2<f32>(1.0, 1.0));\n\n let n0 = mix(h00, h10, w.x);\n let n1 = mix(h01, h11, w.x);\n\n return mix(n0, n1, w.y);\n}\n\n// Produces a pseudo-random, NON-directional offset that changes once per\n// output frame. This replaces the old time * constant translation, which\n// smoothly scrolled the noise lattice in a fixed direction (17.31, 43.19)\n// every frame -- that's why grain visibly drifted instead of flickering.\n//\n// The frame index is wrapped into a bounded range before hashing so the\n// pattern stays high quality over long renders (f32 precision degrades on\n// very large hash inputs); the wrap period is long enough that any repeat\n// is imperceptible in grain.\nfn frameJitter(frameIndex: f32) -> vec2<f32> {\n let raw = floor(frameIndex);\n let n = raw - floor(raw / 4096.0) * 4096.0;\n let hx = hash2D(vec2<f32>(n, n * 1.6180339887));\n let hy = hash2D(vec2<f32>(n * 3.14159265, n + 91.7));\n return vec2<f32>(hx, hy) * 1024.0;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n var color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n var strength = u.strength;\n if (u.hasSignal > 0.5) {\n let sigVal = textureSampleLevel(signalTex, signalSamp, in.uv, 0.0).r;\n strength = sigVal;\n }\n\n if (strength <= 0.0) {\n return color;\n }\n\n let dimensions = vec2<f32>(textureDimensions(tex));\n let grainCoord = (in.uv * dimensions) / u.size;\n\n let jitter = select(vec2<f32>(0.0), frameJitter(u.frameIndex), u.animated > 0.5);\n\n let luminance = dot(color.rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n // Luminance response curve logic\n let shadowFactor = exp(-luminance * luminance / 0.1);\n let highlightFactor = exp(-(1.0 - luminance) * (1.0 - luminance) / 0.1);\n let midtoneFactor = max(0.0, 1.0 - shadowFactor - highlightFactor);\n\n let response = (u.shadows * shadowFactor) + (u.midtones * midtoneFactor) + (u.highlights * highlightFactor);\n let finalGrainStrength = (strength / 100.0) * response * 0.15; // Normalized scale\n\n if (u.monochrome > 0.5) {\n let seed = grainCoord + jitter;\n let noiseVal = smoothNoise(seed);\n let grain = (noiseVal - 0.5) * finalGrainStrength;\n color.r += grain;\n color.g += grain;\n color.b += grain;\n } else {\n // Fixed per-channel spatial offsets (unrelated to time) keep the\n // R/G/B lattices decorrelated from each other; temporal variation\n // comes entirely from jitter now.\n let seedR = grainCoord + jitter;\n let seedG = grainCoord + jitter + vec2<f32>(173.3, 281.9);\n let seedB = grainCoord + jitter + vec2<f32>(391.7, 127.1);\n\n let noiseR = smoothNoise(seedR);\n let noiseG = smoothNoise(seedG);\n let noiseB = smoothNoise(seedB);\n\n color.r += (noiseR - 0.5) * finalGrainStrength;\n color.g += (noiseG - 0.5) * finalGrainStrength;\n color.b += (noiseB - 0.5) * finalGrainStrength;\n }\n\n return clamp(color, vec4<f32>(0.0), vec4<f32>(1.0));\n}\n`;\nconst filmGrainUniformData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tfilmUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getFilmGrainResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `filmgrain_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst filmModule = device.createShaderModule({\n\t\t\tlabel: `filmgrain_${format}.wgsl`,\n\t\t\tcode: FILM_GRAIN_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `FilmGrainPipeline_${format}`,\n\t\t\tmodule: filmModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.filmUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tfilmPipeline: pipeline,\n\t\tfilmUniformLayout: layouts.filmUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst FilmGrainWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"FilmGrain\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst signalInput = op.strengthHandleId ? op.inputs?.[op.strengthHandleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && (signalInput.outputItem?.type === \"Signal\" || signalInput.outputItem?.type === \"Numeric\"));\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tconst resolveVal = (val, fallback) => {\n\t\tif (val === void 0 || val === null) return fallback;\n\t\tif (typeof val === \"object\" && val !== null) {\n\t\t\tif (\"get\" in val && typeof val.get === \"function\") val = val.get({\n\t\t\t\tframe: compositionFrame,\n\t\t\t\tfps\n\t\t\t});\n\t\t\telse if (\"value\" in val) val = val.value;\n\t\t} else if (typeof val === \"function\") val = val(compositionFrame, fps);\n\t\tconst n = Number(val);\n\t\treturn Number.isFinite(n) ? n : fallback;\n\t};\n\tlet strength = 0;\n\tlet hasStaticSignal = false;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") strength = Math.max(0, Number(signalInput.outputItem.data ?? 0));\n\telse strength = Math.max(0, resolveVal(op.strength, 15));\n\telse if (sd) {\n\t\tstrength = Math.max(0, Number(sd.offset ?? 0));\n\t\thasStaticSignal = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { filmPipeline: pipeline, filmUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getFilmGrainResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tlet signalView;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tif (hasStaticSignal && sd) signalView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, sd.nodeId ?? \"filmgrain_strength_sig\", elapsedSeconds, durationSeconds, sd, width, height, props.renderId, frame, fps);\n\telse signalView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst size = Math.max(.5, resolveVal(op.size, 1.5)) * dpiScale;\n\tconst animated = op.animated ?? true;\n\tconst grainFrameIndex = frame * (resolveVal(op.speed, 50) / 50);\n\tfilmGrainUniformData[0] = strength;\n\tfilmGrainUniformData[1] = size;\n\tfilmGrainUniformData[2] = op.monochrome ?? true ? 1 : 0;\n\tfilmGrainUniformData[3] = animated ? 1 : 0;\n\tfilmGrainUniformData[4] = grainFrameIndex;\n\tfilmGrainUniformData[5] = resolveVal(op.shadows, .2);\n\tfilmGrainUniformData[6] = resolveVal(op.midtones, 1);\n\tfilmGrainUniformData[7] = resolveVal(op.highlights, .2);\n\tfilmGrainUniformData[8] = hasStaticSignal ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(filmGrainUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, resolveVal(op.opacity, 1));\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: FilmGrainWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C10tt2eD.mjs.map"],"mappings":";;;;;AAKA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;EAuBxB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkGvB,MAAM,uBAAuB,IAAI,aAAa,GAAG;AACjD,MAAM,mBAAmB,WAAW,YAAY;CAC/C,mBAAmB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAC/D,qBAAqB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;CAC5E,qBAAqB,wBAAwB,QAAQ,CAAC,WAAW,UAAU,CAAC;CAC5E,+BAA+B,IAAI,KAAK;CACxC,EAAE;AACH,SAAS,sBAAsB,QAAQ,QAAQ;CAC9C,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,WAAW,aAAa;CAC9B,IAAI,WAAW,QAAQ,cAAc,IAAI,SAAS;AAClD,KAAI,CAAC,UAAU;EACd,MAAM,aAAa,OAAO,mBAAmB;GAC5C,OAAO,aAAa,OAAO;GAC3B,MAAM;GACN,CAAC;AACF,aAAW,yBAAyB,QAAQ;GAC3C,OAAO,qBAAqB;GAC5B,QAAQ;GACR,SAAS;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR;GACD;GACA,CAAC;AACF,UAAQ,cAAc,IAAI,UAAU,SAAS;;AAE9C,QAAO;EACN,cAAc;EACd,mBAAmB,QAAQ;EAC3B,qBAAqB,QAAQ;EAC7B,qBAAqB,QAAQ;EAC7B;;AAEF,MAAM,0BAA0B,OAAO,SAAS;CAC/C,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,mBAAmB,MAAM,oBAAoB;CACnD,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,eAAe,CAAC,GAAI;CACnC,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,WAAW,SAAS,MAAM,kBAAkB,IAAI,QAAQ,SAAS,OAAO,WAAW,cAAc,OAAO,mBAAmB;CACjI,MAAM,cAAc,GAAG,mBAAmB,GAAG,SAAS,GAAG,oBAAoB;CAC7E,MAAM,YAAY,CAAC,EAAE,aAAa,oBAAoB,YAAY,YAAY,SAAS,YAAY,YAAY,YAAY,SAAS;CACpI,MAAM,KAAK,aAAa,aAAa,YAAY,OAAO,YAAY,WAAW,OAAO;CACtF,MAAM,cAAc,KAAK,aAAa;AACrC,MAAI,QAAQ,KAAK,KAAK,QAAQ,KAAM,QAAO;AAC3C,MAAI,OAAO,QAAQ,YAAY,QAAQ,MACtC;OAAI,SAAS,OAAO,OAAO,IAAI,QAAQ,WAAY,OAAM,IAAI,IAAI;IAChE,OAAO;IACP;IACA,CAAC;YACO,WAAW,IAAK,OAAM,IAAI;aACzB,OAAO,QAAQ,WAAY,OAAM,IAAI,kBAAkB,IAAI;EACtE,MAAM,IAAI,OAAO,IAAI;AACrB,SAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;CAEjC,IAAI,WAAW;CACf,IAAI,kBAAkB;AACtB,KAAI,CAAC,UAAW,KAAI,aAAa,mBAAmB,YAAY,YAAY,SAAS,SAAU,YAAW,KAAK,IAAI,GAAG,OAAO,YAAY,WAAW,QAAQ,EAAE,CAAC;KAC1J,YAAW,KAAK,IAAI,GAAG,WAAW,GAAG,UAAU,GAAG,CAAC;UAC/C,IAAI;AACZ,aAAW,KAAK,IAAI,GAAG,OAAO,GAAG,UAAU,EAAE,CAAC;AAC9C,oBAAkB;;CAEnB,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;AACtE,MAAK,KAAK,KAAK;CACf,MAAM,EAAE,cAAc,UAAU,mBAAmB,SAAS,qBAAqB,SAAS,qBAAqB,cAAc,sBAAsB,IAAI,QAAQ,IAAI,SAAS,OAAO;CACnL,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,IAAI;CACJ,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;AAC3E,KAAI,mBAAmB,GAAI,cAAa,eAAe,yBAAyB,IAAI,QAAQ,SAAS,GAAG,UAAU,0BAA0B,gBAAgB,iBAAiB,IAAI,OAAO,QAAQ,MAAM,UAAU,OAAO,IAAI;KACtN,cAAa,eAAe,uBAAuB,IAAI,OAAO;CACnE,MAAM,OAAO,KAAK,IAAI,IAAI,WAAW,GAAG,MAAM,IAAI,CAAC,GAAG;CACtD,MAAM,WAAW,GAAG,YAAY;CAChC,MAAM,kBAAkB,SAAS,WAAW,GAAG,OAAO,GAAG,GAAG;AAC5D,sBAAqB,KAAK;AAC1B,sBAAqB,KAAK;AAC1B,sBAAqB,KAAK,GAAG,cAAc,OAAO,IAAI;AACtD,sBAAqB,KAAK,WAAW,IAAI;AACzC,sBAAqB,KAAK;AAC1B,sBAAqB,KAAK,WAAW,GAAG,SAAS,GAAG;AACpD,sBAAqB,KAAK,WAAW,GAAG,UAAU,EAAE;AACpD,sBAAqB,KAAK,WAAW,GAAG,YAAY,GAAG;AACvD,sBAAqB,KAAK,kBAAkB,IAAI;CAChD,MAAM,gBAAgB,IAAI,SAAS,mBAAmB,qBAAqB;CAC3E,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;AACF,oBAAmB,SAAS,OAAO,YAAY,EAAE,UAAU;EAC1D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,eAAe;IACnC,CAAC;GACF,CAAC;EACF,IAAI,SAAS,eAAe,aAAa,IAAI,QAAQ,SAAS,QAAQ,QAAQ;EAC9E,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU;IACV,EAAE;IACF,SAAS;IACT,UAAU;IACV,CAAC;GACF,CAAC;EACF,CAAC;AACF,qBAAoB,MAAM,QAAQ,WAAW,GAAG,SAAS,EAAE,CAAC;;AAK7D,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-BcJoO4Nm.mjs";
2
+ import "./dist-C1cCW7Bt.mjs";
3
+ import { t as renderers_default } from "./renderer-DEmYyaqj.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-BcJoO4Nm.mjs";
2
2
  import { c as resolveSignalField, n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import { Rn as signalRegistry } from "./dist-CFe1fC9l.mjs";
4
- import { a as createFullscreenPipeline, f as signalTiming, l as fragmentBindGroupLayout, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CU2tEKJJ.mjs";
3
+ import { Rn as signalRegistry } from "./dist-C1cCW7Bt.mjs";
4
+ import { a as createFullscreenPipeline, f as signalTiming, l as fragmentBindGroupLayout, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CMaa63nz.mjs";
5
5
 
6
6
  //#region ../../nodes/node-procedural-vfx/dist/renderers-DiW7Lt7Y.mjs
7
7
  const VFX_SHADER = `
@@ -538,4 +538,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ProceduralVFXWebGPURend
538
538
 
539
539
  //#endregion
540
540
  export { ProceduralVFXWebGPURenderer, renderers_default as default };
541
- //# sourceMappingURL=renderer-CiMIftlS.mjs.map
541
+ //# sourceMappingURL=renderer-DbRZe0Re.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CiMIftlS.mjs","names":[],"sources":["../../../nodes/node-procedural-vfx/dist/renderers-DiW7Lt7Y.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VFX_SHADER = `\nstruct VFXUniforms {\n effectType : f32,\n outputType : f32,\n time : f32,\n _pad0 : f32,\n\n density : f32,\n scale : f32,\n speed : f32,\n intensity : f32,\n\n seed : f32,\n hasSigDensity : f32,\n hasSigScale : f32,\n hasSigSpeed : f32,\n\n hasSigIntensity : f32,\n hasSigSeed : f32,\n _pad1 : f32,\n _pad2 : f32,\n\n colorStart : vec4<f32>,\n colorEnd : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : VFXUniforms;\n\n@group(1) @binding(0) var densityTex : texture_2d<f32>;\n@group(1) @binding(1) var scaleTex : texture_2d<f32>;\n@group(1) @binding(2) var speedTex : texture_2d<f32>;\n@group(1) @binding(3) var intensityTex : texture_2d<f32>;\n@group(1) @binding(4) var seedTex : texture_2d<f32>;\n@group(1) @binding(5) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// ---- hashing & noise primitives -------------------------------------------\nfn hash21(p: vec2<f32>) -> vec2<f32> {\n let p3 = fract(vec3<f32>(p.xyx) * vec3<f32>(0.1031, 0.1030, 0.0973));\n let p4 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p4.xx + p4.yz) * p4.zy);\n}\n\nfn hash1(n: f32) -> f32 {\n return fract(sin(n) * 43758.5453);\n}\n\nfn valueNoise(p: vec2<f32>) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = hash1(dot(i, vec2<f32>(127.1, 311.7)));\n let b = hash1(dot(i + vec2<f32>(1.0, 0.0), vec2<f32>(127.1, 311.7)));\n let c = hash1(dot(i + vec2<f32>(0.0, 1.0), vec2<f32>(127.1, 311.7)));\n let d = hash1(dot(i + vec2<f32>(1.0, 1.0), vec2<f32>(127.1, 311.7)));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn fbm(p: vec2<f32>, octaves: i32) -> f32 {\n var value = 0.0;\n var amp = 0.5;\n var freq = 1.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * valueNoise(p * freq);\n freq *= 2.0;\n amp *= 0.5;\n }\n return value;\n}\n\nfn get_field(val: f32, hasSig: f32, tex: texture_2d<f32>, samp: sampler) -> f32 {\n if (hasSig > 0.5) {\n return textureSampleLevel(tex, samp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n return val;\n}\n\n// ---- effect synthesizers (return straight-alpha RGBA) ----------------------\nfn fxSmoke(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let sp = p * scl;\n // Domain-warped FBM gives structured puffs instead of a solid fill.\n let q = vec2<f32>(fbm(sp + time * 0.10, 4), fbm(sp + vec2<f32>(5.2, 1.3) + time * 0.08, 4));\n let f = fbm(sp + 4.0 * q + vec2<f32>(1.7, 9.2) + time * 0.05, 4); // ~[0, 0.94]\n // Billowing plume: denser at the base (bottom, p.y=0), dissipating toward the top.\n let vgrad = 1.0 - smoothstep(0.45, 0.9, p.y);\n let n = f * 2.0 - 1.0; // remap to [-1, 1]\n // Thresholded so only bright fbm patches are opaque -> reads as puffs, not solid.\n let cov = smoothstep(0.28, 0.6, n) * dens * (0.25 + 0.75 * vgrad);\n let alpha = cov * inten;\n let col = mix(cB * 0.35, cA, clamp(f + vgrad * 0.5, 0.0, 1.0));\n return vec4<f32>(col, clamp(alpha, 0.0, 1.0));\n}\n\nfn fxFire(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let pn = vec2<f32>(p.x * 1.5, p.y) * scl;\n let n = fbm(pn * 6.0 + vec2<f32>(time * 2.0, time * 3.0), 4);\n // Heat concentrated near base, flickering upward\n let heat = n * smoothstep(1.0, 0.0 + (1.0 - dens) * 0.3, p.y);\n // Channeled vertical columns\n let columns = smoothstep(0.45, 0.9, n + 0.4 * sin(p.x * (20.0 + 40.0 * dens) * scl + time * 8.0));\n let d = clamp(heat * inten + columns * 0.3 * inten, 0.0, 1.0);\n // Fire color ramp mapped dynamically to cA and cB\n let dark = cB * 0.15;\n let orange = cB;\n let yellow = mix(cB, cA, 0.5);\n let white = cA;\n var col = mix(dark, orange, smoothstep(0.0, 0.4, d));\n col = mix(col, yellow, smoothstep(0.4, 0.75, d));\n col = mix(col, white, smoothstep(0.75, 1.0, d));\n let alpha = smoothstep(0.0, 0.3, d) * inten;\n return vec4<f32>(col, clamp(alpha, 0.0, 1.0));\n}\n\nfn fxRain(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (60.0 * dens + 4.0) * scl;\n let gx = floor(p.x * n);\n let h = hash1(gx);\n let speed = 0.8 + h;\n let yFrac = fract(p.y * 8.0 - time * speed);\n let dropY = abs(yFrac - 0.5);\n let reveal = step(0.35, yFrac);\n let st = smoothstep(0.18, 0.02, dropY);\n let d = st * reveal;\n let g = smoothstep(0.18, 0.02, abs(fract(p.x * n) + h * 0.2 - 0.5));\n let a = d * g * inten;\n let col = mix(cA, cB, h);\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxSnow(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (50.0 * dens + 6.0) * scl;\n let cell = floor(p * n);\n let f = fract(p * n);\n let h = hash21(cell);\n let center = vec2<f32>(0.5, 0.5) + 0.3 * hash21(cell + 7.0);\n let sway = 0.1 * sin(time * 1.2 + cell.y * 3.0);\n // Fall downward (toward p.y=0, the bottom): subtract an advancing phase.\n let fall = fract(time * (0.25 + 0.45 * h.y) + h.x);\n let pos = vec2<f32>(f.x - center.x - sway, f.y - center.y) - vec2<f32>(0.0, fall);\n let d = length(pos);\n let size = 0.05 + 0.07 * h.x;\n let a = smoothstep(size, size * 0.4, d) * inten;\n let col = mix(cA, cB, h.x);\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxDust(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (90.0 * dens + 6.0) * scl;\n let cell = floor(p * n);\n let f = fract(p * n);\n let h = hash21(cell);\n let center = h;\n let drift = fract(time * 0.05 * (0.5 + h.y) + cell.x * 0.01);\n let pos = vec2<f32>(f.x - center.x, f.y - center.y) + vec2<f32>((drift - 0.5) * 0.03, 0.0);\n let d = length(pos);\n let a = smoothstep(0.12, 0.0, d) * smoothstep(0.0, 0.3, dens) * inten * 0.6;\n let col = mix(cA, cB, h.y);\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxEmbers(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (50.0 * dens + 4.0) * scl;\n let cell = floor(p * n);\n let f = fract(p * n);\n let h = hash21(cell);\n let sway = 0.12 * sin(time * 2.0 + cell.y * 2.0);\n let rise = fract(time * 0.18 * (0.7 + h.y) + cell.y * 0.12);\n // Rising: as rise grows, move toward p.y=1 (top).\n let pos = vec2<f32>(f.x - 0.5 - sway, f.y + rise * 1.2);\n let d = length(pos);\n let a = smoothstep(0.12, 0.0, d) * (1.0 - rise) * inten;\n let col = mix(cA, cB, clamp(rise, 0.0, 1.0));\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxSparks(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n // Burst radiating from a low-center source; travel grows over time so it expands outward.\n let src = vec2<f32>(0.5, 0.15);\n let dir = p - src;\n let dist = length(dir);\n let ang = atan2(dir.y, dir.x);\n let n = (20.0 * dens + 5.0) * scl;\n let seg = floor(ang * n);\n let tFrame = floor(time * 3.0);\n let timeVal = tFrame - 10000.0 * floor(tFrame / 10000.0);\n let h = hash1(seg + timeVal * 97.0);\n let launch = fract(0.5 + h + time * 0.5);\n let travel = launch * 0.8;\n let trail = smoothstep(0.9, 0.4, dist - travel);\n let w = 0.02 + 0.02 * h;\n let blast = smoothstep(0.0, w * 2.0, dist - travel) * trail;\n let streak = smoothstep(w, 0.0, abs(dist - travel)) * trail;\n let a = clamp(max(streak, blast * 0.4), 0.0, 1.0) * inten;\n let col = mix(cA, cB, clamp(h, 0.0, 1.0));\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxMagic(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let center = vec2<f32>(0.5, 0.5);\n let dv = p - center;\n let r = length(dv);\n let ang = atan2(dv.y, dv.x);\n let swirl = fbm(vec2<f32>(r * 8.0 * scl + time * 0.5, ang * 3.0 + time * 0.8), 4);\n let halo = smoothstep(0.5, 0.1, r) * 0.4 * dens;\n let wisp = smoothstep(1.0 - dens * 0.8, 1.5 - dens * 0.8, swirl) * (0.5 + 0.5 * sin(r * 20.0 * scl - time * 3.0));\n let a = clamp((halo + wisp * 0.8) * inten, 0.0, 1.0);\n let col = mix(cA, cB, clamp(swirl, 0.0, 1.0));\n return vec4<f32>(col * 0.8 + vec3<f32>(1.0) * halo * 0.4, a);\n}\n\nfn fxLensFlare(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let center = vec2<f32>(0.5, 0.5);\n let dv = p - center;\n let r = length(dv) * scl;\n let ang = atan2(dv.y, dv.x);\n // Radial streak\n let streakCount = 2.0 * floor(1.0 + dens * 3.0);\n let streak = smoothstep(0.35, 0.6, fract(ang / 3.14159 * streakCount + 0.5)) * pow(1.0 - r, 3.0);\n // Concentric halos / chromatic rings\n let rings = (0.5 + 0.5 * sin(r * 40.0 - time * 2.0)) * dens;\n let core = smoothstep(0.25, 0.0, r);\n let chroma = mix(cA, cB, 0.5 + 0.5 * cos(ang * 3.0 + r * 30.0));\n let a = clamp((core * 0.9 + streak * 0.5 * dens + rings * 0.15 * (1.0 - r)) * inten, 0.0, 1.0);\n return vec4<f32>(chroma, a);\n}\n\nfn fxLightning(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n // Periodic bolt striking vertically, flickering briefly\n let period = mix(4.0, 0.6, clamp(dens, 0.0, 1.0));\n let cycle = fract(time / period);\n let flashWindow = mix(0.05, 0.35, clamp(dens, 0.0, 1.0));\n let flash = smoothstep(flashWindow, 0.0, cycle);\n \n let tFlicker = floor(time * 60.0);\n let flickerVal = tFlicker - 10000.0 * floor(tFlicker / 10000.0);\n let flicker = step(hash1(flickerVal * 1.7), 0.8); // rapid on/off shimmer\n\n // Jitter a vertical bolt with per-row hashes and interpolate between rows\n let rows = 18.0 * scl;\n let rg = p.y * rows;\n let row = floor(rg);\n let fr = fract(rg);\n \n let tLightning = floor(time * 24.0);\n let lightningVal = tLightning - 10000.0 * floor(tLightning / 10000.0);\n let x0 = 0.3 + 0.4 * hash1(row * 13.7 + lightningVal * 3.1);\n let x1 = 0.3 + 0.4 * hash1((row + 1.0) * 13.7 + lightningVal * 3.1);\n let boltX = mix(x0, x1, fr);\n\n // Secondary tiny forks\n let forkDrift = (hash1(row * 7.3) - 0.5) * 0.12 * smoothstep(0.0, 0.6, 1.0 - p.y);\n let boltDist = abs(p.x - (boltX + forkDrift)) * scl;\n let core = smoothstep(0.012, 0.0, boltDist);\n let glow = smoothstep(0.07, 0.0, boltDist) * 0.5;\n let a = clamp((core + glow) * flash * flicker * inten, 0.0, 1.0);\n let col = mix(cA, cB, clamp(boltDist * 8.0, 0.0, 1.0) + 0.3 * flash);\n // Soft ambient flash behind the bolt\n let amb = smoothstep(0.35, 0.0, length(p - vec2<f32>(boltX, p.y)) * scl) * flash * 0.15;\n return vec4<f32>(col * (1.0 + amb), clamp(a + amb, 0.0, 1.0));\n}\n\nfn fxEnergyBeam(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let src = vec2<f32>(0.15, 0.5);\n let dirv = vec2<f32>(1.0, 0.0);\n let w = p - src;\n let along = dot(w, dirv) * scl;\n let perp = dot(w, vec2<f32>(-dirv.y, dirv.x)) * scl;\n let beamWidth = 0.01 + 0.03 * dens;\n let glowWidth = 0.05 + 0.1 * dens;\n let core = smoothstep(beamWidth, 0.0, abs(perp));\n let glow = smoothstep(glowWidth, 0.0, abs(perp)) * 0.4 * dens;\n let falloff = smoothstep(0.0, 1.0, along);\n let pulse = 0.7 + 0.3 * sin(along * 30.0 - time * 10.0);\n let a = clamp((core + glow) * falloff * pulse * inten, 0.0, 1.0);\n let col = mix(cA, cB, clamp(along, 0.0, 1.0));\n return vec4<f32>(col * (1.0 + glow * 2.0), a);\n}\n\nfn fxAurora(p: vec2<f32>, seedOff: f32, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n // Northern lights: curtains hanging from a wavy band across the upper sky,\n // rippling sideways, with fine vertical rays. cA at the base, cB at the top.\n var acc = vec3<f32>(0.0);\n var keep = 1.0;\n for (var k = 0; k < 3; k++) {\n let fk = f32(k);\n let x = p.x * (1.0 + fk * 0.35) * scl * 1.5 + seedOff * 13.0 + fk * 3.1;\n // Curtain base line, a slow wave across the frame.\n let base = 0.42 + fk * 0.06 + 0.12 * (fbm(vec2<f32>(x * 1.3, time * 0.05 + fk), 3) - 0.5)\n + 0.05 * sin(x * 4.0 + time * 0.3 + fk);\n let h = 0.38 + 0.2 * fbm(vec2<f32>(x * 2.0 + 7.0, time * 0.04), 3);\n let d = base - p.y; // 0 at the base, rising upward\n let body = smoothstep(-0.06, 0.035, d) * pow(1.0 - smoothstep(0.0, h, d), 1.5);\n // Vertical rays drifting sideways.\n let rn = fbm(vec2<f32>(x * 40.0 + time * 0.3, d * 2.0 - time * 0.1), 3);\n let rays = 0.25 + 1.2 * rn * rn;\n let fold = 0.6 + 0.4 * sin(x * 9.0 + time * 0.5 + fbm(vec2<f32>(x * 3.0, time * 0.1), 2) * 6.0);\n let a = body * rays * fold * (1.0 - fk * 0.25);\n let col = mix(cA, cB, clamp(d / max(h, 1e-3), 0.0, 1.0));\n acc += col * a;\n keep *= 1.0 - clamp(a, 0.0, 1.0);\n }\n let alpha = 1.0 - keep;\n let a = clamp(alpha * (0.35 + 0.65 * dens) * inten * 1.4, 0.0, 1.0);\n return vec4<f32>(acc / max(alpha, 1e-3) * min(alpha * 2.0, 1.0), a);\n}\n\n// ---- main dispatch ---------------------------------------------------------\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let density = get_field(u.density, u.hasSigDensity, densityTex, signalSamp);\n let scale = get_field(u.scale, u.hasSigScale, scaleTex, signalSamp);\n let speed = get_field(u.speed, u.hasSigSpeed, speedTex, signalSamp);\n let intensity = get_field(u.intensity, u.hasSigIntensity, intensityTex, signalSamp);\n let seed = get_field(u.seed, u.hasSigSeed, seedTex, signalSamp);\n\n let isVideo = u.outputType > 0.5;\n let time = select(0.0, u.time * max(speed, 1e-4), isVideo);\n let seedOff = fract(seed * 1.618033);\n\n // Aspect correction\n let uv = in.uv;\n let p = vec2<f32>(uv.x, uv.y);\n\n // Move to a seed-scrambled space so different seeds look different\n let sp = p + vec2<f32>(seedOff * 17.0, seedOff * 31.0);\n\n var eff = vec4<f32>(0.0, 0.0, 0.0, 0.0);\n let cA = u.colorStart.rgb;\n let cB = u.colorEnd.rgb;\n let scl = max(scale, 1e-4);\n let factor = scl * 100.0;\n\n if (u.effectType < 0.5) {\n eff = fxSmoke(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 1.5) {\n eff = fxFire(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 2.5) {\n eff = fxRain(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 3.5) {\n eff = fxSparks(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 4.5) {\n eff = fxSnow(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 5.5) {\n eff = fxDust(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 6.5) {\n eff = fxLightning(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 7.5) {\n eff = fxMagic(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 8.5) {\n eff = fxLensFlare(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 9.5) {\n eff = fxEmbers(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 10.5) {\n eff = fxEnergyBeam(sp, time, factor, density, intensity, cA, cB);\n } else {\n eff = fxAurora(p, seedOff, time, factor, density, intensity, cA, cB);\n }\n\n // Straight alpha is fine for compositing onto a transparent canvas.\n let a = clamp(eff.a, 0.0, 1.0);\n return vec4<f32>(clamp(eff.rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * a, a);\n}\n`;\nconst vfxUniformData = new Float32Array(24);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsignalsLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getVFXResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `procedural_vfx_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vfxModule = device.createShaderModule({\n\t\t\tlabel: `procedural_vfx_${format}.wgsl`,\n\t\t\tcode: VFX_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ProceduralVFXPipeline_${format}`,\n\t\t\tmodule: vfxModule,\n\t\t\tlayouts: [layouts.uniformLayout, layouts.signalsLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tvfxPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsignalsLayout: layouts.signalsLayout\n\t};\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = h.split(\"\").map((c) => c + c).join(\"\");\n\tconst r = parseInt(h.substring(0, 2), 16) / 255;\n\tconst g = parseInt(h.substring(2, 4), 16) / 255;\n\tconst b = parseInt(h.substring(4, 6), 16) / 255;\n\tlet a = 1;\n\tif (h.length === 8) a = parseInt(h.substring(6, 8), 16) / 255;\n\treturn [\n\t\tr,\n\t\tg,\n\t\tb,\n\t\ta\n\t];\n}\nconst VFX_EFFECT_INDEX = {\n\tSmoke: 0,\n\tFire: 1,\n\tRain: 2,\n\tSparks: 3,\n\tSnow: 4,\n\tDust: 5,\n\tLightning: 6,\n\tMagic: 7,\n\tLensFlare: 8,\n\tEmbers: 9,\n\tEnergyBeam: 10,\n\tAurora: 11\n};\nconst ProceduralVFXWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ProceduralVFX\" || !op) return;\n\tconst { vfxPipeline: pipeline, uniformLayout: uLayout, signalsLayout: sigLayout } = getVFXResources(ctx.device, ctx.renderer.format);\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst densityInfo = resolveSignalField(op, \"density\", .6);\n\tconst scaleInfo = resolveSignalField(op, \"scale\", .01);\n\tconst speedInfo = resolveSignalField(op, \"speed\", 1);\n\tconst intensityInfo = resolveSignalField(op, \"intensity\", .8);\n\tconst seedInfo = resolveSignalField(op, \"seed\", 1234);\n\tconst effectIndex = VFX_EFFECT_INDEX[op.effectType ?? \"Smoke\"] ?? 0;\n\tconst outputTypeVal = op.outputType === \"Video\" ? 1 : 0;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst colorStartVal = hexToRgba(op.colorStart ?? \"#ffffff\");\n\tconst colorEndVal = hexToRgba(op.colorEnd ?? \"#ff5500\");\n\tvfxUniformData[0] = effectIndex;\n\tvfxUniformData[1] = outputTypeVal;\n\tvfxUniformData[2] = elapsedSeconds;\n\tvfxUniformData[3] = 0;\n\tvfxUniformData[4] = densityInfo.value;\n\tvfxUniformData[5] = scaleInfo.value;\n\tvfxUniformData[6] = speedInfo.value;\n\tvfxUniformData[7] = intensityInfo.value;\n\tvfxUniformData[8] = seedInfo.value;\n\tvfxUniformData[9] = densityInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[10] = scaleInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[11] = speedInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[12] = intensityInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[13] = seedInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[14] = 0;\n\tvfxUniformData[15] = 0;\n\tvfxUniformData[16] = colorStartVal[0];\n\tvfxUniformData[17] = colorStartVal[1];\n\tvfxUniformData[18] = colorStartVal[2];\n\tvfxUniformData[19] = colorStartVal[3];\n\tvfxUniformData[20] = colorEndVal[0];\n\tvfxUniformData[21] = colorEndVal[1];\n\tvfxUniformData[22] = colorEndVal[2];\n\tvfxUniformData[23] = colorEndVal[3];\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vfxUniformData);\n\tconst signalFields = [\n\t\t{\n\t\t\tname: \"density\",\n\t\t\tinfo: densityInfo\n\t\t},\n\t\t{\n\t\t\tname: \"scale\",\n\t\t\tinfo: scaleInfo\n\t\t},\n\t\t{\n\t\t\tname: \"speed\",\n\t\t\tinfo: speedInfo\n\t\t},\n\t\t{\n\t\t\tname: \"intensity\",\n\t\t\tinfo: intensityInfo\n\t\t},\n\t\t{\n\t\t\tname: \"seed\",\n\t\t\tinfo: seedInfo\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tfor (const f of signalFields) if (!!(f.info.hasSignal && f.info.sd)) {\n\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd?.nodeId ?? `procedural_vfx_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, targetWidth, targetHeight, props.renderId, frame, fps);\n\t\tsignalViews.push(view);\n\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tpass.setBindGroup(1, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalViews[0]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: signalViews[1]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: signalViews[2]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: signalViews[3]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: signalViews[4]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\tpass.draw(4);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ProceduralVFXWebGPURenderer });\n\n//#endregion\nexport { ProceduralVFXWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DiW7Lt7Y.mjs.map"],"mappings":";;;;;;AAMA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkCjB,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyUvB,MAAM,iBAAiB,IAAI,aAAa,GAAG;AAC3C,MAAM,mBAAmB,WAAW,YAAY;CAC/C,eAAe,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAC3D,eAAe,eAAe,QAAQ,EAAE;CACxC,+BAA+B,IAAI,KAAK;CACxC,EAAE;AACH,SAAS,gBAAgB,QAAQ,QAAQ;CACxC,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,WAAW,kBAAkB;CACnC,IAAI,WAAW,QAAQ,cAAc,IAAI,SAAS;AAClD,KAAI,CAAC,UAAU;EACd,MAAM,YAAY,OAAO,mBAAmB;GAC3C,OAAO,kBAAkB,OAAO;GAChC,MAAM;GACN,CAAC;AACF,aAAW,yBAAyB,QAAQ;GAC3C,OAAO,yBAAyB;GAChC,QAAQ;GACR,SAAS,CAAC,QAAQ,eAAe,QAAQ,cAAc;GACvD;GACA,CAAC;AACF,UAAQ,cAAc,IAAI,UAAU,SAAS;;AAE9C,QAAO;EACN,aAAa;EACb,eAAe,QAAQ;EACvB,eAAe,QAAQ;EACvB;;AAEF,SAAS,UAAU,KAAK;CACvB,IAAI,IAAI,IAAI,QAAQ,KAAK,GAAG;AAC5B,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,KAAI,EAAE,MAAM,GAAG,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,GAAG;CAChF,MAAM,IAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;CAC5C,MAAM,IAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;CAC5C,MAAM,IAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;CAC5C,IAAI,IAAI;AACR,KAAI,EAAE,WAAW,EAAG,KAAI,SAAS,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,GAAG;AAC1D,QAAO;EACN;EACA;EACA;EACA;EACA;;AAEF,MAAM,mBAAmB;CACxB,OAAO;CACP,MAAM;CACN,MAAM;CACN,QAAQ;CACR,MAAM;CACN,MAAM;CACN,WAAW;CACX,OAAO;CACP,WAAW;CACX,QAAQ;CACR,YAAY;CACZ,QAAQ;CACR;AACD,MAAM,8BAA8B,OAAO,SAAS;CACnD,MAAM,EAAE,KAAK,SAAS,MAAM,aAAa,cAAc,UAAU;CACjE,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,mBAAmB,CAAC,GAAI;CACvC,MAAM,EAAE,aAAa,UAAU,eAAe,SAAS,eAAe,cAAc,gBAAgB,IAAI,QAAQ,IAAI,SAAS,OAAO;CACpI,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,cAAc,mBAAmB,IAAI,WAAW,GAAG;CACzD,MAAM,YAAY,mBAAmB,IAAI,SAAS,IAAI;CACtD,MAAM,YAAY,mBAAmB,IAAI,SAAS,EAAE;CACpD,MAAM,gBAAgB,mBAAmB,IAAI,aAAa,GAAG;CAC7D,MAAM,WAAW,mBAAmB,IAAI,QAAQ,KAAK;CACrD,MAAM,cAAc,iBAAiB,GAAG,cAAc,YAAY;CAClE,MAAM,gBAAgB,GAAG,eAAe,UAAU,IAAI;CACtD,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;CAC3E,MAAM,gBAAgB,UAAU,GAAG,cAAc,UAAU;CAC3D,MAAM,cAAc,UAAU,GAAG,YAAY,UAAU;AACvD,gBAAe,KAAK;AACpB,gBAAe,KAAK;AACpB,gBAAe,KAAK;AACpB,gBAAe,KAAK;AACpB,gBAAe,KAAK,YAAY;AAChC,gBAAe,KAAK,UAAU;AAC9B,gBAAe,KAAK,UAAU;AAC9B,gBAAe,KAAK,cAAc;AAClC,gBAAe,KAAK,SAAS;AAC7B,gBAAe,KAAK,YAAY,YAAY,IAAI;AAChD,gBAAe,MAAM,UAAU,YAAY,IAAI;AAC/C,gBAAe,MAAM,UAAU,YAAY,IAAI;AAC/C,gBAAe,MAAM,cAAc,YAAY,IAAI;AACnD,gBAAe,MAAM,SAAS,YAAY,IAAI;AAC9C,gBAAe,MAAM;AACrB,gBAAe,MAAM;AACrB,gBAAe,MAAM,cAAc;AACnC,gBAAe,MAAM,cAAc;AACnC,gBAAe,MAAM,cAAc;AACnC,gBAAe,MAAM,cAAc;AACnC,gBAAe,MAAM,YAAY;AACjC,gBAAe,MAAM,YAAY;AACjC,gBAAe,MAAM,YAAY;AACjC,gBAAe,MAAM,YAAY;CACjC,MAAM,gBAAgB,IAAI,SAAS,mBAAmB,eAAe;CACrE,MAAM,eAAe;EACpB;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;GACC,MAAM;GACN,MAAM;GACN;EACD;CACD,MAAM,cAAc,EAAE;CACtB,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;AAChE,MAAK,MAAM,KAAK,aAAc,KAAI,CAAC,EAAE,EAAE,KAAK,aAAa,EAAE,KAAK,KAAK;EACpE,MAAM,OAAO,eAAe,yBAAyB,IAAI,QAAQ,SAAS,EAAE,KAAK,IAAI,UAAU,kBAAkB,EAAE,KAAK,OAAO,gBAAgB,iBAAiB,EAAE,KAAK,IAAI,aAAa,cAAc,MAAM,UAAU,OAAO,IAAI;AACjO,cAAY,KAAK,KAAK;OAChB,aAAY,KAAK,eAAe,uBAAuB,IAAI,OAAO,CAAC;AAC1E,MAAK,YAAY,SAAS;AAC1B,MAAK,aAAa,GAAG,IAAI,OAAO,gBAAgB;EAC/C,QAAQ;EACR,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ,eAAe;GACnC,CAAC;EACF,CAAC,CAAC;AACH,MAAK,aAAa,GAAG,IAAI,OAAO,gBAAgB;EAC/C,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU,YAAY;IACtB;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;EACD,CAAC,CAAC;AACH,MAAK,KAAK,EAAE;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,6BAA6B,CAAC"}
1
+ {"version":3,"file":"renderer-DbRZe0Re.mjs","names":[],"sources":["../../../nodes/node-procedural-vfx/dist/renderers-DiW7Lt7Y.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VFX_SHADER = `\nstruct VFXUniforms {\n effectType : f32,\n outputType : f32,\n time : f32,\n _pad0 : f32,\n\n density : f32,\n scale : f32,\n speed : f32,\n intensity : f32,\n\n seed : f32,\n hasSigDensity : f32,\n hasSigScale : f32,\n hasSigSpeed : f32,\n\n hasSigIntensity : f32,\n hasSigSeed : f32,\n _pad1 : f32,\n _pad2 : f32,\n\n colorStart : vec4<f32>,\n colorEnd : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : VFXUniforms;\n\n@group(1) @binding(0) var densityTex : texture_2d<f32>;\n@group(1) @binding(1) var scaleTex : texture_2d<f32>;\n@group(1) @binding(2) var speedTex : texture_2d<f32>;\n@group(1) @binding(3) var intensityTex : texture_2d<f32>;\n@group(1) @binding(4) var seedTex : texture_2d<f32>;\n@group(1) @binding(5) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// ---- hashing & noise primitives -------------------------------------------\nfn hash21(p: vec2<f32>) -> vec2<f32> {\n let p3 = fract(vec3<f32>(p.xyx) * vec3<f32>(0.1031, 0.1030, 0.0973));\n let p4 = p3 + dot(p3, p3.yzx + 33.33);\n return fract((p4.xx + p4.yz) * p4.zy);\n}\n\nfn hash1(n: f32) -> f32 {\n return fract(sin(n) * 43758.5453);\n}\n\nfn valueNoise(p: vec2<f32>) -> f32 {\n let i = floor(p);\n let f = fract(p);\n let u = f * f * (3.0 - 2.0 * f);\n let a = hash1(dot(i, vec2<f32>(127.1, 311.7)));\n let b = hash1(dot(i + vec2<f32>(1.0, 0.0), vec2<f32>(127.1, 311.7)));\n let c = hash1(dot(i + vec2<f32>(0.0, 1.0), vec2<f32>(127.1, 311.7)));\n let d = hash1(dot(i + vec2<f32>(1.0, 1.0), vec2<f32>(127.1, 311.7)));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfn fbm(p: vec2<f32>, octaves: i32) -> f32 {\n var value = 0.0;\n var amp = 0.5;\n var freq = 1.0;\n for (var i = 0; i < 8; i++) {\n if (i >= octaves) { break; }\n value += amp * valueNoise(p * freq);\n freq *= 2.0;\n amp *= 0.5;\n }\n return value;\n}\n\nfn get_field(val: f32, hasSig: f32, tex: texture_2d<f32>, samp: sampler) -> f32 {\n if (hasSig > 0.5) {\n return textureSampleLevel(tex, samp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n return val;\n}\n\n// ---- effect synthesizers (return straight-alpha RGBA) ----------------------\nfn fxSmoke(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let sp = p * scl;\n // Domain-warped FBM gives structured puffs instead of a solid fill.\n let q = vec2<f32>(fbm(sp + time * 0.10, 4), fbm(sp + vec2<f32>(5.2, 1.3) + time * 0.08, 4));\n let f = fbm(sp + 4.0 * q + vec2<f32>(1.7, 9.2) + time * 0.05, 4); // ~[0, 0.94]\n // Billowing plume: denser at the base (bottom, p.y=0), dissipating toward the top.\n let vgrad = 1.0 - smoothstep(0.45, 0.9, p.y);\n let n = f * 2.0 - 1.0; // remap to [-1, 1]\n // Thresholded so only bright fbm patches are opaque -> reads as puffs, not solid.\n let cov = smoothstep(0.28, 0.6, n) * dens * (0.25 + 0.75 * vgrad);\n let alpha = cov * inten;\n let col = mix(cB * 0.35, cA, clamp(f + vgrad * 0.5, 0.0, 1.0));\n return vec4<f32>(col, clamp(alpha, 0.0, 1.0));\n}\n\nfn fxFire(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let pn = vec2<f32>(p.x * 1.5, p.y) * scl;\n let n = fbm(pn * 6.0 + vec2<f32>(time * 2.0, time * 3.0), 4);\n // Heat concentrated near base, flickering upward\n let heat = n * smoothstep(1.0, 0.0 + (1.0 - dens) * 0.3, p.y);\n // Channeled vertical columns\n let columns = smoothstep(0.45, 0.9, n + 0.4 * sin(p.x * (20.0 + 40.0 * dens) * scl + time * 8.0));\n let d = clamp(heat * inten + columns * 0.3 * inten, 0.0, 1.0);\n // Fire color ramp mapped dynamically to cA and cB\n let dark = cB * 0.15;\n let orange = cB;\n let yellow = mix(cB, cA, 0.5);\n let white = cA;\n var col = mix(dark, orange, smoothstep(0.0, 0.4, d));\n col = mix(col, yellow, smoothstep(0.4, 0.75, d));\n col = mix(col, white, smoothstep(0.75, 1.0, d));\n let alpha = smoothstep(0.0, 0.3, d) * inten;\n return vec4<f32>(col, clamp(alpha, 0.0, 1.0));\n}\n\nfn fxRain(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (60.0 * dens + 4.0) * scl;\n let gx = floor(p.x * n);\n let h = hash1(gx);\n let speed = 0.8 + h;\n let yFrac = fract(p.y * 8.0 - time * speed);\n let dropY = abs(yFrac - 0.5);\n let reveal = step(0.35, yFrac);\n let st = smoothstep(0.18, 0.02, dropY);\n let d = st * reveal;\n let g = smoothstep(0.18, 0.02, abs(fract(p.x * n) + h * 0.2 - 0.5));\n let a = d * g * inten;\n let col = mix(cA, cB, h);\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxSnow(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (50.0 * dens + 6.0) * scl;\n let cell = floor(p * n);\n let f = fract(p * n);\n let h = hash21(cell);\n let center = vec2<f32>(0.5, 0.5) + 0.3 * hash21(cell + 7.0);\n let sway = 0.1 * sin(time * 1.2 + cell.y * 3.0);\n // Fall downward (toward p.y=0, the bottom): subtract an advancing phase.\n let fall = fract(time * (0.25 + 0.45 * h.y) + h.x);\n let pos = vec2<f32>(f.x - center.x - sway, f.y - center.y) - vec2<f32>(0.0, fall);\n let d = length(pos);\n let size = 0.05 + 0.07 * h.x;\n let a = smoothstep(size, size * 0.4, d) * inten;\n let col = mix(cA, cB, h.x);\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxDust(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (90.0 * dens + 6.0) * scl;\n let cell = floor(p * n);\n let f = fract(p * n);\n let h = hash21(cell);\n let center = h;\n let drift = fract(time * 0.05 * (0.5 + h.y) + cell.x * 0.01);\n let pos = vec2<f32>(f.x - center.x, f.y - center.y) + vec2<f32>((drift - 0.5) * 0.03, 0.0);\n let d = length(pos);\n let a = smoothstep(0.12, 0.0, d) * smoothstep(0.0, 0.3, dens) * inten * 0.6;\n let col = mix(cA, cB, h.y);\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxEmbers(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let n = (50.0 * dens + 4.0) * scl;\n let cell = floor(p * n);\n let f = fract(p * n);\n let h = hash21(cell);\n let sway = 0.12 * sin(time * 2.0 + cell.y * 2.0);\n let rise = fract(time * 0.18 * (0.7 + h.y) + cell.y * 0.12);\n // Rising: as rise grows, move toward p.y=1 (top).\n let pos = vec2<f32>(f.x - 0.5 - sway, f.y + rise * 1.2);\n let d = length(pos);\n let a = smoothstep(0.12, 0.0, d) * (1.0 - rise) * inten;\n let col = mix(cA, cB, clamp(rise, 0.0, 1.0));\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxSparks(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n // Burst radiating from a low-center source; travel grows over time so it expands outward.\n let src = vec2<f32>(0.5, 0.15);\n let dir = p - src;\n let dist = length(dir);\n let ang = atan2(dir.y, dir.x);\n let n = (20.0 * dens + 5.0) * scl;\n let seg = floor(ang * n);\n let tFrame = floor(time * 3.0);\n let timeVal = tFrame - 10000.0 * floor(tFrame / 10000.0);\n let h = hash1(seg + timeVal * 97.0);\n let launch = fract(0.5 + h + time * 0.5);\n let travel = launch * 0.8;\n let trail = smoothstep(0.9, 0.4, dist - travel);\n let w = 0.02 + 0.02 * h;\n let blast = smoothstep(0.0, w * 2.0, dist - travel) * trail;\n let streak = smoothstep(w, 0.0, abs(dist - travel)) * trail;\n let a = clamp(max(streak, blast * 0.4), 0.0, 1.0) * inten;\n let col = mix(cA, cB, clamp(h, 0.0, 1.0));\n return vec4<f32>(col, clamp(a, 0.0, 1.0));\n}\n\nfn fxMagic(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let center = vec2<f32>(0.5, 0.5);\n let dv = p - center;\n let r = length(dv);\n let ang = atan2(dv.y, dv.x);\n let swirl = fbm(vec2<f32>(r * 8.0 * scl + time * 0.5, ang * 3.0 + time * 0.8), 4);\n let halo = smoothstep(0.5, 0.1, r) * 0.4 * dens;\n let wisp = smoothstep(1.0 - dens * 0.8, 1.5 - dens * 0.8, swirl) * (0.5 + 0.5 * sin(r * 20.0 * scl - time * 3.0));\n let a = clamp((halo + wisp * 0.8) * inten, 0.0, 1.0);\n let col = mix(cA, cB, clamp(swirl, 0.0, 1.0));\n return vec4<f32>(col * 0.8 + vec3<f32>(1.0) * halo * 0.4, a);\n}\n\nfn fxLensFlare(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let center = vec2<f32>(0.5, 0.5);\n let dv = p - center;\n let r = length(dv) * scl;\n let ang = atan2(dv.y, dv.x);\n // Radial streak\n let streakCount = 2.0 * floor(1.0 + dens * 3.0);\n let streak = smoothstep(0.35, 0.6, fract(ang / 3.14159 * streakCount + 0.5)) * pow(1.0 - r, 3.0);\n // Concentric halos / chromatic rings\n let rings = (0.5 + 0.5 * sin(r * 40.0 - time * 2.0)) * dens;\n let core = smoothstep(0.25, 0.0, r);\n let chroma = mix(cA, cB, 0.5 + 0.5 * cos(ang * 3.0 + r * 30.0));\n let a = clamp((core * 0.9 + streak * 0.5 * dens + rings * 0.15 * (1.0 - r)) * inten, 0.0, 1.0);\n return vec4<f32>(chroma, a);\n}\n\nfn fxLightning(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n // Periodic bolt striking vertically, flickering briefly\n let period = mix(4.0, 0.6, clamp(dens, 0.0, 1.0));\n let cycle = fract(time / period);\n let flashWindow = mix(0.05, 0.35, clamp(dens, 0.0, 1.0));\n let flash = smoothstep(flashWindow, 0.0, cycle);\n \n let tFlicker = floor(time * 60.0);\n let flickerVal = tFlicker - 10000.0 * floor(tFlicker / 10000.0);\n let flicker = step(hash1(flickerVal * 1.7), 0.8); // rapid on/off shimmer\n\n // Jitter a vertical bolt with per-row hashes and interpolate between rows\n let rows = 18.0 * scl;\n let rg = p.y * rows;\n let row = floor(rg);\n let fr = fract(rg);\n \n let tLightning = floor(time * 24.0);\n let lightningVal = tLightning - 10000.0 * floor(tLightning / 10000.0);\n let x0 = 0.3 + 0.4 * hash1(row * 13.7 + lightningVal * 3.1);\n let x1 = 0.3 + 0.4 * hash1((row + 1.0) * 13.7 + lightningVal * 3.1);\n let boltX = mix(x0, x1, fr);\n\n // Secondary tiny forks\n let forkDrift = (hash1(row * 7.3) - 0.5) * 0.12 * smoothstep(0.0, 0.6, 1.0 - p.y);\n let boltDist = abs(p.x - (boltX + forkDrift)) * scl;\n let core = smoothstep(0.012, 0.0, boltDist);\n let glow = smoothstep(0.07, 0.0, boltDist) * 0.5;\n let a = clamp((core + glow) * flash * flicker * inten, 0.0, 1.0);\n let col = mix(cA, cB, clamp(boltDist * 8.0, 0.0, 1.0) + 0.3 * flash);\n // Soft ambient flash behind the bolt\n let amb = smoothstep(0.35, 0.0, length(p - vec2<f32>(boltX, p.y)) * scl) * flash * 0.15;\n return vec4<f32>(col * (1.0 + amb), clamp(a + amb, 0.0, 1.0));\n}\n\nfn fxEnergyBeam(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n let src = vec2<f32>(0.15, 0.5);\n let dirv = vec2<f32>(1.0, 0.0);\n let w = p - src;\n let along = dot(w, dirv) * scl;\n let perp = dot(w, vec2<f32>(-dirv.y, dirv.x)) * scl;\n let beamWidth = 0.01 + 0.03 * dens;\n let glowWidth = 0.05 + 0.1 * dens;\n let core = smoothstep(beamWidth, 0.0, abs(perp));\n let glow = smoothstep(glowWidth, 0.0, abs(perp)) * 0.4 * dens;\n let falloff = smoothstep(0.0, 1.0, along);\n let pulse = 0.7 + 0.3 * sin(along * 30.0 - time * 10.0);\n let a = clamp((core + glow) * falloff * pulse * inten, 0.0, 1.0);\n let col = mix(cA, cB, clamp(along, 0.0, 1.0));\n return vec4<f32>(col * (1.0 + glow * 2.0), a);\n}\n\nfn fxAurora(p: vec2<f32>, seedOff: f32, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {\n // Northern lights: curtains hanging from a wavy band across the upper sky,\n // rippling sideways, with fine vertical rays. cA at the base, cB at the top.\n var acc = vec3<f32>(0.0);\n var keep = 1.0;\n for (var k = 0; k < 3; k++) {\n let fk = f32(k);\n let x = p.x * (1.0 + fk * 0.35) * scl * 1.5 + seedOff * 13.0 + fk * 3.1;\n // Curtain base line, a slow wave across the frame.\n let base = 0.42 + fk * 0.06 + 0.12 * (fbm(vec2<f32>(x * 1.3, time * 0.05 + fk), 3) - 0.5)\n + 0.05 * sin(x * 4.0 + time * 0.3 + fk);\n let h = 0.38 + 0.2 * fbm(vec2<f32>(x * 2.0 + 7.0, time * 0.04), 3);\n let d = base - p.y; // 0 at the base, rising upward\n let body = smoothstep(-0.06, 0.035, d) * pow(1.0 - smoothstep(0.0, h, d), 1.5);\n // Vertical rays drifting sideways.\n let rn = fbm(vec2<f32>(x * 40.0 + time * 0.3, d * 2.0 - time * 0.1), 3);\n let rays = 0.25 + 1.2 * rn * rn;\n let fold = 0.6 + 0.4 * sin(x * 9.0 + time * 0.5 + fbm(vec2<f32>(x * 3.0, time * 0.1), 2) * 6.0);\n let a = body * rays * fold * (1.0 - fk * 0.25);\n let col = mix(cA, cB, clamp(d / max(h, 1e-3), 0.0, 1.0));\n acc += col * a;\n keep *= 1.0 - clamp(a, 0.0, 1.0);\n }\n let alpha = 1.0 - keep;\n let a = clamp(alpha * (0.35 + 0.65 * dens) * inten * 1.4, 0.0, 1.0);\n return vec4<f32>(acc / max(alpha, 1e-3) * min(alpha * 2.0, 1.0), a);\n}\n\n// ---- main dispatch ---------------------------------------------------------\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let density = get_field(u.density, u.hasSigDensity, densityTex, signalSamp);\n let scale = get_field(u.scale, u.hasSigScale, scaleTex, signalSamp);\n let speed = get_field(u.speed, u.hasSigSpeed, speedTex, signalSamp);\n let intensity = get_field(u.intensity, u.hasSigIntensity, intensityTex, signalSamp);\n let seed = get_field(u.seed, u.hasSigSeed, seedTex, signalSamp);\n\n let isVideo = u.outputType > 0.5;\n let time = select(0.0, u.time * max(speed, 1e-4), isVideo);\n let seedOff = fract(seed * 1.618033);\n\n // Aspect correction\n let uv = in.uv;\n let p = vec2<f32>(uv.x, uv.y);\n\n // Move to a seed-scrambled space so different seeds look different\n let sp = p + vec2<f32>(seedOff * 17.0, seedOff * 31.0);\n\n var eff = vec4<f32>(0.0, 0.0, 0.0, 0.0);\n let cA = u.colorStart.rgb;\n let cB = u.colorEnd.rgb;\n let scl = max(scale, 1e-4);\n let factor = scl * 100.0;\n\n if (u.effectType < 0.5) {\n eff = fxSmoke(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 1.5) {\n eff = fxFire(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 2.5) {\n eff = fxRain(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 3.5) {\n eff = fxSparks(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 4.5) {\n eff = fxSnow(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 5.5) {\n eff = fxDust(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 6.5) {\n eff = fxLightning(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 7.5) {\n eff = fxMagic(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 8.5) {\n eff = fxLensFlare(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 9.5) {\n eff = fxEmbers(sp, time, factor, density, intensity, cA, cB);\n } else if (u.effectType < 10.5) {\n eff = fxEnergyBeam(sp, time, factor, density, intensity, cA, cB);\n } else {\n eff = fxAurora(p, seedOff, time, factor, density, intensity, cA, cB);\n }\n\n // Straight alpha is fine for compositing onto a transparent canvas.\n let a = clamp(eff.a, 0.0, 1.0);\n return vec4<f32>(clamp(eff.rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * a, a);\n}\n`;\nconst vfxUniformData = new Float32Array(24);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsignalsLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getVFXResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `procedural_vfx_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vfxModule = device.createShaderModule({\n\t\t\tlabel: `procedural_vfx_${format}.wgsl`,\n\t\t\tcode: VFX_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ProceduralVFXPipeline_${format}`,\n\t\t\tmodule: vfxModule,\n\t\t\tlayouts: [layouts.uniformLayout, layouts.signalsLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tvfxPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsignalsLayout: layouts.signalsLayout\n\t};\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = h.split(\"\").map((c) => c + c).join(\"\");\n\tconst r = parseInt(h.substring(0, 2), 16) / 255;\n\tconst g = parseInt(h.substring(2, 4), 16) / 255;\n\tconst b = parseInt(h.substring(4, 6), 16) / 255;\n\tlet a = 1;\n\tif (h.length === 8) a = parseInt(h.substring(6, 8), 16) / 255;\n\treturn [\n\t\tr,\n\t\tg,\n\t\tb,\n\t\ta\n\t];\n}\nconst VFX_EFFECT_INDEX = {\n\tSmoke: 0,\n\tFire: 1,\n\tRain: 2,\n\tSparks: 3,\n\tSnow: 4,\n\tDust: 5,\n\tLightning: 6,\n\tMagic: 7,\n\tLensFlare: 8,\n\tEmbers: 9,\n\tEnergyBeam: 10,\n\tAurora: 11\n};\nconst ProceduralVFXWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ProceduralVFX\" || !op) return;\n\tconst { vfxPipeline: pipeline, uniformLayout: uLayout, signalsLayout: sigLayout } = getVFXResources(ctx.device, ctx.renderer.format);\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst densityInfo = resolveSignalField(op, \"density\", .6);\n\tconst scaleInfo = resolveSignalField(op, \"scale\", .01);\n\tconst speedInfo = resolveSignalField(op, \"speed\", 1);\n\tconst intensityInfo = resolveSignalField(op, \"intensity\", .8);\n\tconst seedInfo = resolveSignalField(op, \"seed\", 1234);\n\tconst effectIndex = VFX_EFFECT_INDEX[op.effectType ?? \"Smoke\"] ?? 0;\n\tconst outputTypeVal = op.outputType === \"Video\" ? 1 : 0;\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst colorStartVal = hexToRgba(op.colorStart ?? \"#ffffff\");\n\tconst colorEndVal = hexToRgba(op.colorEnd ?? \"#ff5500\");\n\tvfxUniformData[0] = effectIndex;\n\tvfxUniformData[1] = outputTypeVal;\n\tvfxUniformData[2] = elapsedSeconds;\n\tvfxUniformData[3] = 0;\n\tvfxUniformData[4] = densityInfo.value;\n\tvfxUniformData[5] = scaleInfo.value;\n\tvfxUniformData[6] = speedInfo.value;\n\tvfxUniformData[7] = intensityInfo.value;\n\tvfxUniformData[8] = seedInfo.value;\n\tvfxUniformData[9] = densityInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[10] = scaleInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[11] = speedInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[12] = intensityInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[13] = seedInfo.hasSignal ? 1 : 0;\n\tvfxUniformData[14] = 0;\n\tvfxUniformData[15] = 0;\n\tvfxUniformData[16] = colorStartVal[0];\n\tvfxUniformData[17] = colorStartVal[1];\n\tvfxUniformData[18] = colorStartVal[2];\n\tvfxUniformData[19] = colorStartVal[3];\n\tvfxUniformData[20] = colorEndVal[0];\n\tvfxUniformData[21] = colorEndVal[1];\n\tvfxUniformData[22] = colorEndVal[2];\n\tvfxUniformData[23] = colorEndVal[3];\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vfxUniformData);\n\tconst signalFields = [\n\t\t{\n\t\t\tname: \"density\",\n\t\t\tinfo: densityInfo\n\t\t},\n\t\t{\n\t\t\tname: \"scale\",\n\t\t\tinfo: scaleInfo\n\t\t},\n\t\t{\n\t\t\tname: \"speed\",\n\t\t\tinfo: speedInfo\n\t\t},\n\t\t{\n\t\t\tname: \"intensity\",\n\t\t\tinfo: intensityInfo\n\t\t},\n\t\t{\n\t\t\tname: \"seed\",\n\t\t\tinfo: seedInfo\n\t\t}\n\t];\n\tconst signalViews = [];\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tfor (const f of signalFields) if (!!(f.info.hasSignal && f.info.sd)) {\n\t\tconst view = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, f.info.sd?.nodeId ?? `procedural_vfx_${f.name}_sig`, elapsedSeconds, durationSeconds, f.info.sd, targetWidth, targetHeight, props.renderId, frame, fps);\n\t\tsignalViews.push(view);\n\t} else signalViews.push(signalRegistry.getDummy1x1TextureView(ctx.device));\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tpass.setBindGroup(1, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: signalViews[0]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: signalViews[1]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: signalViews[2]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: signalViews[3]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: signalViews[4]\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\tpass.draw(4);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ProceduralVFXWebGPURenderer });\n\n//#endregion\nexport { ProceduralVFXWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DiW7Lt7Y.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-SWr3vbrV.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-C7L8Ceqr.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-BgO6BA_z.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-1r-Uq-Ae.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
2
- import { Rn as signalRegistry } from "./dist-CFe1fC9l.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CU2tEKJJ.mjs";
2
+ import { Rn as signalRegistry } from "./dist-C1cCW7Bt.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CMaa63nz.mjs";
4
4
 
5
5
  //#region ../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs
6
6
  const COLORKEY_SHADER = `
@@ -279,4 +279,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer
279
279
 
280
280
  //#endregion
281
281
  export { renderers_default as t };
282
- //# sourceMappingURL=renderer-CrgfMDbh.mjs.map
282
+ //# sourceMappingURL=renderer-DiY70S8S.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CrgfMDbh.mjs","names":[],"sources":["../../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLORKEY_SHADER = `\nstruct ColorKeyUniforms {\n\tsimilarity : f32,\n\tsmoothness : f32,\n\tspillSuppression : f32,\n\tcolorSpace : f32, // 0 for YUV, 1 for RGB\n\tspillSuppressionType : f32, // 0 for Desaturate, 1 for Neutralize, 2 for None\n\tkeyR : f32,\n\tkeyG : f32,\n\tkeyB : f32,\n\thasSimilaritySig : f32,\n\thasSmoothnessSig : f32,\n\thasSpillSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorKeyUniforms;\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 similaritySigTex : texture_2d<f32>;\n@group(2) @binding(1) var smoothnessSigTex : texture_2d<f32>;\n@group(2) @binding(2) var spillSigTex : texture_2d<f32>;\n@group(2) @binding(3) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb2yuv(rgb: vec3<f32>) -> vec3<f32> {\n\tlet y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n\tlet u = -0.169 * rgb.r - 0.331 * rgb.g + 0.500 * rgb.b;\n\tlet v = 0.500 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b;\n\treturn vec3<f32>(y, u, v);\n}\n\nfn yuv2rgb(yuv: vec3<f32>) -> vec3<f32> {\n\tlet r = yuv.x + 1.402 * yuv.z;\n\tlet g = yuv.x - 0.344 * yuv.y - 0.714 * yuv.z;\n\tlet b = yuv.x + 1.772 * yuv.y;\n\treturn vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet src_color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (src_color.a < 1e-5) {\n\t\treturn src_color;\n\t}\n\n\t// Unpremultiply alpha for keying and grading\n\tlet unpremult_rgb = src_color.rgb / src_color.a;\n\n\t// Resolve dynamic signals if connected, otherwise use static uniform values\n\tvar similarity = u.similarity;\n\tif (u.hasSimilaritySig > 0.5) {\n\t\tsimilarity = textureSampleLevel(similaritySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar smoothness = u.smoothness;\n\tif (u.hasSmoothnessSig > 0.5) {\n\t\tsmoothness = textureSampleLevel(smoothnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar spillSuppression = u.spillSuppression;\n\tif (u.hasSpillSig > 0.5) {\n\t\tspillSuppression = textureSampleLevel(spillSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet keyColor = vec3<f32>(u.keyR, u.keyG, u.keyB);\n\n\t// 1. Calculate similarity distance\n\tvar dist = 0.0;\n\tif (u.colorSpace < 0.5) {\n\t\t// YUV (Chroma Distance)\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tdist = distance(C_yuv.yz, K_yuv.yz);\n\t} else {\n\t\t// RGB (Exact Distance)\n\t\tdist = distance(unpremult_rgb, keyColor);\n\t}\n\n\t// 2. Calculate transparency mask\n\tvar mask = 0.0;\n\tif (smoothness < 0.0001) {\n\t\tmask = select(0.0, 1.0, dist >= similarity);\n\t} else {\n\t\tmask = smoothstep(similarity, similarity + smoothness, dist);\n\t}\n\n\t// 3. Apply spill suppression\n\tvar final_rgb = unpremult_rgb;\n\tif (u.spillSuppressionType < 2.5) { // 0 for Desaturate, 1 for Neutralize, 2 for None\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tlet K_chroma = K_yuv.yz;\n\t\tlet K_len_sq = dot(K_chroma, K_chroma);\n\n\t\tif (K_len_sq > 1e-6) {\n\t\t\tlet C_chroma = C_yuv.yz;\n\t\t\tlet proj = dot(C_chroma, K_chroma) / K_len_sq;\n\t\t\tif (proj > 0.0) {\n\t\t\t\tlet C_para = proj * K_chroma;\n\t\t\t\tvar C_chroma_suppressed = C_chroma;\n\n\t\t\t\tif (u.spillSuppressionType < 0.5) {\n\t\t\t\t\t// Desaturate\n\t\t\t\t\tC_chroma_suppressed = C_chroma - spillSuppression * C_para;\n\t\t\t\t} else {\n\t\t\t\t\t// Neutralize (completely shift to neutral gray chroma)\n\t\t\t\t\tC_chroma_suppressed = C_chroma - C_para;\n\t\t\t\t}\n\n\t\t\t\tfinal_rgb = yuv2rgb(vec3<f32>(C_yuv.x, C_chroma_suppressed.x, C_chroma_suppressed.y));\n\t\t\t}\n\t\t}\n\t}\n\n\tlet final_alpha = src_color.a * mask;\n\treturn vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * final_alpha, final_alpha);\n}\n`;\nconst colorKeyData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 3),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getColorKeyResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `colorkey_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst colorKeyModule = device.createShaderModule({\n\t\t\tlabel: `colorkey_${format}.wgsl`,\n\t\t\tcode: COLORKEY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ColorKeyPipeline_${format}`,\n\t\t\tmodule: colorKeyModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tcolorKeyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction hexToRgb(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n\treturn [\n\t\tparseInt(h.substring(0, 2), 16) / 255,\n\t\tparseInt(h.substring(2, 4), 16) / 255,\n\t\tparseInt(h.substring(4, 6), 16) / 255\n\t];\n}\nconst ColorKeyWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ColorKey\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"colorkey_node\";\n\tconst similarityInput = op.similarityHandleId ? op.inputs?.[op.similarityHandleId] : null;\n\tconst hasSimilaritySig = !!(similarityInput?.connectionValid && (similarityInput.outputItem?.type === \"Signal\" || similarityInput.outputItem?.type === \"Numeric\"));\n\tconst similaritySd = hasSimilaritySig && similarityInput?.outputItem?.data ? similarityInput.outputItem.data : null;\n\tlet similarity = .4;\n\tlet hasStaticSimilaritySig = false;\n\tif (!hasSimilaritySig) if (similarityInput?.connectionValid && similarityInput.outputItem?.type === \"Number\") similarity = Math.max(0, Math.min(1, Number(similarityInput.outputItem.data ?? .4)));\n\telse similarity = Math.max(0, Math.min(1, Number(op.similarity ?? .4)));\n\telse if (similaritySd) {\n\t\tsimilarity = Math.max(0, Math.min(1, Number(similaritySd.offset ?? 0)));\n\t\thasStaticSimilaritySig = true;\n\t}\n\tconst smoothnessInput = op.smoothnessHandleId ? op.inputs?.[op.smoothnessHandleId] : null;\n\tconst hasSmoothnessSig = !!(smoothnessInput?.connectionValid && (smoothnessInput.outputItem?.type === \"Signal\" || smoothnessInput.outputItem?.type === \"Numeric\"));\n\tconst smoothnessSd = hasSmoothnessSig && smoothnessInput?.outputItem?.data ? smoothnessInput.outputItem.data : null;\n\tlet smoothness = .1;\n\tlet hasStaticSmoothnessSig = false;\n\tif (!hasSmoothnessSig) if (smoothnessInput?.connectionValid && smoothnessInput.outputItem?.type === \"Number\") smoothness = Math.max(0, Math.min(1, Number(smoothnessInput.outputItem.data ?? .1)));\n\telse smoothness = Math.max(0, Math.min(1, Number(op.smoothness ?? .1)));\n\telse if (smoothnessSd) {\n\t\tsmoothness = Math.max(0, Math.min(1, Number(smoothnessSd.offset ?? 0)));\n\t\thasStaticSmoothnessSig = true;\n\t}\n\tconst spillInput = op.spillSuppressionHandleId ? op.inputs?.[op.spillSuppressionHandleId] : null;\n\tconst hasSpillSig = !!(spillInput?.connectionValid && (spillInput.outputItem?.type === \"Signal\" || spillInput.outputItem?.type === \"Numeric\"));\n\tconst spillSd = hasSpillSig && spillInput?.outputItem?.data ? spillInput.outputItem.data : null;\n\tlet spillSuppression = .2;\n\tlet hasStaticSpillSig = false;\n\tif (!hasSpillSig) if (spillInput?.connectionValid && spillInput.outputItem?.type === \"Number\") spillSuppression = Math.max(0, Math.min(1, Number(spillInput.outputItem.data ?? .2)));\n\telse spillSuppression = Math.max(0, Math.min(1, Number(op.spillSuppression ?? .2)));\n\telse if (spillSd) {\n\t\tspillSuppression = Math.max(0, Math.min(1, Number(spillSd.offset ?? 0)));\n\t\thasStaticSpillSig = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { colorKeyPipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getColorKeyResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet similarityView;\n\tif (hasStaticSimilaritySig && similaritySd) similarityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, similaritySd.nodeId ?? `${nodeId}_similarity_sig`, elapsedSeconds, durationSeconds, similaritySd, width, height, props.renderId, frame, fps);\n\telse similarityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet smoothnessView;\n\tif (hasStaticSmoothnessSig && smoothnessSd) smoothnessView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, smoothnessSd.nodeId ?? `${nodeId}_smoothness_sig`, elapsedSeconds, durationSeconds, smoothnessSd, width, height, props.renderId, frame, fps);\n\telse smoothnessView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet spillView;\n\tif (hasStaticSpillSig && spillSd) spillView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, spillSd.nodeId ?? `${nodeId}_spill_sig`, elapsedSeconds, durationSeconds, spillSd, width, height, props.renderId, frame, fps);\n\telse spillView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst [keyR, keyG, keyB] = hexToRgb(op.keyColor ?? \"#00ff00\");\n\tcolorKeyData[0] = similarity;\n\tcolorKeyData[1] = smoothness;\n\tcolorKeyData[2] = spillSuppression;\n\tcolorKeyData[3] = op.colorSpace === \"RGB\" ? 1 : 0;\n\tcolorKeyData[4] = op.spillSuppressionType === \"None\" ? 2 : op.spillSuppressionType === \"Neutralize\" ? 1 : 0;\n\tcolorKeyData[5] = keyR;\n\tcolorKeyData[6] = keyG;\n\tcolorKeyData[7] = keyB;\n\tcolorKeyData[8] = hasStaticSimilaritySig ? 1 : 0;\n\tcolorKeyData[9] = hasStaticSmoothnessSig ? 1 : 0;\n\tcolorKeyData[10] = hasStaticSpillSig ? 1 : 0;\n\tcolorKeyData[11] = 0;\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(colorKeyData);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: similarityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: smoothnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: spillView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-eo_mW2uK.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DiY70S8S.mjs","names":[],"sources":["../../../nodes/node-colorkey/dist/renderers-eo_mW2uK.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLORKEY_SHADER = `\nstruct ColorKeyUniforms {\n\tsimilarity : f32,\n\tsmoothness : f32,\n\tspillSuppression : f32,\n\tcolorSpace : f32, // 0 for YUV, 1 for RGB\n\tspillSuppressionType : f32, // 0 for Desaturate, 1 for Neutralize, 2 for None\n\tkeyR : f32,\n\tkeyG : f32,\n\tkeyB : f32,\n\thasSimilaritySig : f32,\n\thasSmoothnessSig : f32,\n\thasSpillSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : ColorKeyUniforms;\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 similaritySigTex : texture_2d<f32>;\n@group(2) @binding(1) var smoothnessSigTex : texture_2d<f32>;\n@group(2) @binding(2) var spillSigTex : texture_2d<f32>;\n@group(2) @binding(3) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn rgb2yuv(rgb: vec3<f32>) -> vec3<f32> {\n\tlet y = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b;\n\tlet u = -0.169 * rgb.r - 0.331 * rgb.g + 0.500 * rgb.b;\n\tlet v = 0.500 * rgb.r - 0.419 * rgb.g - 0.081 * rgb.b;\n\treturn vec3<f32>(y, u, v);\n}\n\nfn yuv2rgb(yuv: vec3<f32>) -> vec3<f32> {\n\tlet r = yuv.x + 1.402 * yuv.z;\n\tlet g = yuv.x - 0.344 * yuv.y - 0.714 * yuv.z;\n\tlet b = yuv.x + 1.772 * yuv.y;\n\treturn vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet src_color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (src_color.a < 1e-5) {\n\t\treturn src_color;\n\t}\n\n\t// Unpremultiply alpha for keying and grading\n\tlet unpremult_rgb = src_color.rgb / src_color.a;\n\n\t// Resolve dynamic signals if connected, otherwise use static uniform values\n\tvar similarity = u.similarity;\n\tif (u.hasSimilaritySig > 0.5) {\n\t\tsimilarity = textureSampleLevel(similaritySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar smoothness = u.smoothness;\n\tif (u.hasSmoothnessSig > 0.5) {\n\t\tsmoothness = textureSampleLevel(smoothnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tvar spillSuppression = u.spillSuppression;\n\tif (u.hasSpillSig > 0.5) {\n\t\tspillSuppression = textureSampleLevel(spillSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet keyColor = vec3<f32>(u.keyR, u.keyG, u.keyB);\n\n\t// 1. Calculate similarity distance\n\tvar dist = 0.0;\n\tif (u.colorSpace < 0.5) {\n\t\t// YUV (Chroma Distance)\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tdist = distance(C_yuv.yz, K_yuv.yz);\n\t} else {\n\t\t// RGB (Exact Distance)\n\t\tdist = distance(unpremult_rgb, keyColor);\n\t}\n\n\t// 2. Calculate transparency mask\n\tvar mask = 0.0;\n\tif (smoothness < 0.0001) {\n\t\tmask = select(0.0, 1.0, dist >= similarity);\n\t} else {\n\t\tmask = smoothstep(similarity, similarity + smoothness, dist);\n\t}\n\n\t// 3. Apply spill suppression\n\tvar final_rgb = unpremult_rgb;\n\tif (u.spillSuppressionType < 2.5) { // 0 for Desaturate, 1 for Neutralize, 2 for None\n\t\tlet C_yuv = rgb2yuv(unpremult_rgb);\n\t\tlet K_yuv = rgb2yuv(keyColor);\n\t\tlet K_chroma = K_yuv.yz;\n\t\tlet K_len_sq = dot(K_chroma, K_chroma);\n\n\t\tif (K_len_sq > 1e-6) {\n\t\t\tlet C_chroma = C_yuv.yz;\n\t\t\tlet proj = dot(C_chroma, K_chroma) / K_len_sq;\n\t\t\tif (proj > 0.0) {\n\t\t\t\tlet C_para = proj * K_chroma;\n\t\t\t\tvar C_chroma_suppressed = C_chroma;\n\n\t\t\t\tif (u.spillSuppressionType < 0.5) {\n\t\t\t\t\t// Desaturate\n\t\t\t\t\tC_chroma_suppressed = C_chroma - spillSuppression * C_para;\n\t\t\t\t} else {\n\t\t\t\t\t// Neutralize (completely shift to neutral gray chroma)\n\t\t\t\t\tC_chroma_suppressed = C_chroma - C_para;\n\t\t\t\t}\n\n\t\t\t\tfinal_rgb = yuv2rgb(vec3<f32>(C_yuv.x, C_chroma_suppressed.x, C_chroma_suppressed.y));\n\t\t\t}\n\t\t}\n\t}\n\n\tlet final_alpha = src_color.a * mask;\n\treturn vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * final_alpha, final_alpha);\n}\n`;\nconst colorKeyData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 3),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getColorKeyResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `colorkey_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst colorKeyModule = device.createShaderModule({\n\t\t\tlabel: `colorkey_${format}.wgsl`,\n\t\t\tcode: COLORKEY_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ColorKeyPipeline_${format}`,\n\t\t\tmodule: colorKeyModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tcolorKeyPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nfunction hexToRgb(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3) h = h.split(\"\").map((c) => c + c).join(\"\");\n\treturn [\n\t\tparseInt(h.substring(0, 2), 16) / 255,\n\t\tparseInt(h.substring(2, 4), 16) / 255,\n\t\tparseInt(h.substring(4, 6), 16) / 255\n\t];\n}\nconst ColorKeyWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ColorKey\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"colorkey_node\";\n\tconst similarityInput = op.similarityHandleId ? op.inputs?.[op.similarityHandleId] : null;\n\tconst hasSimilaritySig = !!(similarityInput?.connectionValid && (similarityInput.outputItem?.type === \"Signal\" || similarityInput.outputItem?.type === \"Numeric\"));\n\tconst similaritySd = hasSimilaritySig && similarityInput?.outputItem?.data ? similarityInput.outputItem.data : null;\n\tlet similarity = .4;\n\tlet hasStaticSimilaritySig = false;\n\tif (!hasSimilaritySig) if (similarityInput?.connectionValid && similarityInput.outputItem?.type === \"Number\") similarity = Math.max(0, Math.min(1, Number(similarityInput.outputItem.data ?? .4)));\n\telse similarity = Math.max(0, Math.min(1, Number(op.similarity ?? .4)));\n\telse if (similaritySd) {\n\t\tsimilarity = Math.max(0, Math.min(1, Number(similaritySd.offset ?? 0)));\n\t\thasStaticSimilaritySig = true;\n\t}\n\tconst smoothnessInput = op.smoothnessHandleId ? op.inputs?.[op.smoothnessHandleId] : null;\n\tconst hasSmoothnessSig = !!(smoothnessInput?.connectionValid && (smoothnessInput.outputItem?.type === \"Signal\" || smoothnessInput.outputItem?.type === \"Numeric\"));\n\tconst smoothnessSd = hasSmoothnessSig && smoothnessInput?.outputItem?.data ? smoothnessInput.outputItem.data : null;\n\tlet smoothness = .1;\n\tlet hasStaticSmoothnessSig = false;\n\tif (!hasSmoothnessSig) if (smoothnessInput?.connectionValid && smoothnessInput.outputItem?.type === \"Number\") smoothness = Math.max(0, Math.min(1, Number(smoothnessInput.outputItem.data ?? .1)));\n\telse smoothness = Math.max(0, Math.min(1, Number(op.smoothness ?? .1)));\n\telse if (smoothnessSd) {\n\t\tsmoothness = Math.max(0, Math.min(1, Number(smoothnessSd.offset ?? 0)));\n\t\thasStaticSmoothnessSig = true;\n\t}\n\tconst spillInput = op.spillSuppressionHandleId ? op.inputs?.[op.spillSuppressionHandleId] : null;\n\tconst hasSpillSig = !!(spillInput?.connectionValid && (spillInput.outputItem?.type === \"Signal\" || spillInput.outputItem?.type === \"Numeric\"));\n\tconst spillSd = hasSpillSig && spillInput?.outputItem?.data ? spillInput.outputItem.data : null;\n\tlet spillSuppression = .2;\n\tlet hasStaticSpillSig = false;\n\tif (!hasSpillSig) if (spillInput?.connectionValid && spillInput.outputItem?.type === \"Number\") spillSuppression = Math.max(0, Math.min(1, Number(spillInput.outputItem.data ?? .2)));\n\telse spillSuppression = Math.max(0, Math.min(1, Number(op.spillSuppression ?? .2)));\n\telse if (spillSd) {\n\t\tspillSuppression = Math.max(0, Math.min(1, Number(spillSd.offset ?? 0)));\n\t\thasStaticSpillSig = true;\n\t}\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { colorKeyPipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getColorKeyResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet similarityView;\n\tif (hasStaticSimilaritySig && similaritySd) similarityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, similaritySd.nodeId ?? `${nodeId}_similarity_sig`, elapsedSeconds, durationSeconds, similaritySd, width, height, props.renderId, frame, fps);\n\telse similarityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet smoothnessView;\n\tif (hasStaticSmoothnessSig && smoothnessSd) smoothnessView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, smoothnessSd.nodeId ?? `${nodeId}_smoothness_sig`, elapsedSeconds, durationSeconds, smoothnessSd, width, height, props.renderId, frame, fps);\n\telse smoothnessView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tlet spillView;\n\tif (hasStaticSpillSig && spillSd) spillView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, spillSd.nodeId ?? `${nodeId}_spill_sig`, elapsedSeconds, durationSeconds, spillSd, width, height, props.renderId, frame, fps);\n\telse spillView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tconst [keyR, keyG, keyB] = hexToRgb(op.keyColor ?? \"#00ff00\");\n\tcolorKeyData[0] = similarity;\n\tcolorKeyData[1] = smoothness;\n\tcolorKeyData[2] = spillSuppression;\n\tcolorKeyData[3] = op.colorSpace === \"RGB\" ? 1 : 0;\n\tcolorKeyData[4] = op.spillSuppressionType === \"None\" ? 2 : op.spillSuppressionType === \"Neutralize\" ? 1 : 0;\n\tcolorKeyData[5] = keyR;\n\tcolorKeyData[6] = keyG;\n\tcolorKeyData[7] = keyB;\n\tcolorKeyData[8] = hasStaticSimilaritySig ? 1 : 0;\n\tcolorKeyData[9] = hasStaticSmoothnessSig ? 1 : 0;\n\tcolorKeyData[10] = hasStaticSpillSig ? 1 : 0;\n\tcolorKeyData[11] = 0;\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(colorKeyData);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: similarityView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: smoothnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: spillView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ColorKeyWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-eo_mW2uK.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-DiY70S8S.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-BcJoO4Nm.mjs";
2
2
  import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import "./dist-CFe1fC9l.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-CU2tEKJJ.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-kaleidoscope/dist/renderers-D5lECrP_.mjs
7
7
  const OP = "Kaleidoscope";
@@ -200,4 +200,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: KaleidoscopeWebGPURende
200
200
 
201
201
  //#endregion
202
202
  export { KaleidoscopeWebGPURenderer, renderers_default as default };
203
- //# sourceMappingURL=renderer-Br4UZvfL.mjs.map
203
+ //# sourceMappingURL=renderer-DkRSZg5g.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Br4UZvfL.mjs","names":[],"sources":["../../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.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 = \"Kaleidoscope\";\nconst UNIFORM_FLOATS = 12;\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>, 3> };\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 segments = u.v[1].x;\n\tlet rotation = u.v[1].y;\n\tlet centerX = u.v[1].z;\n\tlet centerY = u.v[1].w;\n\tlet zoom = u.v[2].x;\n\n\tlet R = res();\n\tlet aspect = R.x / R.y;\n\tlet center = vec2<f32>(centerX, centerY);\n\tvar p = in.uv - center;\n\tp.x *= aspect;\n\tlet rad = length(p) / zoom;\n\tlet rot = radians(rotation);\n\tlet seg = 6.2831853 / segments;\n\tvar a = atan2(p.y, p.x) - rot;\n\ta = a - seg * floor(a / seg);\n\ta = min(a, seg - a);\n\tvar q = vec2<f32>(cos(a + rot), sin(a + rot)) * rad;\n\tq.x /= aspect;\n\tlet uv = q + center;\n\tlet m = vec2<f32>(1.0) - abs(fract(uv * 0.5) * 2.0 - vec2<f32>(1.0));\n\treturn sampleP(m);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.segments, 6);\n\tdata[5] = num(raw.rotation, 0);\n\tdata[6] = num(raw.centerX, .5);\n\tdata[7] = num(raw.centerY, .5);\n\tdata[8] = num(raw.zoom, 1);\n}\nconst KaleidoscopeWebGPURenderer = 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: KaleidoscopeWebGPURenderer });\n\n//#endregion\nexport { KaleidoscopeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D5lECrP_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DkRSZg5g.mjs","names":[],"sources":["../../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.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 = \"Kaleidoscope\";\nconst UNIFORM_FLOATS = 12;\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>, 3> };\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 segments = u.v[1].x;\n\tlet rotation = u.v[1].y;\n\tlet centerX = u.v[1].z;\n\tlet centerY = u.v[1].w;\n\tlet zoom = u.v[2].x;\n\n\tlet R = res();\n\tlet aspect = R.x / R.y;\n\tlet center = vec2<f32>(centerX, centerY);\n\tvar p = in.uv - center;\n\tp.x *= aspect;\n\tlet rad = length(p) / zoom;\n\tlet rot = radians(rotation);\n\tlet seg = 6.2831853 / segments;\n\tvar a = atan2(p.y, p.x) - rot;\n\ta = a - seg * floor(a / seg);\n\ta = min(a, seg - a);\n\tvar q = vec2<f32>(cos(a + rot), sin(a + rot)) * rad;\n\tq.x /= aspect;\n\tlet uv = q + center;\n\tlet m = vec2<f32>(1.0) - abs(fract(uv * 0.5) * 2.0 - vec2<f32>(1.0));\n\treturn sampleP(m);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.segments, 6);\n\tdata[5] = num(raw.rotation, 0);\n\tdata[6] = num(raw.centerX, .5);\n\tdata[7] = num(raw.centerY, .5);\n\tdata[8] = num(raw.zoom, 1);\n}\nconst KaleidoscopeWebGPURenderer = 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: KaleidoscopeWebGPURenderer });\n\n//#endregion\nexport { KaleidoscopeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D5lECrP_.mjs.map"],"mappings":";;;;;;AAIA,MAAM,KAAK;AACX,MAAM,iBAAiB;;AAEvB,MAAM,SAAS,CAAC;;;;;EAKd,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuErB;AACF,MAAM,YAAY,WAAW,YAAY;CACxC,QAAQ,wBAAwB,QAAQ;EACvC;EACA;EACA;EACA;EACA,EAAE,GAAG,GAAG,SAAS;CAClB,2BAA2B,IAAI,KAAK;CACpC,SAAS,OAAO,cAAc;EAC7B,WAAW;EACX,WAAW;EACX,cAAc;EACd,cAAc;EACd,CAAC;CACF,EAAE;AACH,SAAS,aAAa,QAAQ,QAAQ;CACrC,MAAM,IAAI,UAAU,OAAO;CAC3B,IAAI,OAAO,EAAE,UAAU,IAAI,OAAO;AAClC,KAAI,CAAC,MAAM;AACV,SAAO,OAAO,KAAK,MAAM,MAAM;GAC9B,MAAM,SAAS,OAAO,mBAAmB;IACxC;IACA,OAAO,GAAG,GAAG,GAAG,EAAE;IAClB,CAAC;AACF,UAAO,OAAO,qBAAqB;IAClC,OAAO,GAAG,GAAG,GAAG;IAChB,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;IACrE,QAAQ;KACP;KACA,YAAY;KACZ;IACD,UAAU;KACT;KACA,YAAY;KACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;KACrB;IACD,WAAW,EAAE,UAAU,kBAAkB;IACzC,CAAC;IACD;AACF,IAAE,UAAU,IAAI,QAAQ,KAAK;;AAE9B,QAAO;;AAER,SAAS,IAAI,GAAG,UAAU;CACzB,MAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,EAAE;AAC/C,QAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;;AAGjC,SAAS,KAAK,KAAK,MAAM,MAAM,OAAO;AACrC,MAAK,KAAK,EAAE;AACZ,MAAK,KAAK;AACV,MAAK,KAAK;AACV,MAAK,KAAK,IAAI,IAAI,UAAU,EAAE;AAC9B,MAAK,KAAK,IAAI,IAAI,UAAU,EAAE;AAC9B,MAAK,KAAK,IAAI,IAAI,SAAS,GAAG;AAC9B,MAAK,KAAK,IAAI,IAAI,SAAS,GAAG;AAC9B,MAAK,KAAK,IAAI,IAAI,MAAM,EAAE;;AAE3B,MAAM,6BAA6B,OAAO,SAAS;CAClD,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,4BAA4B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
2
- import { a as createFullscreenPipeline, i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CU2tEKJJ.mjs";
2
+ import { a as createFullscreenPipeline, i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CMaa63nz.mjs";
3
3
 
4
4
  //#region ../../nodes/node-liquify/dist/renderers-C4bNr5l9.mjs
5
5
  const MAX_OPERATIONS = 1024;
@@ -184,4 +184,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: LiquifyWebGPURenderer }
184
184
 
185
185
  //#endregion
186
186
  export { renderers_default as n, LiquifyWebGPURenderer as t };
187
- //# sourceMappingURL=renderer-CCSzKnvs.mjs.map
187
+ //# sourceMappingURL=renderer-DmkWrWAk.mjs.map