framefields 2.6.2 → 2.7.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 (463) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-BHuVoNc-.mjs → audio-j3ttoRDX.mjs} +4 -4
  4. package/dist/{audio-BHuVoNc-.mjs.map → audio-j3ttoRDX.mjs.map} +1 -1
  5. package/dist/{audio-WcPMxtcz.d.mts → audio-tL8CcPra.d.mts} +3 -3
  6. package/dist/{audio-WcPMxtcz.d.mts.map → audio-tL8CcPra.d.mts.map} +1 -1
  7. package/dist/components/index.d.mts +10 -10
  8. package/dist/components/index.mjs +44 -44
  9. package/dist/{dist-Wsjx_Rza.mjs → dist-BHTd-EC1.mjs} +92 -19
  10. package/dist/{dist-Wsjx_Rza.mjs.map → dist-BHTd-EC1.mjs.map} +1 -1
  11. package/dist/{dist-CSU_2yUb.mjs → dist-BM0ilHvQ.mjs} +115 -21
  12. package/dist/dist-BM0ilHvQ.mjs.map +1 -0
  13. package/dist/{dist-CL5JOMSp.mjs → dist-BRXsfWKQ.mjs} +424 -8
  14. package/dist/dist-BRXsfWKQ.mjs.map +1 -0
  15. package/dist/{dist-PlaSQJ43.mjs → dist-CPtFZxtu.mjs} +2 -2
  16. package/dist/{dist-PlaSQJ43.mjs.map → dist-CPtFZxtu.mjs.map} +1 -1
  17. package/dist/effects/index.d.mts +4 -4
  18. package/dist/effects/index.mjs +35 -35
  19. package/dist/{effects-BvloJaPQ.mjs → effects-Dy661XS_.mjs} +3 -3
  20. package/dist/{effects-BvloJaPQ.mjs.map → effects-Dy661XS_.mjs.map} +1 -1
  21. package/dist/fonts/index.mjs +2 -2
  22. package/dist/{fonts-DpnBDAqM.mjs → fonts-BcFhAqqO.mjs} +2 -2
  23. package/dist/{fonts-DpnBDAqM.mjs.map → fonts-BcFhAqqO.mjs.map} +1 -1
  24. package/dist/{gpu-BvYDrqOC.mjs → gpu-zIhSz_0X.mjs} +2 -2
  25. package/dist/{gpu-BvYDrqOC.mjs.map → gpu-zIhSz_0X.mjs.map} +1 -1
  26. package/dist/{index-kj5uSzaI.d.mts → index-B1ENegOQ.d.mts} +204 -2
  27. package/dist/index-B1ENegOQ.d.mts.map +1 -0
  28. package/dist/{index-DsGBouQM.d.mts → index-CJRTBLZ4.d.mts} +4 -4
  29. package/dist/{index-DsGBouQM.d.mts.map → index-CJRTBLZ4.d.mts.map} +1 -1
  30. package/dist/{index-DcIR_DgU.d.mts → index-Cg30slle.d.mts} +2 -2
  31. package/dist/{index-DcIR_DgU.d.mts.map → index-Cg30slle.d.mts.map} +1 -1
  32. package/dist/{index-wUhS1_4W.d.mts → index-DeeMmoEA.d.mts} +2 -2
  33. package/dist/{index-wUhS1_4W.d.mts.map → index-DeeMmoEA.d.mts.map} +1 -1
  34. package/dist/{index-C541Ol1N.d.mts → index-ePGQ_C7f.d.mts} +39 -16
  35. package/dist/index-ePGQ_C7f.d.mts.map +1 -0
  36. package/dist/{index-C6ihzCpZ.d.mts → index-l1yRugLc.d.mts} +3 -3
  37. package/dist/{index-C6ihzCpZ.d.mts.map → index-l1yRugLc.d.mts.map} +1 -1
  38. package/dist/{index-BCzXnNpb.d.mts → index-uDZ9Yuv-.d.mts} +5 -8
  39. package/dist/index-uDZ9Yuv-.d.mts.map +1 -0
  40. package/dist/index.d.mts +11 -11
  41. package/dist/index.mjs +53 -53
  42. package/dist/preview/index.d.mts +3 -3
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-UMG4Colu.mjs → preview-IpdVFuxv.mjs} +3 -2
  45. package/dist/{preview-UMG4Colu.mjs.map → preview-IpdVFuxv.mjs.map} +1 -1
  46. package/dist/preview-engine/audio.mjs +1 -1
  47. package/dist/preview-engine/{chunk-RF62TV3G.mjs → chunk-25WRUINA.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-MMVFX42U.mjs → chunk-2AEWPT6Y.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-IIOHF7MH.mjs → chunk-2MDTUA3W.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-KWTTANYN.mjs → chunk-2TLABBER.mjs} +1 -1
  51. package/dist/preview-engine/{chunk-MUOJMF7M.mjs → chunk-3QOJVABU.mjs} +1 -1
  52. package/dist/preview-engine/{chunk-RDEQ4LQU.mjs → chunk-4Q3ZUTQC.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-OXXRKNHW.mjs → chunk-5BXCJ2QX.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-JTT3YX7W.mjs → chunk-5R4UF7YK.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-SVE3XWO7.mjs → chunk-6VDYWMP5.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-ULPLHKM2.mjs → chunk-7B7QQDPZ.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-ULVX4VYT.mjs → chunk-7ZA36EZE.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-LYSU6S4O.mjs → chunk-AJ6BVUDB.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-J24VHZS6.mjs → chunk-BDXGUSSF.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-B7J72YSP.mjs → chunk-CC5V7UBF.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-JD4TBC6Z.mjs → chunk-CP42LYD7.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-LN3YAWUD.mjs → chunk-DJWDD3OE.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-V3FODTPI.mjs → chunk-DZEWY4PR.mjs} +22 -22
  64. package/dist/preview-engine/{chunk-RKNV5N7D.mjs → chunk-ENGQ55LR.mjs} +1 -1
  65. package/dist/preview-engine/{chunk-NIILFJKE.mjs → chunk-FBXKVLTB.mjs} +14 -14
  66. package/dist/preview-engine/{chunk-MJCK5FLZ.mjs → chunk-FMEXTHL7.mjs} +1 -1
  67. package/dist/preview-engine/{chunk-UEQIO6AH.mjs → chunk-FQ7UCMWR.mjs} +1 -1
  68. package/dist/preview-engine/{chunk-TPFDAOW7.mjs → chunk-FRIBHQTM.mjs} +1 -1
  69. package/dist/preview-engine/chunk-FT7HJ6IE.mjs +3 -0
  70. package/dist/preview-engine/{chunk-YEPYVASB.mjs → chunk-G3UOUGIE.mjs} +1 -1
  71. package/dist/preview-engine/{chunk-4JX5LBE2.mjs → chunk-H4GDIVX4.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-DDFWN7DI.mjs → chunk-I7QIQURU.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-3KHD67Q3.mjs → chunk-ID344UBN.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-5NT7WWJR.mjs → chunk-IGCXUGHT.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-QPBTLJ5W.mjs → chunk-IK3YA6MC.mjs} +1 -1
  76. package/dist/preview-engine/chunk-J5SKQFJ6.mjs +1 -0
  77. package/dist/preview-engine/{chunk-Q7JN4EHX.mjs → chunk-JOPZNSZJ.mjs} +1 -1
  78. package/dist/preview-engine/{chunk-SQ52PBF3.mjs → chunk-JOSNIMFT.mjs} +1 -1
  79. package/dist/preview-engine/{chunk-SXNCNG4L.mjs → chunk-JR443L5E.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-FZLKPBKS.mjs → chunk-KCAFMWDM.mjs} +1 -1
  81. package/dist/preview-engine/{chunk-QRYCB6E3.mjs → chunk-LAEPNVOE.mjs} +1 -1
  82. package/dist/preview-engine/chunk-MAALUQK3.mjs +1974 -0
  83. package/dist/preview-engine/chunk-MHCXSWK7.mjs +1 -0
  84. package/dist/preview-engine/{chunk-4INGTMZ5.mjs → chunk-MWBARRK2.mjs} +1 -1
  85. package/dist/preview-engine/{chunk-GQIRV466.mjs → chunk-MXPN2GB7.mjs} +1 -1
  86. package/dist/preview-engine/{chunk-W2EZFV4Q.mjs → chunk-NHYB5YC3.mjs} +1 -1
  87. package/dist/preview-engine/{chunk-22BLMBWX.mjs → chunk-PXSKIGAP.mjs} +6 -6
  88. package/dist/preview-engine/{chunk-SP22JWN2.mjs → chunk-PYM2FBFA.mjs} +1 -1
  89. package/dist/preview-engine/chunk-QDTJ4MOJ.mjs +1 -0
  90. package/dist/preview-engine/{chunk-6PMATELR.mjs → chunk-RQU2GFGH.mjs} +1 -1
  91. package/dist/preview-engine/{chunk-UQD2UE6I.mjs → chunk-RWDPBES3.mjs} +1 -1
  92. package/dist/preview-engine/{chunk-QVW5METG.mjs → chunk-S5ONWSZF.mjs} +1 -1
  93. package/dist/preview-engine/{chunk-2YGR5YCN.mjs → chunk-SIU6JU2R.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-NQZRPPUU.mjs → chunk-SJ3Q4AQP.mjs} +1 -1
  95. package/dist/preview-engine/chunk-TEBZRQPG.mjs +1 -0
  96. package/dist/preview-engine/{chunk-WDWHOXSA.mjs → chunk-UUDML2SN.mjs} +1 -1
  97. package/dist/preview-engine/{chunk-RHXZXWJ4.mjs → chunk-VAS4IJZR.mjs} +1 -1
  98. package/dist/preview-engine/{chunk-DOCFOSA6.mjs → chunk-WTDK6H46.mjs} +1 -1
  99. package/dist/preview-engine/chunk-XNMEVVQB.mjs +1 -0
  100. package/dist/preview-engine/{chunk-AKT4YQWL.mjs → chunk-YVGT4NK6.mjs} +2 -2
  101. package/dist/preview-engine/chunk-ZYTXBBIX.mjs +1 -0
  102. package/dist/preview-engine/components.mjs +1 -1
  103. package/dist/preview-engine/effects.mjs +1 -1
  104. package/dist/preview-engine/framefields.mjs +1 -1
  105. package/dist/preview-engine/player.mjs +2 -2
  106. package/dist/preview-engine/{renderers-FC7G7KU7.mjs → renderers-2AKYMAIK.mjs} +1 -1
  107. package/dist/preview-engine/renderers-363CKEIG.mjs +1 -0
  108. package/dist/preview-engine/{renderers-EJGF3PYQ.mjs → renderers-36L24ZVS.mjs} +1 -1
  109. package/dist/preview-engine/renderers-3FMMVDMA.mjs +1 -0
  110. package/dist/preview-engine/{renderers-56TGEFDK.mjs → renderers-44AANAXR.mjs} +1 -1
  111. package/dist/preview-engine/renderers-4UUU62VV.mjs +1 -0
  112. package/dist/preview-engine/renderers-4ZTZFSAR.mjs +1 -0
  113. package/dist/preview-engine/{renderers-PYDOSDEY.mjs → renderers-5ZSB75GY.mjs} +1 -1
  114. package/dist/preview-engine/renderers-6KDD75BM.mjs +1 -0
  115. package/dist/preview-engine/renderers-7BJRD4G2.mjs +1 -0
  116. package/dist/preview-engine/{renderers-HBIBRZD7.mjs → renderers-AIIHGDJM.mjs} +1 -1
  117. package/dist/preview-engine/{renderers-P2FTCDZ7.mjs → renderers-AU746ORP.mjs} +1 -1
  118. package/dist/preview-engine/renderers-BIF2BETK.mjs +1 -0
  119. package/dist/preview-engine/{renderers-FD3ZT73R.mjs → renderers-BTQCHVHV.mjs} +1 -1
  120. package/dist/preview-engine/{renderers-HMNCIEU3.mjs → renderers-CFHBOAZG.mjs} +1 -1
  121. package/dist/preview-engine/renderers-CU5RW5UA.mjs +1 -0
  122. package/dist/preview-engine/renderers-DK5OBTKE.mjs +1 -0
  123. package/dist/preview-engine/renderers-EAKCDGTY.mjs +1 -0
  124. package/dist/preview-engine/{renderers-FYI6QNUH.mjs → renderers-EGBGC7MU.mjs} +1 -1
  125. package/dist/preview-engine/renderers-EVXCU7G7.mjs +1 -0
  126. package/dist/preview-engine/renderers-EXEYEH3F.mjs +1 -0
  127. package/dist/preview-engine/{renderers-RDHHVXRE.mjs → renderers-EXJDPS3T.mjs} +1 -1
  128. package/dist/preview-engine/renderers-F3WALPWI.mjs +1 -0
  129. package/dist/preview-engine/{renderers-4RVSLTCX.mjs → renderers-FS3EOB4J.mjs} +1 -1
  130. package/dist/preview-engine/{renderers-C3YXNKNM.mjs → renderers-GUL2MXDD.mjs} +1 -1
  131. package/dist/preview-engine/{renderers-EQDINUMT.mjs → renderers-H4HC44B5.mjs} +1 -1
  132. package/dist/preview-engine/renderers-H6565HO4.mjs +1 -0
  133. package/dist/preview-engine/renderers-HT5V6OZ2.mjs +1 -0
  134. package/dist/preview-engine/renderers-HXMOARWO.mjs +1 -0
  135. package/dist/preview-engine/renderers-HZ2Q7BGK.mjs +1 -0
  136. package/dist/preview-engine/renderers-I4N2K2KW.mjs +1 -0
  137. package/dist/preview-engine/renderers-I5J7U6CB.mjs +1 -0
  138. package/dist/preview-engine/renderers-IZV6QXR5.mjs +1 -0
  139. package/dist/preview-engine/renderers-JWGAPHWX.mjs +1 -0
  140. package/dist/preview-engine/renderers-KNDSVQTY.mjs +1 -0
  141. package/dist/preview-engine/renderers-KNDUOO6M.mjs +1 -0
  142. package/dist/preview-engine/renderers-KQAO3QEI.mjs +1 -0
  143. package/dist/preview-engine/{renderers-7SW2AHM2.mjs → renderers-LCSQLXRD.mjs} +1 -1
  144. package/dist/preview-engine/renderers-M34LOEHC.mjs +1 -0
  145. package/dist/preview-engine/renderers-ML6GNCWB.mjs +1 -0
  146. package/dist/preview-engine/renderers-NARG274F.mjs +1 -0
  147. package/dist/preview-engine/renderers-NCFPOSWR.mjs +1 -0
  148. package/dist/preview-engine/{renderers-ZAMSS7QN.mjs → renderers-PCOTECQB.mjs} +1 -1
  149. package/dist/preview-engine/renderers-PG5JHI2S.mjs +1 -0
  150. package/dist/preview-engine/{renderers-LTV5RFDJ.mjs → renderers-Q7MNLQJF.mjs} +1 -1
  151. package/dist/preview-engine/{renderers-GHP7SL5M.mjs → renderers-QXVSJYZL.mjs} +1 -1
  152. package/dist/preview-engine/{renderers-H2UI7YEO.mjs → renderers-R3ERZ3ZY.mjs} +1 -1
  153. package/dist/preview-engine/renderers-RXQKV65L.mjs +1 -0
  154. package/dist/preview-engine/renderers-SA73GD2B.mjs +1 -0
  155. package/dist/preview-engine/renderers-SLIXUHNX.mjs +1 -0
  156. package/dist/preview-engine/renderers-T462JZNA.mjs +1 -0
  157. package/dist/preview-engine/{renderers-LV6LLULR.mjs → renderers-TH2XZAYW.mjs} +1 -1
  158. package/dist/preview-engine/{renderers-ART3EGSZ.mjs → renderers-UHZIERVH.mjs} +1 -1
  159. package/dist/preview-engine/renderers-V7CFVGYK.mjs +1 -0
  160. package/dist/preview-engine/renderers-VY5E7BPK.mjs +1 -0
  161. package/dist/preview-engine/{renderers-ZDMDDWLN.mjs → renderers-WKXGELRG.mjs} +1 -1
  162. package/dist/preview-engine/{renderers-GY4R467B.mjs → renderers-WLDIIFR5.mjs} +1 -1
  163. package/dist/preview-engine/{renderers-NTKSN32T.mjs → renderers-WM6WBRH6.mjs} +1 -1
  164. package/dist/preview-engine/renderers-WT5FQZM7.mjs +228 -0
  165. package/dist/preview-engine/{renderers-YK74777T.mjs → renderers-WTKRLNNR.mjs} +1 -1
  166. package/dist/preview-engine/{renderers-BWRNCXR6.mjs → renderers-X6GKEVP7.mjs} +1 -1
  167. package/dist/preview-engine/renderers-Y47N5EYR.mjs +1 -0
  168. package/dist/preview-engine/renderers-Y4CUVZYI.mjs +1 -0
  169. package/dist/preview-engine/renderers-Y6YC7ZAK.mjs +1 -0
  170. package/dist/preview-engine/renderers-Y6ZYUAQG.mjs +1 -0
  171. package/dist/preview-engine/{renderers-YBTWN76S.mjs → renderers-YRWXYT5A.mjs} +1 -1
  172. package/dist/preview-engine/{renderers-SY435YU3.mjs → renderers-YWC4MXPG.mjs} +1 -1
  173. package/dist/preview-engine/{renderers-7GMW52G3.mjs → renderers-ZWNPYZN6.mjs} +1 -1
  174. package/dist/preview-engine/signals.mjs +1 -1
  175. package/dist/{program-B6YvXPhj.mjs → program-KPBfq9tw.mjs} +84 -15
  176. package/dist/program-KPBfq9tw.mjs.map +1 -0
  177. package/dist/registry/index.json +1 -1
  178. package/dist/registry/lower-third.json +1 -1
  179. package/dist/registry/text-reveal.json +2 -2
  180. package/dist/registry/title-card.json +1 -1
  181. package/dist/renderer/index.d.mts +2 -2
  182. package/dist/renderer/index.mjs +2 -2
  183. package/dist/{renderer-DFGSy_ay.mjs → renderer-1-FLx8kd.mjs} +3 -3
  184. package/dist/{renderer-DFGSy_ay.mjs.map → renderer-1-FLx8kd.mjs.map} +1 -1
  185. package/dist/{renderer-Ck74BZ_L.mjs → renderer-47d3etrX.mjs} +4 -4
  186. package/dist/{renderer-Ck74BZ_L.mjs.map → renderer-47d3etrX.mjs.map} +1 -1
  187. package/dist/{renderer-Cs8Od5S8.mjs → renderer-6GCG6JxD.mjs} +3 -3
  188. package/dist/{renderer-Cs8Od5S8.mjs.map → renderer-6GCG6JxD.mjs.map} +1 -1
  189. package/dist/{renderer-BLn9MrDC.mjs → renderer-8BIDdgjt.mjs} +3 -3
  190. package/dist/{renderer-BLn9MrDC.mjs.map → renderer-8BIDdgjt.mjs.map} +1 -1
  191. package/dist/renderer-B-5TlncB.mjs +5 -0
  192. package/dist/{renderer-CkbIz6M-.mjs → renderer-B1yzSbvC.mjs} +4 -4
  193. package/dist/{renderer-CkbIz6M-.mjs.map → renderer-B1yzSbvC.mjs.map} +1 -1
  194. package/dist/{renderer-BYNbtv_d.mjs → renderer-B2YiXpp-.mjs} +2 -2
  195. package/dist/{renderer-BYNbtv_d.mjs.map → renderer-B2YiXpp-.mjs.map} +1 -1
  196. package/dist/{renderer-DXfYdQ2o.mjs → renderer-B55ljMI_.mjs} +2 -2
  197. package/dist/{renderer-DXfYdQ2o.mjs.map → renderer-B55ljMI_.mjs.map} +1 -1
  198. package/dist/{renderer-CopRZnwp.mjs → renderer-B6Tg4UgH.mjs} +4 -4
  199. package/dist/{renderer-CopRZnwp.mjs.map → renderer-B6Tg4UgH.mjs.map} +1 -1
  200. package/dist/{renderer-CuQceSLi.mjs → renderer-BFnf-8Yt.mjs} +3 -3
  201. package/dist/{renderer-CuQceSLi.mjs.map → renderer-BFnf-8Yt.mjs.map} +1 -1
  202. package/dist/{renderer-BmarvBo8.mjs → renderer-BGHHoPiD.mjs} +2 -2
  203. package/dist/{renderer-CLvXiFPk.mjs → renderer-BHUjPi24.mjs} +2 -2
  204. package/dist/{renderer-CLvXiFPk.mjs.map → renderer-BHUjPi24.mjs.map} +1 -1
  205. package/dist/renderer-BHXtDg5_.mjs +3 -0
  206. package/dist/{renderer-CTQTbvWR.mjs → renderer-BIk67-jU.mjs} +2 -2
  207. package/dist/{renderer-CTQTbvWR.mjs.map → renderer-BIk67-jU.mjs.map} +1 -1
  208. package/dist/{renderer-BHjw4EdY.d.mts → renderer-BLEmr0Lt.d.mts} +2 -2
  209. package/dist/{renderer-BHjw4EdY.d.mts.map → renderer-BLEmr0Lt.d.mts.map} +1 -1
  210. package/dist/{renderer-BcH6-FsA.mjs → renderer-BLs5sDdk.mjs} +3 -3
  211. package/dist/{renderer-BcH6-FsA.mjs.map → renderer-BLs5sDdk.mjs.map} +1 -1
  212. package/dist/renderer-BPd3gvEt.mjs +5 -0
  213. package/dist/{renderer-Hs9t2qY-.mjs → renderer-BXul0Wy6.mjs} +3 -3
  214. package/dist/{renderer-Hs9t2qY-.mjs.map → renderer-BXul0Wy6.mjs.map} +1 -1
  215. package/dist/{renderer-BX2tt7zA.mjs → renderer-B_1SLBPa.mjs} +3 -3
  216. package/dist/{renderer-BX2tt7zA.mjs.map → renderer-B_1SLBPa.mjs.map} +1 -1
  217. package/dist/renderer-B_ep98BH.mjs +5 -0
  218. package/dist/renderer-Ba_KUbKW.mjs +5 -0
  219. package/dist/{renderer-v779MqRx.mjs → renderer-BbyNUjE_.mjs} +3 -3
  220. package/dist/{renderer-v779MqRx.mjs.map → renderer-BbyNUjE_.mjs.map} +1 -1
  221. package/dist/{renderer-rLhze-dj.mjs → renderer-BcVr_cIk.mjs} +2 -2
  222. package/dist/{renderer-rLhze-dj.mjs.map → renderer-BcVr_cIk.mjs.map} +1 -1
  223. package/dist/renderer-BeL2hstU.mjs +5 -0
  224. package/dist/renderer-Bj81osPQ.mjs +5 -0
  225. package/dist/{renderer-Cy_rrWEC.mjs → renderer-BjL7sKGU.mjs} +3 -3
  226. package/dist/{renderer-Cy_rrWEC.mjs.map → renderer-BjL7sKGU.mjs.map} +1 -1
  227. package/dist/{renderer-BZ9zGp0Z.mjs → renderer-BjNcuJ4H.mjs} +3 -3
  228. package/dist/{renderer-BZ9zGp0Z.mjs.map → renderer-BjNcuJ4H.mjs.map} +1 -1
  229. package/dist/{renderer-Da5Xcwx5.mjs → renderer-Br8aDmf0.mjs} +2 -2
  230. package/dist/renderer-BvZQngSm.mjs +5 -0
  231. package/dist/renderer-BxgN8oXx.mjs +5 -0
  232. package/dist/{renderer-CptS_UFe.mjs → renderer-ByOvGGzp.mjs} +3 -3
  233. package/dist/{renderer-CptS_UFe.mjs.map → renderer-ByOvGGzp.mjs.map} +1 -1
  234. package/dist/{renderer-C3gJco03.mjs → renderer-C11qLlrz.mjs} +3 -3
  235. package/dist/{renderer-C3gJco03.mjs.map → renderer-C11qLlrz.mjs.map} +1 -1
  236. package/dist/{renderer-D4KKtfTl.mjs → renderer-C5dyPQjG.mjs} +3 -3
  237. package/dist/{renderer-D4KKtfTl.mjs.map → renderer-C5dyPQjG.mjs.map} +1 -1
  238. package/dist/renderer-C5jDrTBc.mjs +5 -0
  239. package/dist/{renderer-Dk88a53K.mjs → renderer-C6TbU8U5.mjs} +3 -3
  240. package/dist/{renderer-Dk88a53K.mjs.map → renderer-C6TbU8U5.mjs.map} +1 -1
  241. package/dist/{renderer-DKkXBsVx.mjs → renderer-C9bcEaBE.mjs} +3 -3
  242. package/dist/{renderer-DKkXBsVx.mjs.map → renderer-C9bcEaBE.mjs.map} +1 -1
  243. package/dist/{renderer-COAYUhv2.mjs → renderer-CAH00Lub.mjs} +2 -2
  244. package/dist/{renderer-GNgSEbBu.mjs → renderer-CAhsBEpU.mjs} +2 -2
  245. package/dist/{renderer-GNgSEbBu.mjs.map → renderer-CAhsBEpU.mjs.map} +1 -1
  246. package/dist/renderer-CBK4M82Y.mjs +5 -0
  247. package/dist/{renderer-876_ArdD.mjs → renderer-CCH0gSF7.mjs} +3 -3
  248. package/dist/{renderer-876_ArdD.mjs.map → renderer-CCH0gSF7.mjs.map} +1 -1
  249. package/dist/{renderer-DNNxsVQh.mjs → renderer-CCbOp0BM.mjs} +3 -3
  250. package/dist/{renderer-DNNxsVQh.mjs.map → renderer-CCbOp0BM.mjs.map} +1 -1
  251. package/dist/{renderer-UPRkHFPp.mjs → renderer-CEb5GjcU.mjs} +3 -3
  252. package/dist/{renderer-UPRkHFPp.mjs.map → renderer-CEb5GjcU.mjs.map} +1 -1
  253. package/dist/{renderer-Cwhm9oQe.mjs → renderer-CIL9zh-a.mjs} +3 -3
  254. package/dist/{renderer-Cwhm9oQe.mjs.map → renderer-CIL9zh-a.mjs.map} +1 -1
  255. package/dist/{renderer-URxsYx_I.mjs → renderer-CIbXIFOb.mjs} +4 -4
  256. package/dist/{renderer-URxsYx_I.mjs.map → renderer-CIbXIFOb.mjs.map} +1 -1
  257. package/dist/renderer-CLHtCctc.mjs +5 -0
  258. package/dist/{renderer-Q6A9dB56.mjs → renderer-CLX33fIK.mjs} +3 -3
  259. package/dist/{renderer-Q6A9dB56.mjs.map → renderer-CLX33fIK.mjs.map} +1 -1
  260. package/dist/{renderer-DJJXvO27.mjs → renderer-CLXpWDqx.mjs} +2 -2
  261. package/dist/{renderer-DJJXvO27.mjs.map → renderer-CLXpWDqx.mjs.map} +1 -1
  262. package/dist/renderer-CLin7MNN.mjs +5 -0
  263. package/dist/{renderer-BBnurLTw.mjs → renderer-CLypsmiH.mjs} +3 -3
  264. package/dist/{renderer-BBnurLTw.mjs.map → renderer-CLypsmiH.mjs.map} +1 -1
  265. package/dist/renderer-CN7TypOB.mjs +5 -0
  266. package/dist/renderer-CV5Jfwq7.mjs +5 -0
  267. package/dist/renderer-Ca5E46WK.mjs +5 -0
  268. package/dist/renderer-CdbOtoOU.mjs +5 -0
  269. package/dist/renderer-CeD_bqWj.mjs +5 -0
  270. package/dist/{renderer-nIKvk_ij.mjs → renderer-CfEuoZ7b.mjs} +3 -3
  271. package/dist/{renderer-nIKvk_ij.mjs.map → renderer-CfEuoZ7b.mjs.map} +1 -1
  272. package/dist/renderer-CfzNNUOd.mjs +5 -0
  273. package/dist/{renderer-I-KtRtuL.mjs → renderer-Cg3h0Mz9.mjs} +3 -3
  274. package/dist/{renderer-I-KtRtuL.mjs.map → renderer-Cg3h0Mz9.mjs.map} +1 -1
  275. package/dist/renderer-Cl8TmdU8.mjs +5 -0
  276. package/dist/{renderer-CW05KUXE.mjs → renderer-ClHqvIps.mjs} +10 -10
  277. package/dist/renderer-ClHqvIps.mjs.map +1 -0
  278. package/dist/renderer-CosBP_IM.mjs +5 -0
  279. package/dist/renderer-CpwVs5Fh.mjs +5 -0
  280. package/dist/renderer-Cq7baxNb.mjs +5 -0
  281. package/dist/{renderer-PTV0M2HP.mjs → renderer-CqMz_iXy.mjs} +2 -2
  282. package/dist/{renderer-PTV0M2HP.mjs.map → renderer-CqMz_iXy.mjs.map} +1 -1
  283. package/dist/{renderer-DGUL7JlO.mjs → renderer-CqSmfrE1.mjs} +3 -3
  284. package/dist/{renderer-DGUL7JlO.mjs.map → renderer-CqSmfrE1.mjs.map} +1 -1
  285. package/dist/{renderer-D1fjdDVu.d.mts → renderer-CrhJJKFY.d.mts} +5 -3
  286. package/dist/renderer-CrhJJKFY.d.mts.map +1 -0
  287. package/dist/{renderer-sQjiRkiF.mjs → renderer-CxxwhUwy.mjs} +3 -3
  288. package/dist/{renderer-sQjiRkiF.mjs.map → renderer-CxxwhUwy.mjs.map} +1 -1
  289. package/dist/{renderer-BsSZdDHQ.mjs → renderer-D24aiXmB.mjs} +3 -3
  290. package/dist/{renderer-BsSZdDHQ.mjs.map → renderer-D24aiXmB.mjs.map} +1 -1
  291. package/dist/renderer-D6GkxwAx.mjs +5 -0
  292. package/dist/renderer-D7SfGdzX.mjs +5 -0
  293. package/dist/renderer-D7wt09_l.mjs +5 -0
  294. package/dist/{renderer-BHJzeFp9.mjs → renderer-DBslE7fc.mjs} +2 -2
  295. package/dist/{renderer-BHJzeFp9.mjs.map → renderer-DBslE7fc.mjs.map} +1 -1
  296. package/dist/{renderer-DfQWeysg.mjs → renderer-DE3Ki96C.mjs} +3 -3
  297. package/dist/{renderer-DfQWeysg.mjs.map → renderer-DE3Ki96C.mjs.map} +1 -1
  298. package/dist/{renderer-C6YcfNbV.mjs → renderer-DJCqc98W.mjs} +3 -3
  299. package/dist/{renderer-C6YcfNbV.mjs.map → renderer-DJCqc98W.mjs.map} +1 -1
  300. package/dist/{renderer-CdxHmvvf.mjs → renderer-DODOyrty.mjs} +3 -3
  301. package/dist/{renderer-CdxHmvvf.mjs.map → renderer-DODOyrty.mjs.map} +1 -1
  302. package/dist/{renderer-B51lS0Zb.mjs → renderer-DRYxcfgi.mjs} +2 -2
  303. package/dist/renderer-DSuDMYqY.mjs +5 -0
  304. package/dist/{renderer-BfYAlY63.mjs → renderer-DYreml_A.mjs} +3 -3
  305. package/dist/{renderer-BfYAlY63.mjs.map → renderer-DYreml_A.mjs.map} +1 -1
  306. package/dist/{renderer-Byp6c5Y4.mjs → renderer-DZJnNISO.mjs} +2 -2
  307. package/dist/{renderer-Byp6c5Y4.mjs.map → renderer-DZJnNISO.mjs.map} +1 -1
  308. package/dist/renderer-DaIstCIs.mjs +5 -0
  309. package/dist/renderer-DbOD3Nc0.mjs +5 -0
  310. package/dist/{renderer-Bpm12fcQ.mjs → renderer-DbenSRjl.mjs} +3 -3
  311. package/dist/{renderer-Bpm12fcQ.mjs.map → renderer-DbenSRjl.mjs.map} +1 -1
  312. package/dist/{renderer-56T9Wf1N.mjs → renderer-DcXxkxds.mjs} +75 -72
  313. package/dist/renderer-DcXxkxds.mjs.map +1 -0
  314. package/dist/renderer-DdRCA1bn.mjs +6 -0
  315. package/dist/{renderer-15a6H6Yg.mjs → renderer-DdUtL-qF.mjs} +3 -3
  316. package/dist/{renderer-15a6H6Yg.mjs.map → renderer-DdUtL-qF.mjs.map} +1 -1
  317. package/dist/renderer-DfO37haf.mjs +5 -0
  318. package/dist/renderer-DjZwzxZ7.mjs +5 -0
  319. package/dist/renderer-DnAvySNy.mjs +5 -0
  320. package/dist/{renderer-IP6Iy2RQ.mjs → renderer-DnbY04Qk.mjs} +3 -3
  321. package/dist/{renderer-IP6Iy2RQ.mjs.map → renderer-DnbY04Qk.mjs.map} +1 -1
  322. package/dist/renderer-DnvEPm5E.mjs +5 -0
  323. package/dist/{renderer-HW-6FmmO.mjs → renderer-Do9mW_-B.mjs} +3 -3
  324. package/dist/{renderer-HW-6FmmO.mjs.map → renderer-Do9mW_-B.mjs.map} +1 -1
  325. package/dist/{renderer-DlboTFM8.mjs → renderer-Dqg8qxjq.mjs} +3 -3
  326. package/dist/{renderer-DlboTFM8.mjs.map → renderer-Dqg8qxjq.mjs.map} +1 -1
  327. package/dist/{renderer-BfuMCx2c.mjs → renderer-DvkRbmb2.mjs} +3 -3
  328. package/dist/{renderer-BfuMCx2c.mjs.map → renderer-DvkRbmb2.mjs.map} +1 -1
  329. package/dist/renderer-DwNpKnWf.mjs +5 -0
  330. package/dist/{renderer-Djpx4utT.mjs → renderer-Dw_xy3zx.mjs} +3 -3
  331. package/dist/{renderer-Djpx4utT.mjs.map → renderer-Dw_xy3zx.mjs.map} +1 -1
  332. package/dist/renderer-Dx3Dghus.mjs +5 -0
  333. package/dist/{renderer-SPq9BbnG.mjs → renderer-DyrNti45.mjs} +3 -3
  334. package/dist/{renderer-SPq9BbnG.mjs.map → renderer-DyrNti45.mjs.map} +1 -1
  335. package/dist/renderer-KvaoEwIk.mjs +5 -0
  336. package/dist/{renderer-BxtbwOSp.mjs → renderer-SwUFJ4aA.mjs} +3 -3
  337. package/dist/{renderer-BxtbwOSp.mjs.map → renderer-SwUFJ4aA.mjs.map} +1 -1
  338. package/dist/{renderer-DF_TswHB.mjs → renderer-XEoQnDs5.mjs} +3 -3
  339. package/dist/{renderer-DF_TswHB.mjs.map → renderer-XEoQnDs5.mjs.map} +1 -1
  340. package/dist/{renderer-QYjSQL80.mjs → renderer-Xw9Zn3pD.mjs} +2 -2
  341. package/dist/{renderer-QYjSQL80.mjs.map → renderer-Xw9Zn3pD.mjs.map} +1 -1
  342. package/dist/{renderer-XU08U1If.mjs → renderer-ZWIDTOLV.mjs} +2 -2
  343. package/dist/{renderer-XU08U1If.mjs.map → renderer-ZWIDTOLV.mjs.map} +1 -1
  344. package/dist/{renderer-8ZxKRprN.mjs → renderer-bGhRdKB7.mjs} +2 -2
  345. package/dist/{renderer-8ZxKRprN.mjs.map → renderer-bGhRdKB7.mjs.map} +1 -1
  346. package/dist/{renderer-DUx7rcc5.mjs → renderer-d4weUlVq.mjs} +2 -2
  347. package/dist/{renderer-DUx7rcc5.mjs.map → renderer-d4weUlVq.mjs.map} +1 -1
  348. package/dist/{renderer-Bf0Bhqot.mjs → renderer-g7CMgD1v.mjs} +3 -3
  349. package/dist/{renderer-Bf0Bhqot.mjs.map → renderer-g7CMgD1v.mjs.map} +1 -1
  350. package/dist/{renderer-BUj6OsWX.mjs → renderer-gjLFqdv-.mjs} +4 -4
  351. package/dist/{renderer-BUj6OsWX.mjs.map → renderer-gjLFqdv-.mjs.map} +1 -1
  352. package/dist/{renderer-DLpjygMO.mjs → renderer-gv0u9XmU.mjs} +3 -3
  353. package/dist/{renderer-DLpjygMO.mjs.map → renderer-gv0u9XmU.mjs.map} +1 -1
  354. package/dist/{renderer-KS_JYan2.mjs → renderer-jJWwrha1.mjs} +3 -3
  355. package/dist/{renderer-KS_JYan2.mjs.map → renderer-jJWwrha1.mjs.map} +1 -1
  356. package/dist/{renderer-C7BxBoHC.mjs → renderer-kl_pAczD.mjs} +3 -3
  357. package/dist/{renderer-C7BxBoHC.mjs.map → renderer-kl_pAczD.mjs.map} +1 -1
  358. package/dist/{renderer-Bxs9zUIN.mjs → renderer-lrKwPhZi.mjs} +2 -2
  359. package/dist/{renderer-Bxs9zUIN.mjs.map → renderer-lrKwPhZi.mjs.map} +1 -1
  360. package/dist/{renderer-DJy8V_nb.mjs → renderer-pnYj1REL.mjs} +3 -3
  361. package/dist/{renderer-DJy8V_nb.mjs.map → renderer-pnYj1REL.mjs.map} +1 -1
  362. package/dist/{renderers-CP8CFWDs-CPfe6IN0.mjs → renderers-CP8CFWDs-CDikhBRO.mjs} +3 -3
  363. package/dist/{renderers-CP8CFWDs-CPfe6IN0.mjs.map → renderers-CP8CFWDs-CDikhBRO.mjs.map} +1 -1
  364. package/dist/signals/index.d.mts +5 -5
  365. package/dist/signals/index.mjs +6 -6
  366. package/dist/{signals-BRgYyspQ.mjs → signals-BeAWA_1Y.mjs} +3 -3
  367. package/dist/{signals-BRgYyspQ.mjs.map → signals-BeAWA_1Y.mjs.map} +1 -1
  368. package/dist/{src-Be7rjknf.mjs → src-LYcH_X8o.mjs} +233 -27
  369. package/dist/src-LYcH_X8o.mjs.map +1 -0
  370. package/package.json +58 -58
  371. package/dist/dist-CL5JOMSp.mjs.map +0 -1
  372. package/dist/dist-CSU_2yUb.mjs.map +0 -1
  373. package/dist/index-BCzXnNpb.d.mts.map +0 -1
  374. package/dist/index-C541Ol1N.d.mts.map +0 -1
  375. package/dist/index-kj5uSzaI.d.mts.map +0 -1
  376. package/dist/preview-engine/chunk-3SR6BI4B.mjs +0 -1
  377. package/dist/preview-engine/chunk-ALSOO22Q.mjs +0 -1
  378. package/dist/preview-engine/chunk-NKGXINCU.mjs +0 -1
  379. package/dist/preview-engine/chunk-PJMX2GFY.mjs +0 -1
  380. package/dist/preview-engine/chunk-SIXIF5QZ.mjs +0 -3
  381. package/dist/preview-engine/chunk-TXX2POD2.mjs +0 -1974
  382. package/dist/preview-engine/renderers-3HFRWF2G.mjs +0 -1
  383. package/dist/preview-engine/renderers-4CRXZJ5G.mjs +0 -1
  384. package/dist/preview-engine/renderers-5QF4OLFQ.mjs +0 -1
  385. package/dist/preview-engine/renderers-5SOW6OVE.mjs +0 -1
  386. package/dist/preview-engine/renderers-6M2HPY2J.mjs +0 -1
  387. package/dist/preview-engine/renderers-7HT5NW7W.mjs +0 -1
  388. package/dist/preview-engine/renderers-ATTGUTYY.mjs +0 -1
  389. package/dist/preview-engine/renderers-AYWCRBQC.mjs +0 -1
  390. package/dist/preview-engine/renderers-BA6ZCPI5.mjs +0 -1
  391. package/dist/preview-engine/renderers-BAS7RXTC.mjs +0 -1
  392. package/dist/preview-engine/renderers-CZTCW4FC.mjs +0 -1
  393. package/dist/preview-engine/renderers-D2XEQ2YY.mjs +0 -1
  394. package/dist/preview-engine/renderers-DFIJYBW2.mjs +0 -1
  395. package/dist/preview-engine/renderers-EJN6M6DO.mjs +0 -1
  396. package/dist/preview-engine/renderers-EK3HQUUF.mjs +0 -1
  397. package/dist/preview-engine/renderers-G34C5J27.mjs +0 -1
  398. package/dist/preview-engine/renderers-GKVTNDVH.mjs +0 -1
  399. package/dist/preview-engine/renderers-HZBYQKIQ.mjs +0 -1
  400. package/dist/preview-engine/renderers-IK7ZJJKJ.mjs +0 -1
  401. package/dist/preview-engine/renderers-ISASPH6T.mjs +0 -1
  402. package/dist/preview-engine/renderers-IW5MWDBI.mjs +0 -1
  403. package/dist/preview-engine/renderers-JBRPKCKF.mjs +0 -228
  404. package/dist/preview-engine/renderers-K2PI4WJS.mjs +0 -1
  405. package/dist/preview-engine/renderers-KESHVFL2.mjs +0 -1
  406. package/dist/preview-engine/renderers-KTZZVAB2.mjs +0 -1
  407. package/dist/preview-engine/renderers-KY5CJEOV.mjs +0 -1
  408. package/dist/preview-engine/renderers-M5W6SUQD.mjs +0 -1
  409. package/dist/preview-engine/renderers-MEM3REMI.mjs +0 -1
  410. package/dist/preview-engine/renderers-O5XMWFPY.mjs +0 -1
  411. package/dist/preview-engine/renderers-QJA35PKC.mjs +0 -1
  412. package/dist/preview-engine/renderers-TJIFTQHV.mjs +0 -1
  413. package/dist/preview-engine/renderers-TN4XN436.mjs +0 -1
  414. package/dist/preview-engine/renderers-UDYLCYCB.mjs +0 -1
  415. package/dist/preview-engine/renderers-WZ7SFIBZ.mjs +0 -1
  416. package/dist/preview-engine/renderers-X6QNDC6R.mjs +0 -1
  417. package/dist/preview-engine/renderers-X6RNTJOV.mjs +0 -1
  418. package/dist/preview-engine/renderers-Y3N7236P.mjs +0 -1
  419. package/dist/preview-engine/renderers-YP3ASXIJ.mjs +0 -1
  420. package/dist/preview-engine/renderers-YVJAG3PD.mjs +0 -1
  421. package/dist/preview-engine/renderers-ZPPZNMKJ.mjs +0 -1
  422. package/dist/program-B6YvXPhj.mjs.map +0 -1
  423. package/dist/renderer-1qAST5qk.mjs +0 -5
  424. package/dist/renderer-2dntY9lQ.mjs +0 -5
  425. package/dist/renderer-56T9Wf1N.mjs.map +0 -1
  426. package/dist/renderer-83Knj3DI.mjs +0 -5
  427. package/dist/renderer-B2GWXOwP.mjs +0 -5
  428. package/dist/renderer-B3LlOjNo.mjs +0 -5
  429. package/dist/renderer-B5cPLblQ.mjs +0 -5
  430. package/dist/renderer-B7uorwdR.mjs +0 -5
  431. package/dist/renderer-BJ6LDZlX.mjs +0 -5
  432. package/dist/renderer-BaQC4ylR.mjs +0 -5
  433. package/dist/renderer-BfQzj_uW.mjs +0 -5
  434. package/dist/renderer-Bl9uy1ra.mjs +0 -6
  435. package/dist/renderer-Bu4FyXDo.mjs +0 -5
  436. package/dist/renderer-BxbJwS3T.mjs +0 -5
  437. package/dist/renderer-C51hhQ7B.mjs +0 -5
  438. package/dist/renderer-C8ZShnSH.mjs +0 -5
  439. package/dist/renderer-CQh1RgN8.mjs +0 -5
  440. package/dist/renderer-CRYaMhGd.mjs +0 -5
  441. package/dist/renderer-CULThR_r.mjs +0 -5
  442. package/dist/renderer-CW05KUXE.mjs.map +0 -1
  443. package/dist/renderer-C_KDGeMJ.mjs +0 -5
  444. package/dist/renderer-Ce4Gam_S.mjs +0 -5
  445. package/dist/renderer-CkZ6xcN6.mjs +0 -5
  446. package/dist/renderer-Co4C29rw.mjs +0 -5
  447. package/dist/renderer-CyReVcsb.mjs +0 -3
  448. package/dist/renderer-CzgPat6y.mjs +0 -5
  449. package/dist/renderer-D-pFBDki.mjs +0 -5
  450. package/dist/renderer-D1fjdDVu.d.mts.map +0 -1
  451. package/dist/renderer-DELCePyB.mjs +0 -5
  452. package/dist/renderer-DWijRKGh.mjs +0 -5
  453. package/dist/renderer-Di-PH-vG.mjs +0 -5
  454. package/dist/renderer-Dn9CR9KL.mjs +0 -5
  455. package/dist/renderer-ICmKc1Bq.mjs +0 -5
  456. package/dist/renderer-IR3rE4TW.mjs +0 -5
  457. package/dist/renderer-Qyc4xLZY.mjs +0 -5
  458. package/dist/renderer-Riuen1UO.mjs +0 -5
  459. package/dist/renderer-YKJt5oPu.mjs +0 -5
  460. package/dist/renderer-asS1sOXb.mjs +0 -5
  461. package/dist/renderer-mAQErqBN.mjs +0 -5
  462. package/dist/renderer-pZazoCK-.mjs +0 -5
  463. package/dist/src-Be7rjknf.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-C3gJco03.mjs","names":[],"sources":["../../../nodes/node-pixelate/dist/renderers-lrLhGRcA.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 = \"Pixelate\";\nconst UNIFORM_FLOATS = 8;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 2> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet size = u.v[1].x;\n\tlet shape = u32(u.v[1].y + 0.5);\n\tlet gap = u.v[1].z;\n\n\tlet R = res();\n\tlet cell = max(size, 1.0);\n\tlet p = in.uv * R;\n\tlet c0 = floor(p / cell) * cell + cell * 0.5;\n\tlet col = texelS(c0);\n\tlet f = (p - c0) / cell;\n\tlet g = 1.0 - gap;\n\tlet e = 1.0 / cell;\n\tvar m = 1.0;\n\tif (shape == 1u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, length(f));\n\t} else if (shape == 2u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, abs(f.x) + abs(f.y));\n\t} else if (gap > 0.0) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, max(abs(f.x), abs(f.y)));\n\t}\n\treturn premul(vec4<f32>(col.rgb, col.a * 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.size, 12);\n\tdata[5] = Math.max(0, [\n\t\t\"square\",\n\t\t\"circle\",\n\t\t\"diamond\"\n\t].indexOf(String(raw.shape ?? \"square\")));\n\tdata[6] = num(raw.gap, 0);\n}\nconst PixelateWebGPURenderer = 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: PixelateWebGPURenderer });\n\n//#endregion\nexport { PixelateWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-lrLhGRcA.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-C11qLlrz.mjs","names":[],"sources":["../../../nodes/node-pixelate/dist/renderers-lrLhGRcA.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 = \"Pixelate\";\nconst UNIFORM_FLOATS = 8;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 2> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet size = u.v[1].x;\n\tlet shape = u32(u.v[1].y + 0.5);\n\tlet gap = u.v[1].z;\n\n\tlet R = res();\n\tlet cell = max(size, 1.0);\n\tlet p = in.uv * R;\n\tlet c0 = floor(p / cell) * cell + cell * 0.5;\n\tlet col = texelS(c0);\n\tlet f = (p - c0) / cell;\n\tlet g = 1.0 - gap;\n\tlet e = 1.0 / cell;\n\tvar m = 1.0;\n\tif (shape == 1u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, length(f));\n\t} else if (shape == 2u) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, abs(f.x) + abs(f.y));\n\t} else if (gap > 0.0) {\n\t\tm = 1.0 - smoothstep(0.5 * g - e, 0.5 * g, max(abs(f.x), abs(f.y)));\n\t}\n\treturn premul(vec4<f32>(col.rgb, col.a * 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.size, 12);\n\tdata[5] = Math.max(0, [\n\t\t\"square\",\n\t\t\"circle\",\n\t\t\"diamond\"\n\t].indexOf(String(raw.shape ?? \"square\")));\n\tdata[6] = num(raw.gap, 0);\n}\nconst PixelateWebGPURenderer = 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: PixelateWebGPURenderer });\n\n//#endregion\nexport { PixelateWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-lrLhGRcA.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
- import "./dist-Wsjx_Rza.mjs";
4
- import { o as drawChildToTexture } from "./gpu-BvYDrqOC.mjs";
3
+ import "./dist-BHTd-EC1.mjs";
4
+ import { o as drawChildToTexture } from "./gpu-zIhSz_0X.mjs";
5
5
 
6
6
  //#region ../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs
7
7
  /**
@@ -58,4 +58,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURende
58
58
 
59
59
  //#endregion
60
60
  export { renderers_default as default };
61
- //# sourceMappingURL=renderer-D4KKtfTl.mjs.map
61
+ //# sourceMappingURL=renderer-C5dyPQjG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-D4KKtfTl.mjs","names":[],"sources":["../../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawChildToTexture } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\n/**\n* WebGPU renderer for the ExtractFrame operation.\n*\n* Renders the child media (Video/Lottie/GIF) at a specific frame number,\n* producing a static image output. The frame number is stored in the operation\n* and the child is rendered at the corresponding timestamp.\n*/\nconst ExtractFrameWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetView, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia, opacity = 1 } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"ExtractFrame\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst frame = op.frame ?? 0;\n\tconst childMeta = childMedia.metadata;\n\tconst childFps = childMeta?.fps ?? 24;\n\tconst timestampSec = frame / childFps;\n\targs.pass.end();\n\tconst sourceWidth = childMeta?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = childMeta?.height ?? props.containerHeight ?? targetHeight;\n\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\tconst containerHeight = props.containerHeight ?? ctx.surface.height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tframe,\n\t\t\tfps: childFps,\n\t\t\ttimestampSec,\n\t\t\tforceWait: true\n\t\t}\n\t});\n\tconst outPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t}, { opacity });\n\targs.pass = outPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-ByS_lnbu.mjs.map"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,6BAA6B,OAAO,SAAS;CAClD,MAAM,EAAE,KAAK,OAAO,YAAY,aAAa,cAAc,YAAY;CACvE,MAAM,EAAE,cAAc,UAAU,MAAM;CACtC,MAAM,KAAK,cAAc;AACzB,KAAI,CAAC,MAAM,GAAG,OAAO,eAAgB;CACrC,MAAM,aAAa,aAAa,WAAW;AAC3C,KAAI,CAAC,WAAY;CACjB,MAAM,QAAQ,GAAG,SAAS;CAC1B,MAAM,YAAY,WAAW;CAC7B,MAAM,WAAW,WAAW,OAAO;CACnC,MAAM,eAAe,QAAQ;AAC7B,MAAK,KAAK,KAAK;CACf,MAAM,cAAc,WAAW,SAAS,MAAM,kBAAkB;CAChE,MAAM,eAAe,WAAW,UAAU,MAAM,mBAAmB;CACnE,MAAM,iBAAiB,MAAM,kBAAkB,IAAI,QAAQ;CAC3D,MAAM,kBAAkB,MAAM,mBAAmB,IAAI,QAAQ;CAC7D,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,YAAY;EACxE,OAAO;EACP,QAAQ;EACR,OAAO;GACN,GAAG;GACH,gBAAgB;GAChB,iBAAiB;GACjB;GACA,KAAK;GACL;GACA,WAAW;GACX;EACD,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,WAAW,SAAS,YAAY;EAC5D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,KAAI,SAAS,YAAY,SAAS,UAAU;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,EAAE,EAAE,SAAS,CAAC;AACf,MAAK,OAAO;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"renderer-C5dyPQjG.mjs","names":[],"sources":["../../../nodes/node-extract-frame/dist/renderers-ByS_lnbu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawChildToTexture } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\n/**\n* WebGPU renderer for the ExtractFrame operation.\n*\n* Renders the child media (Video/Lottie/GIF) at a specific frame number,\n* producing a static image output. The frame number is stored in the operation\n* and the child is rendered at the corresponding timestamp.\n*/\nconst ExtractFrameWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetView, targetWidth, targetHeight, encoder } = args;\n\tconst { virtualMedia, opacity = 1 } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"ExtractFrame\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst frame = op.frame ?? 0;\n\tconst childMeta = childMedia.metadata;\n\tconst childFps = childMeta?.fps ?? 24;\n\tconst timestampSec = frame / childFps;\n\targs.pass.end();\n\tconst sourceWidth = childMeta?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = childMeta?.height ?? props.containerHeight ?? targetHeight;\n\tconst containerWidth = props.containerWidth ?? ctx.surface.width;\n\tconst containerHeight = props.containerHeight ?? ctx.surface.height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tframe,\n\t\t\tfps: childFps,\n\t\t\ttimestampSec,\n\t\t\tforceWait: true\n\t\t}\n\t});\n\tconst outPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: containerWidth,\n\t\theight: containerHeight\n\t}, { opacity });\n\targs.pass = outPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ExtractFrameWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-ByS_lnbu.mjs.map"],"mappings":";;;;;;;;;;;;;AAWA,MAAM,6BAA6B,OAAO,SAAS;CAClD,MAAM,EAAE,KAAK,OAAO,YAAY,aAAa,cAAc,YAAY;CACvE,MAAM,EAAE,cAAc,UAAU,MAAM;CACtC,MAAM,KAAK,cAAc;AACzB,KAAI,CAAC,MAAM,GAAG,OAAO,eAAgB;CACrC,MAAM,aAAa,aAAa,WAAW;AAC3C,KAAI,CAAC,WAAY;CACjB,MAAM,QAAQ,GAAG,SAAS;CAC1B,MAAM,YAAY,WAAW;CAC7B,MAAM,WAAW,WAAW,OAAO;CACnC,MAAM,eAAe,QAAQ;AAC7B,MAAK,KAAK,KAAK;CACf,MAAM,cAAc,WAAW,SAAS,MAAM,kBAAkB;CAChE,MAAM,eAAe,WAAW,UAAU,MAAM,mBAAmB;CACnE,MAAM,iBAAiB,MAAM,kBAAkB,IAAI,QAAQ;CAC3D,MAAM,kBAAkB,MAAM,mBAAmB,IAAI,QAAQ;CAC7D,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,YAAY;EACxE,OAAO;EACP,QAAQ;EACR,OAAO;GACN,GAAG;GACH,gBAAgB;GAChB,iBAAiB;GACjB;GACA,KAAK;GACL;GACA,WAAW;GACX;EACD,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,WAAW,SAAS,YAAY;EAC5D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,KAAI,SAAS,YAAY,SAAS,UAAU;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,EAAE,EAAE,SAAS,CAAC;AACf,MAAK,OAAO;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-BHTd-EC1.mjs";
3
+ import { t as renderers_default } from "./renderer-CAhsBEpU.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer, s as resolveHandleParam } from "./renderer-BgmO1Dzw.mjs";
2
- import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-PlaSQJ43.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-BvYDrqOC.mjs";
2
+ import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-CPtFZxtu.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-zIhSz_0X.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-mask-math/dist/renderers-YQJYtdXA.mjs
@@ -585,4 +585,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
585
585
 
586
586
  //#endregion
587
587
  export { renderers_default as n, WebGPURenderer as t };
588
- //# sourceMappingURL=renderer-Dk88a53K.mjs.map
588
+ //# sourceMappingURL=renderer-C6TbU8U5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Dk88a53K.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
+ {"version":3,"file":"renderer-C6TbU8U5.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,6 +1,6 @@
1
- import { ln as resolveNumber } from "./dist-CL5JOMSp.mjs";
1
+ import { vn as resolveNumber } from "./dist-BRXsfWKQ.mjs";
2
2
  import { i as isHandleConnected, n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-Wsjx_Rza.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-BHTd-EC1.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-reverb/dist/renderers-DCFjIwTB.mjs
6
6
  const PARAM_ORDER = [
@@ -370,4 +370,4 @@ var renderers_default = defineRenderer({ audioProcessor: reverbAudioProcessor })
370
370
 
371
371
  //#endregion
372
372
  export { renderers_default as t };
373
- //# sourceMappingURL=renderer-DKkXBsVx.mjs.map
373
+ //# sourceMappingURL=renderer-C9bcEaBE.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DKkXBsVx.mjs","names":[],"sources":["../../../nodes/node-audio-reverb/dist/renderers-DCFjIwTB.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"roomSize\",\n\t\"damping\",\n\t\"wet\",\n\t\"dry\",\n\t\"width\"\n];\nconst REVERB_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n roomSize : f32,\n damping : f32,\n wet : f32,\n dry : f32,\n width : f32,\n hasRoomSizeSig : f32,\n hasDampingSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n hasWidthSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> roomSizeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> dampingSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\n@group(0) @binding(8) var<storage, read> widthSignal : array<f32>;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let fixedgain: f32 = 0.015f;\n\n var bufIndices: array<u32, 24>;\n var filterStores: array<f32, 24>;\n var sizes: array<u32, 24>;\n var startOffsets: array<u32, 24>;\n\n for (var f = 0u; f < 24u; f = f + 1u) {\n let metaOffset = f * 4u;\n sizes[f] = u32(state[metaOffset]);\n startOffsets[f] = u32(state[metaOffset + 1u]);\n bufIndices[f] = u32(state[metaOffset + 2u]);\n var fs = state[metaOffset + 3u];\n if (is_nan_or_inf(fs)) { fs = 0.0f; }\n filterStores[f] = fs;\n }\n\n if (numChannels == 1u) {\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // Dynamic parameter signal evaluation\n var effRoomSize = u.roomSize;\n if (u.hasRoomSizeSig > 0.5f) { effRoomSize = roomSizeSignal[index]; }\n effRoomSize = clamp(effRoomSize, 0.0f, 0.98f);\n\n var effDamping = u.damping;\n if (u.hasDampingSig > 0.5f) { effDamping = dampingSignal[index]; }\n effDamping = clamp(effDamping, 0.0f, 1.0f) * 0.4f;\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) { effWet = wetSignal[index]; }\n effWet = clamp(effWet, 0.0f, 1.0f) * 3.0f;\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) { effDry = drySignal[index]; }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n var x = inputChannels[index];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n let inputVal = x * fixedgain;\n\n var combSum = 0.0f;\n for (var j = 0u; j < 8u; j = j + 1u) {\n let size = sizes[j];\n let startOffset = startOffsets[j];\n let bufferIndex = bufIndices[j];\n var fs = filterStores[j];\n\n var output = state[startOffset + bufferIndex];\n if (is_nan_or_inf(output)) { output = 0.0f; }\n\n fs = output * (1.0f - effDamping) + fs * effDamping;\n var nextVal = inputVal + fs * effRoomSize;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n bufIndices[j] = (bufferIndex + 1u) % size;\n filterStores[j] = fs;\n combSum = combSum + output;\n }\n\n var revOut = combSum;\n for (var j = 0u; j < 4u; j = j + 1u) {\n let f = 8u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n\n var bufOut = state[startOffset + bufferIndex];\n if (is_nan_or_inf(bufOut)) { bufOut = 0.0f; }\n\n var nextVal = revOut + bufOut * 0.5f;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n let output = bufOut - revOut;\n bufIndices[f] = (bufferIndex + 1u) % size;\n revOut = output;\n }\n\n var outVal = x * effDry + revOut * effWet;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) { outVal = 1.0f; }\n else if (outVal < -1.0f) { outVal = -1.0f; }\n else if (outVal > 0.9f) { outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f); }\n else if (outVal < -0.9f) { outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f); }\n\n outputChannels[index] = outVal;\n }\n } else {\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // Dynamic parameter signal evaluation\n var effRoomSize = u.roomSize;\n if (u.hasRoomSizeSig > 0.5f) { effRoomSize = roomSizeSignal[index]; }\n effRoomSize = clamp(effRoomSize, 0.0f, 0.98f);\n\n var effDamping = u.damping;\n if (u.hasDampingSig > 0.5f) { effDamping = dampingSignal[index]; }\n effDamping = clamp(effDamping, 0.0f, 1.0f) * 0.4f;\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) { effWet = wetSignal[index]; }\n effWet = clamp(effWet, 0.0f, 1.0f) * 3.0f;\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) { effDry = drySignal[index]; }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n var effWidth = u.width;\n if (u.hasWidthSig > 0.5f) { effWidth = widthSignal[index]; }\n effWidth = clamp(effWidth, 0.0f, 1.0f);\n\n let wet1 = effWet * (effWidth / 2.0f + 0.5f);\n let wet2 = effWet * ((1.0f - effWidth) / 2.0f);\n\n var inputL = inputChannels[index];\n if (is_nan_or_inf(inputL)) { inputL = 0.0f; }\n var inputR = inputChannels[numSamples + index];\n if (is_nan_or_inf(inputR)) { inputR = 0.0f; }\n\n let inputVal = (inputL + inputR) * fixedgain;\n\n // Left channel (Filters 0-11)\n var combSumL = 0.0f;\n for (var j = 0u; j < 8u; j = j + 1u) {\n let size = sizes[j];\n let startOffset = startOffsets[j];\n let bufferIndex = bufIndices[j];\n var fs = filterStores[j];\n\n var output = state[startOffset + bufferIndex];\n if (is_nan_or_inf(output)) { output = 0.0f; }\n\n fs = output * (1.0f - effDamping) + fs * effDamping;\n var nextVal = inputVal + fs * effRoomSize;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n bufIndices[j] = (bufferIndex + 1u) % size;\n filterStores[j] = fs;\n combSumL = combSumL + output;\n }\n var revOutL = combSumL;\n for (var j = 0u; j < 4u; j = j + 1u) {\n let f = 8u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n\n var bufOut = state[startOffset + bufferIndex];\n if (is_nan_or_inf(bufOut)) { bufOut = 0.0f; }\n\n var nextVal = revOutL + bufOut * 0.5f;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n let output = bufOut - revOutL;\n bufIndices[f] = (bufferIndex + 1u) % size;\n revOutL = output;\n }\n\n // Right channel (Filters 12-23)\n var combSumR = 0.0f;\n for (var j = 0u; j < 8u; j = j + 1u) {\n let f = 12u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n var fs = filterStores[f];\n\n var output = state[startOffset + bufferIndex];\n if (is_nan_or_inf(output)) { output = 0.0f; }\n\n fs = output * (1.0f - effDamping) + fs * effDamping;\n var nextVal = inputVal + fs * effRoomSize;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n bufIndices[f] = (bufferIndex + 1u) % size;\n filterStores[f] = fs;\n combSumR = combSumR + output;\n }\n var revOutR = combSumR;\n for (var j = 0u; j < 4u; j = j + 1u) {\n let f = 20u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n\n var bufOut = state[startOffset + bufferIndex];\n if (is_nan_or_inf(bufOut)) { bufOut = 0.0f; }\n\n var nextVal = revOutR + bufOut * 0.5f;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n let output = bufOut - revOutR;\n bufIndices[f] = (bufferIndex + 1u) % size;\n revOutR = output;\n }\n\n var outL = inputL * effDry + revOutL * wet1 + revOutR * wet2;\n var outR = inputR * effDry + revOutR * wet1 + revOutL * wet2;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n }\n\n for (var f = 0u; f < 24u; f = f + 1u) {\n let metaOffset = f * 4u;\n state[metaOffset + 2u] = f32(bufIndices[f]);\n state[metaOffset + 3u] = filterStores[f];\n }\n}\n`;\nconst leftCombLengths = [\n\t1116,\n\t1188,\n\t1277,\n\t1356,\n\t1422,\n\t1491,\n\t1557,\n\t1617\n];\nconst leftAllpassLengths = [\n\t556,\n\t441,\n\t341,\n\t225\n];\nconst reverbAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Reverb.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst roomSizeInternal = Math.max(0, Math.min(resolveNumber(op.roomSize, .5), .98));\n\tconst dampingInternal = Math.max(0, Math.min(resolveNumber(op.damping, .5), 1));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst widthInternal = Math.max(0, Math.min(resolveNumber(op.width, 1), 1));\n\tconst hasRoomSizeSig = isHandleConnected(op, \"roomSizeHandleId\") ? 1 : 0;\n\tconst hasDampingSig = isHandleConnected(op, \"dampingHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(op, \"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(op, \"dryHandleId\") ? 1 : 0;\n\tconst hasWidthSig = isHandleConnected(op, \"widthHandleId\") ? 1 : 0;\n\tconst scale = sampleRate / 44100;\n\tconst nodeId = op.id || \"audio-reverb\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst sizesL = [];\n\tconst sizesR = [];\n\tleftCombLengths.forEach((len) => {\n\t\tsizesL.push(Math.round(len * scale));\n\t});\n\tleftCombLengths.forEach((len) => {\n\t\tsizesR.push(Math.round((len + 23) * scale));\n\t});\n\tleftAllpassLengths.forEach((len) => {\n\t\tsizesL.push(Math.round(len * scale));\n\t});\n\tleftAllpassLengths.forEach((len) => {\n\t\tsizesR.push(Math.round((len + 23) * scale));\n\t});\n\tconst totalMetadataFloats = 96;\n\tlet totalDelaySamples = 0;\n\tconst filterSizes = [...sizesL, ...sizesR];\n\tfor (const size of filterSizes) totalDelaySamples += size;\n\tconst stateFloatCount = totalMetadataFloats + totalDelaySamples;\n\tconst metaData = new Float32Array(totalMetadataFloats);\n\tlet currentOffset = totalMetadataFloats;\n\tfor (let f = 0; f < 24; f++) {\n\t\tconst size = filterSizes[f];\n\t\tmetaData[f * 4] = size;\n\t\tmetaData[f * 4 + 1] = currentOffset;\n\t\tmetaData[f * 4 + 2] = 0;\n\t\tmetaData[f * 4 + 3] = 0;\n\t\tcurrentOffset += size;\n\t}\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, REVERB_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\troomSizeInternal,\n\t\tdampingInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\twidthInternal,\n\t\thasRoomSizeSig,\n\t\thasDampingSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\thasWidthSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, metaData, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: reverbAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DCFjIwTB.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-C9bcEaBE.mjs","names":[],"sources":["../../../nodes/node-audio-reverb/dist/renderers-DCFjIwTB.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"roomSize\",\n\t\"damping\",\n\t\"wet\",\n\t\"dry\",\n\t\"width\"\n];\nconst REVERB_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n roomSize : f32,\n damping : f32,\n wet : f32,\n dry : f32,\n width : f32,\n hasRoomSizeSig : f32,\n hasDampingSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n hasWidthSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> roomSizeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> dampingSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\n@group(0) @binding(8) var<storage, read> widthSignal : array<f32>;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let fixedgain: f32 = 0.015f;\n\n var bufIndices: array<u32, 24>;\n var filterStores: array<f32, 24>;\n var sizes: array<u32, 24>;\n var startOffsets: array<u32, 24>;\n\n for (var f = 0u; f < 24u; f = f + 1u) {\n let metaOffset = f * 4u;\n sizes[f] = u32(state[metaOffset]);\n startOffsets[f] = u32(state[metaOffset + 1u]);\n bufIndices[f] = u32(state[metaOffset + 2u]);\n var fs = state[metaOffset + 3u];\n if (is_nan_or_inf(fs)) { fs = 0.0f; }\n filterStores[f] = fs;\n }\n\n if (numChannels == 1u) {\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // Dynamic parameter signal evaluation\n var effRoomSize = u.roomSize;\n if (u.hasRoomSizeSig > 0.5f) { effRoomSize = roomSizeSignal[index]; }\n effRoomSize = clamp(effRoomSize, 0.0f, 0.98f);\n\n var effDamping = u.damping;\n if (u.hasDampingSig > 0.5f) { effDamping = dampingSignal[index]; }\n effDamping = clamp(effDamping, 0.0f, 1.0f) * 0.4f;\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) { effWet = wetSignal[index]; }\n effWet = clamp(effWet, 0.0f, 1.0f) * 3.0f;\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) { effDry = drySignal[index]; }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n var x = inputChannels[index];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n let inputVal = x * fixedgain;\n\n var combSum = 0.0f;\n for (var j = 0u; j < 8u; j = j + 1u) {\n let size = sizes[j];\n let startOffset = startOffsets[j];\n let bufferIndex = bufIndices[j];\n var fs = filterStores[j];\n\n var output = state[startOffset + bufferIndex];\n if (is_nan_or_inf(output)) { output = 0.0f; }\n\n fs = output * (1.0f - effDamping) + fs * effDamping;\n var nextVal = inputVal + fs * effRoomSize;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n bufIndices[j] = (bufferIndex + 1u) % size;\n filterStores[j] = fs;\n combSum = combSum + output;\n }\n\n var revOut = combSum;\n for (var j = 0u; j < 4u; j = j + 1u) {\n let f = 8u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n\n var bufOut = state[startOffset + bufferIndex];\n if (is_nan_or_inf(bufOut)) { bufOut = 0.0f; }\n\n var nextVal = revOut + bufOut * 0.5f;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n let output = bufOut - revOut;\n bufIndices[f] = (bufferIndex + 1u) % size;\n revOut = output;\n }\n\n var outVal = x * effDry + revOut * effWet;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) { outVal = 1.0f; }\n else if (outVal < -1.0f) { outVal = -1.0f; }\n else if (outVal > 0.9f) { outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f); }\n else if (outVal < -0.9f) { outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f); }\n\n outputChannels[index] = outVal;\n }\n } else {\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // Dynamic parameter signal evaluation\n var effRoomSize = u.roomSize;\n if (u.hasRoomSizeSig > 0.5f) { effRoomSize = roomSizeSignal[index]; }\n effRoomSize = clamp(effRoomSize, 0.0f, 0.98f);\n\n var effDamping = u.damping;\n if (u.hasDampingSig > 0.5f) { effDamping = dampingSignal[index]; }\n effDamping = clamp(effDamping, 0.0f, 1.0f) * 0.4f;\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) { effWet = wetSignal[index]; }\n effWet = clamp(effWet, 0.0f, 1.0f) * 3.0f;\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) { effDry = drySignal[index]; }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n var effWidth = u.width;\n if (u.hasWidthSig > 0.5f) { effWidth = widthSignal[index]; }\n effWidth = clamp(effWidth, 0.0f, 1.0f);\n\n let wet1 = effWet * (effWidth / 2.0f + 0.5f);\n let wet2 = effWet * ((1.0f - effWidth) / 2.0f);\n\n var inputL = inputChannels[index];\n if (is_nan_or_inf(inputL)) { inputL = 0.0f; }\n var inputR = inputChannels[numSamples + index];\n if (is_nan_or_inf(inputR)) { inputR = 0.0f; }\n\n let inputVal = (inputL + inputR) * fixedgain;\n\n // Left channel (Filters 0-11)\n var combSumL = 0.0f;\n for (var j = 0u; j < 8u; j = j + 1u) {\n let size = sizes[j];\n let startOffset = startOffsets[j];\n let bufferIndex = bufIndices[j];\n var fs = filterStores[j];\n\n var output = state[startOffset + bufferIndex];\n if (is_nan_or_inf(output)) { output = 0.0f; }\n\n fs = output * (1.0f - effDamping) + fs * effDamping;\n var nextVal = inputVal + fs * effRoomSize;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n bufIndices[j] = (bufferIndex + 1u) % size;\n filterStores[j] = fs;\n combSumL = combSumL + output;\n }\n var revOutL = combSumL;\n for (var j = 0u; j < 4u; j = j + 1u) {\n let f = 8u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n\n var bufOut = state[startOffset + bufferIndex];\n if (is_nan_or_inf(bufOut)) { bufOut = 0.0f; }\n\n var nextVal = revOutL + bufOut * 0.5f;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n let output = bufOut - revOutL;\n bufIndices[f] = (bufferIndex + 1u) % size;\n revOutL = output;\n }\n\n // Right channel (Filters 12-23)\n var combSumR = 0.0f;\n for (var j = 0u; j < 8u; j = j + 1u) {\n let f = 12u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n var fs = filterStores[f];\n\n var output = state[startOffset + bufferIndex];\n if (is_nan_or_inf(output)) { output = 0.0f; }\n\n fs = output * (1.0f - effDamping) + fs * effDamping;\n var nextVal = inputVal + fs * effRoomSize;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n bufIndices[f] = (bufferIndex + 1u) % size;\n filterStores[f] = fs;\n combSumR = combSumR + output;\n }\n var revOutR = combSumR;\n for (var j = 0u; j < 4u; j = j + 1u) {\n let f = 20u + j;\n let size = sizes[f];\n let startOffset = startOffsets[f];\n let bufferIndex = bufIndices[f];\n\n var bufOut = state[startOffset + bufferIndex];\n if (is_nan_or_inf(bufOut)) { bufOut = 0.0f; }\n\n var nextVal = revOutR + bufOut * 0.5f;\n if (is_nan_or_inf(nextVal)) { nextVal = 0.0f; }\n state[startOffset + bufferIndex] = clamp(nextVal, -4.0f, 4.0f);\n\n let output = bufOut - revOutR;\n bufIndices[f] = (bufferIndex + 1u) % size;\n revOutR = output;\n }\n\n var outL = inputL * effDry + revOutL * wet1 + revOutR * wet2;\n var outR = inputR * effDry + revOutR * wet1 + revOutL * wet2;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n }\n\n for (var f = 0u; f < 24u; f = f + 1u) {\n let metaOffset = f * 4u;\n state[metaOffset + 2u] = f32(bufIndices[f]);\n state[metaOffset + 3u] = filterStores[f];\n }\n}\n`;\nconst leftCombLengths = [\n\t1116,\n\t1188,\n\t1277,\n\t1356,\n\t1422,\n\t1491,\n\t1557,\n\t1617\n];\nconst leftAllpassLengths = [\n\t556,\n\t441,\n\t341,\n\t225\n];\nconst reverbAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Reverb.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst roomSizeInternal = Math.max(0, Math.min(resolveNumber(op.roomSize, .5), .98));\n\tconst dampingInternal = Math.max(0, Math.min(resolveNumber(op.damping, .5), 1));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst widthInternal = Math.max(0, Math.min(resolveNumber(op.width, 1), 1));\n\tconst hasRoomSizeSig = isHandleConnected(op, \"roomSizeHandleId\") ? 1 : 0;\n\tconst hasDampingSig = isHandleConnected(op, \"dampingHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(op, \"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(op, \"dryHandleId\") ? 1 : 0;\n\tconst hasWidthSig = isHandleConnected(op, \"widthHandleId\") ? 1 : 0;\n\tconst scale = sampleRate / 44100;\n\tconst nodeId = op.id || \"audio-reverb\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst sizesL = [];\n\tconst sizesR = [];\n\tleftCombLengths.forEach((len) => {\n\t\tsizesL.push(Math.round(len * scale));\n\t});\n\tleftCombLengths.forEach((len) => {\n\t\tsizesR.push(Math.round((len + 23) * scale));\n\t});\n\tleftAllpassLengths.forEach((len) => {\n\t\tsizesL.push(Math.round(len * scale));\n\t});\n\tleftAllpassLengths.forEach((len) => {\n\t\tsizesR.push(Math.round((len + 23) * scale));\n\t});\n\tconst totalMetadataFloats = 96;\n\tlet totalDelaySamples = 0;\n\tconst filterSizes = [...sizesL, ...sizesR];\n\tfor (const size of filterSizes) totalDelaySamples += size;\n\tconst stateFloatCount = totalMetadataFloats + totalDelaySamples;\n\tconst metaData = new Float32Array(totalMetadataFloats);\n\tlet currentOffset = totalMetadataFloats;\n\tfor (let f = 0; f < 24; f++) {\n\t\tconst size = filterSizes[f];\n\t\tmetaData[f * 4] = size;\n\t\tmetaData[f * 4 + 1] = currentOffset;\n\t\tmetaData[f * 4 + 2] = 0;\n\t\tmetaData[f * 4 + 3] = 0;\n\t\tcurrentOffset += size;\n\t}\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, REVERB_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\troomSizeInternal,\n\t\tdampingInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\twidthInternal,\n\t\thasRoomSizeSig,\n\t\thasDampingSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\thasWidthSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, metaData, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: reverbAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DCFjIwTB.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import "./dist-Wsjx_Rza.mjs";
3
- import { n as renderers_default, t as ColorBalanceWebGPURenderer } from "./renderer-CLvXiFPk.mjs";
2
+ import "./dist-BHTd-EC1.mjs";
3
+ import { n as renderers_default, t as ColorBalanceWebGPURenderer } from "./renderer-BHUjPi24.mjs";
4
4
 
5
5
  export { ColorBalanceWebGPURenderer, renderers_default as default };
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
2
- import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture } from "./gpu-BvYDrqOC.mjs";
2
+ import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture } from "./gpu-zIhSz_0X.mjs";
3
3
 
4
4
  //#region ../../nodes/node-mesh-warp/dist/renderers-OcO6N-y5.mjs
5
5
  function createUniformGrid(cols, rows) {
@@ -223,4 +223,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: MeshWarpWebGPURenderer
223
223
 
224
224
  //#endregion
225
225
  export { renderers_default as t };
226
- //# sourceMappingURL=renderer-GNgSEbBu.mjs.map
226
+ //# sourceMappingURL=renderer-CAhsBEpU.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-GNgSEbBu.mjs","names":[],"sources":["../../../nodes/node-mesh-warp/dist/renderers-OcO6N-y5.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { beginTargetPass, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/shared/utils.ts\nfunction createUniformGrid(cols, rows) {\n\tconst points = [];\n\tfor (let r = 0; r < rows; r++) {\n\t\tconst y = r / (rows - 1) * 100;\n\t\tfor (let c = 0; c < cols; c++) {\n\t\t\tconst x = c / (cols - 1) * 100;\n\t\t\tpoints.push({\n\t\t\t\tx,\n\t\t\t\ty\n\t\t\t});\n\t\t}\n\t}\n\treturn points;\n}\nfunction interpolateGridPoint(u, v, oldPoints, oldCols, oldRows) {\n\tconst px = u * (oldCols - 1);\n\tconst py = v * (oldRows - 1);\n\tconst x0 = Math.floor(px);\n\tconst x1 = Math.min(oldCols - 1, x0 + 1);\n\tconst y0 = Math.floor(py);\n\tconst y1 = Math.min(oldRows - 1, y0 + 1);\n\tconst tx = px - x0;\n\tconst ty = py - y0;\n\tconst p00 = oldPoints[y0 * oldCols + x0];\n\tconst p10 = oldPoints[y0 * oldCols + x1];\n\tconst p01 = oldPoints[y1 * oldCols + x0];\n\tconst p11 = oldPoints[y1 * oldCols + x1];\n\tif (!p00 || !p10 || !p01 || !p11) return {\n\t\tx: u * 100,\n\t\ty: v * 100\n\t};\n\treturn {\n\t\tx: (1 - tx) * (1 - ty) * p00.x + tx * (1 - ty) * p10.x + (1 - tx) * ty * p01.x + tx * ty * p11.x,\n\t\ty: (1 - tx) * (1 - ty) * p00.y + tx * (1 - ty) * p10.y + (1 - tx) * ty * p01.y + tx * ty * p11.y\n\t};\n}\nfunction resizeGrid(oldPoints, oldCols, oldRows, newCols, newRows) {\n\tif (!oldPoints || oldPoints.length !== oldCols * oldRows) return createUniformGrid(newCols, newRows);\n\tconst points = [];\n\tfor (let r = 0; r < newRows; r++) {\n\t\tconst v = r / (newRows - 1);\n\t\tfor (let c = 0; c < newCols; c++) {\n\t\t\tconst u = c / (newCols - 1);\n\t\t\tpoints.push(interpolateGridPoint(u, v, oldPoints, oldCols, oldRows));\n\t\t}\n\t}\n\treturn points;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst meshWarpWgsl = `\nstruct MeshUniforms {\n\tgridSize : vec2<f32>,\n\tlayerSize : vec2<f32>,\n\tmatrix_col0 : vec4<f32>,\n\tmatrix_col1 : vec4<f32>,\n\tpoints : array<vec4<f32>, 144>,\n};\n\n@group(0) @binding(0) var<uniform> u : MeshUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tlet cols = u32(u.gridSize.x);\n\tlet rows = u32(u.gridSize.y);\n\t\n\tlet cellsCol = cols - 1u;\n\tlet cellsRow = rows - 1u;\n\tlet totalCells = cellsCol * cellsRow;\n\t\n\tlet cellIndex = vi / 6u;\n\tlet vertexInCell = vi % 6u;\n\t\n\tif (cellIndex >= totalCells) {\n\t\treturn VSOut(vec4<f32>(0.0), vec4<f32>(0.0).xy);\n\t}\n\t\n\tlet cellC = cellIndex % cellsCol;\n\tlet cellR = cellIndex / cellsCol;\n\t\n\tvar colOffset = 0u;\n\tvar rowOffset = 0u;\n\t\n\t// Mapping vertex index in cell to quad corner offset\n\t// Triangle 1: TL (0,0), TR (1,0), BL (0,1)\n\t// Triangle 2: TR (1,0), BR (1,1), BL (0,1)\n\tif (vertexInCell == 1u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 2u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 3u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 4u) { // BR\n\t\tcolOffset = 1u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 5u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t}\n\t// Vertex 0 is TL (colOffset=0, rowOffset=0)\n\t\n\tlet gridC = cellC + colOffset;\n\tlet gridR = cellR + rowOffset;\n\t\n\tlet pointIndex = gridR * cols + gridC;\n\tlet warpedPoint = u.points[pointIndex].xy;\n\t\n\tlet lx = (warpedPoint.x / 100.0) * u.layerSize.x;\n\tlet ly = (warpedPoint.y / 100.0) * u.layerSize.y;\n\t\n\tlet tx = u.matrix_col0.x * lx + u.matrix_col0.y * ly + u.matrix_col0.z;\n\tlet ty = u.matrix_col1.x * lx + u.matrix_col1.y * ly + u.matrix_col1.z;\n\t\n\tlet targetW = u.matrix_col0.w;\n\tlet targetH = u.matrix_col1.w;\n\t\n\tlet x_clip = (tx / targetW) * 2.0 - 1.0;\n\tlet y_clip = 1.0 - (ty / targetH) * 2.0;\n\t\n\tlet u_coord = f32(gridC) / f32(cellsCol);\n\tlet v_coord = f32(gridR) / f32(cellsRow);\n\t\n\treturn VSOut(vec4<f32>(x_clip, y_clip, 0.0, 1.0), vec2<f32>(u_coord, v_coord));\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\treturn color;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getMeshWarpResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst warpUniformLayout = device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] });\n\t\tconst warpTextureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"mesh_warp.wgsl\",\n\t\t\tcode: meshWarpWgsl\n\t\t});\n\t\tres = {\n\t\t\twarpPipeline: device.createRenderPipeline({\n\t\t\t\tlabel: \"MeshWarpPipeline\",\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [warpUniformLayout, warpTextureLayout] }),\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: [{\n\t\t\t\t\t\tformat,\n\t\t\t\t\t\tblend: {\n\t\t\t\t\t\t\tcolor: {\n\t\t\t\t\t\t\t\tsrcFactor: \"src-alpha\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\talpha: {\n\t\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t\t}),\n\t\t\twarpUniformLayout,\n\t\t\twarpTextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst MeshWarpWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetWidth, targetHeight } = args;\n\tconst { virtualMedia } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"MeshWarp\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst sourceWidth = op.originalWidth ?? childMedia.metadata?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = op.originalHeight ?? childMedia.metadata?.height ?? props.containerHeight ?? targetHeight;\n\targs.pass.end();\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight\n\t\t}\n\t});\n\tconst cols = Number(op.cols) || 3;\n\tconst rows = Number(op.rows) || 3;\n\tconst points = op.points || [];\n\tconst finalPoints = points.length === cols * rows ? points : createUniformGrid(cols, rows);\n\tconst maxPoints = 144;\n\tconst uniformData = new Float32Array(12 + maxPoints * 4);\n\tuniformData[0] = cols;\n\tuniformData[1] = rows;\n\tuniformData[2] = props.containerWidth ?? sourceWidth;\n\tuniformData[3] = props.containerHeight ?? sourceHeight;\n\tconst matrix = ctx.renderer.getCurrentTransform();\n\tuniformData[4] = matrix.a;\n\tuniformData[5] = matrix.c;\n\tuniformData[6] = matrix.e;\n\tuniformData[7] = targetWidth;\n\tuniformData[8] = matrix.b;\n\tuniformData[9] = matrix.d;\n\tuniformData[10] = matrix.f;\n\tuniformData[11] = targetHeight;\n\tfor (let i = 0; i < maxPoints; i++) {\n\t\tconst pt = finalPoints[i] || {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tuniformData[12 + i * 4] = pt.x;\n\t\tuniformData[12 + i * 4 + 1] = pt.y;\n\t}\n\tconst { warpPipeline: pipeline, warpUniformLayout: uLayout, warpTextureLayout: tLayout } = getMeshWarpResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uniformBindGroup = 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\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, childTex, sampler);\n\tconst outPass = beginTargetPass(args);\n\toutPass.setPipeline(pipeline);\n\toutPass.setBindGroup(0, uniformBindGroup);\n\toutPass.setBindGroup(1, textureBindGroup);\n\tconst vertexCount = (cols - 1) * (rows - 1) * 6;\n\toutPass.draw(vertexCount);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: MeshWarpWebGPURenderer });\n\n//#endregion\nexport { resizeGrid as i, createUniformGrid as n, interpolateGridPoint as r, renderers_default as t };\n//# sourceMappingURL=renderers-OcO6N-y5.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-CAhsBEpU.mjs","names":[],"sources":["../../../nodes/node-mesh-warp/dist/renderers-OcO6N-y5.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { beginTargetPass, drawChildToTexture, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/shared/utils.ts\nfunction createUniformGrid(cols, rows) {\n\tconst points = [];\n\tfor (let r = 0; r < rows; r++) {\n\t\tconst y = r / (rows - 1) * 100;\n\t\tfor (let c = 0; c < cols; c++) {\n\t\t\tconst x = c / (cols - 1) * 100;\n\t\t\tpoints.push({\n\t\t\t\tx,\n\t\t\t\ty\n\t\t\t});\n\t\t}\n\t}\n\treturn points;\n}\nfunction interpolateGridPoint(u, v, oldPoints, oldCols, oldRows) {\n\tconst px = u * (oldCols - 1);\n\tconst py = v * (oldRows - 1);\n\tconst x0 = Math.floor(px);\n\tconst x1 = Math.min(oldCols - 1, x0 + 1);\n\tconst y0 = Math.floor(py);\n\tconst y1 = Math.min(oldRows - 1, y0 + 1);\n\tconst tx = px - x0;\n\tconst ty = py - y0;\n\tconst p00 = oldPoints[y0 * oldCols + x0];\n\tconst p10 = oldPoints[y0 * oldCols + x1];\n\tconst p01 = oldPoints[y1 * oldCols + x0];\n\tconst p11 = oldPoints[y1 * oldCols + x1];\n\tif (!p00 || !p10 || !p01 || !p11) return {\n\t\tx: u * 100,\n\t\ty: v * 100\n\t};\n\treturn {\n\t\tx: (1 - tx) * (1 - ty) * p00.x + tx * (1 - ty) * p10.x + (1 - tx) * ty * p01.x + tx * ty * p11.x,\n\t\ty: (1 - tx) * (1 - ty) * p00.y + tx * (1 - ty) * p10.y + (1 - tx) * ty * p01.y + tx * ty * p11.y\n\t};\n}\nfunction resizeGrid(oldPoints, oldCols, oldRows, newCols, newRows) {\n\tif (!oldPoints || oldPoints.length !== oldCols * oldRows) return createUniformGrid(newCols, newRows);\n\tconst points = [];\n\tfor (let r = 0; r < newRows; r++) {\n\t\tconst v = r / (newRows - 1);\n\t\tfor (let c = 0; c < newCols; c++) {\n\t\t\tconst u = c / (newCols - 1);\n\t\t\tpoints.push(interpolateGridPoint(u, v, oldPoints, oldCols, oldRows));\n\t\t}\n\t}\n\treturn points;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst meshWarpWgsl = `\nstruct MeshUniforms {\n\tgridSize : vec2<f32>,\n\tlayerSize : vec2<f32>,\n\tmatrix_col0 : vec4<f32>,\n\tmatrix_col1 : vec4<f32>,\n\tpoints : array<vec4<f32>, 144>,\n};\n\n@group(0) @binding(0) var<uniform> u : MeshUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tlet cols = u32(u.gridSize.x);\n\tlet rows = u32(u.gridSize.y);\n\t\n\tlet cellsCol = cols - 1u;\n\tlet cellsRow = rows - 1u;\n\tlet totalCells = cellsCol * cellsRow;\n\t\n\tlet cellIndex = vi / 6u;\n\tlet vertexInCell = vi % 6u;\n\t\n\tif (cellIndex >= totalCells) {\n\t\treturn VSOut(vec4<f32>(0.0), vec4<f32>(0.0).xy);\n\t}\n\t\n\tlet cellC = cellIndex % cellsCol;\n\tlet cellR = cellIndex / cellsCol;\n\t\n\tvar colOffset = 0u;\n\tvar rowOffset = 0u;\n\t\n\t// Mapping vertex index in cell to quad corner offset\n\t// Triangle 1: TL (0,0), TR (1,0), BL (0,1)\n\t// Triangle 2: TR (1,0), BR (1,1), BL (0,1)\n\tif (vertexInCell == 1u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 2u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 3u) { // TR\n\t\tcolOffset = 1u;\n\t\trowOffset = 0u;\n\t} else if (vertexInCell == 4u) { // BR\n\t\tcolOffset = 1u;\n\t\trowOffset = 1u;\n\t} else if (vertexInCell == 5u) { // BL\n\t\tcolOffset = 0u;\n\t\trowOffset = 1u;\n\t}\n\t// Vertex 0 is TL (colOffset=0, rowOffset=0)\n\t\n\tlet gridC = cellC + colOffset;\n\tlet gridR = cellR + rowOffset;\n\t\n\tlet pointIndex = gridR * cols + gridC;\n\tlet warpedPoint = u.points[pointIndex].xy;\n\t\n\tlet lx = (warpedPoint.x / 100.0) * u.layerSize.x;\n\tlet ly = (warpedPoint.y / 100.0) * u.layerSize.y;\n\t\n\tlet tx = u.matrix_col0.x * lx + u.matrix_col0.y * ly + u.matrix_col0.z;\n\tlet ty = u.matrix_col1.x * lx + u.matrix_col1.y * ly + u.matrix_col1.z;\n\t\n\tlet targetW = u.matrix_col0.w;\n\tlet targetH = u.matrix_col1.w;\n\t\n\tlet x_clip = (tx / targetW) * 2.0 - 1.0;\n\tlet y_clip = 1.0 - (ty / targetH) * 2.0;\n\t\n\tlet u_coord = f32(gridC) / f32(cellsCol);\n\tlet v_coord = f32(gridR) / f32(cellsRow);\n\t\n\treturn VSOut(vec4<f32>(x_clip, y_clip, 0.0, 1.0), vec2<f32>(u_coord, v_coord));\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\treturn color;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getMeshWarpResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (!res) {\n\t\tconst warpUniformLayout = device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] });\n\t\tconst warpTextureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"mesh_warp.wgsl\",\n\t\t\tcode: meshWarpWgsl\n\t\t});\n\t\tres = {\n\t\t\twarpPipeline: device.createRenderPipeline({\n\t\t\t\tlabel: \"MeshWarpPipeline\",\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [warpUniformLayout, warpTextureLayout] }),\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: [{\n\t\t\t\t\t\tformat,\n\t\t\t\t\t\tblend: {\n\t\t\t\t\t\t\tcolor: {\n\t\t\t\t\t\t\t\tsrcFactor: \"src-alpha\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\talpha: {\n\t\t\t\t\t\t\t\tsrcFactor: \"one\",\n\t\t\t\t\t\t\t\tdstFactor: \"one-minus-src-alpha\",\n\t\t\t\t\t\t\t\toperation: \"add\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t\t}),\n\t\t\twarpUniformLayout,\n\t\t\twarpTextureLayout\n\t\t};\n\t\tdeviceResourceCache.set(device, res);\n\t}\n\treturn res;\n}\nconst MeshWarpWebGPURenderer = async (args) => {\n\tconst { ctx, props, targetWidth, targetHeight } = args;\n\tconst { virtualMedia } = props;\n\tconst op = virtualMedia?.operation;\n\tif (!op || op.op !== \"MeshWarp\") return;\n\tconst childMedia = virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tconst sourceWidth = op.originalWidth ?? childMedia.metadata?.width ?? props.containerWidth ?? targetWidth;\n\tconst sourceHeight = op.originalHeight ?? childMedia.metadata?.height ?? props.containerHeight ?? targetHeight;\n\targs.pass.end();\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight\n\t\t}\n\t});\n\tconst cols = Number(op.cols) || 3;\n\tconst rows = Number(op.rows) || 3;\n\tconst points = op.points || [];\n\tconst finalPoints = points.length === cols * rows ? points : createUniformGrid(cols, rows);\n\tconst maxPoints = 144;\n\tconst uniformData = new Float32Array(12 + maxPoints * 4);\n\tuniformData[0] = cols;\n\tuniformData[1] = rows;\n\tuniformData[2] = props.containerWidth ?? sourceWidth;\n\tuniformData[3] = props.containerHeight ?? sourceHeight;\n\tconst matrix = ctx.renderer.getCurrentTransform();\n\tuniformData[4] = matrix.a;\n\tuniformData[5] = matrix.c;\n\tuniformData[6] = matrix.e;\n\tuniformData[7] = targetWidth;\n\tuniformData[8] = matrix.b;\n\tuniformData[9] = matrix.d;\n\tuniformData[10] = matrix.f;\n\tuniformData[11] = targetHeight;\n\tfor (let i = 0; i < maxPoints; i++) {\n\t\tconst pt = finalPoints[i] || {\n\t\t\tx: 0,\n\t\t\ty: 0\n\t\t};\n\t\tuniformData[12 + i * 4] = pt.x;\n\t\tuniformData[12 + i * 4 + 1] = pt.y;\n\t}\n\tconst { warpPipeline: pipeline, warpUniformLayout: uLayout, warpTextureLayout: tLayout } = getMeshWarpResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uniformBindGroup = 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\tconst textureBindGroup = ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, childTex, sampler);\n\tconst outPass = beginTargetPass(args);\n\toutPass.setPipeline(pipeline);\n\toutPass.setBindGroup(0, uniformBindGroup);\n\toutPass.setBindGroup(1, textureBindGroup);\n\tconst vertexCount = (cols - 1) * (rows - 1) * 6;\n\toutPass.draw(vertexCount);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: MeshWarpWebGPURenderer });\n\n//#endregion\nexport { resizeGrid as i, createUniformGrid as n, interpolateGridPoint as r, renderers_default as t };\n//# sourceMappingURL=renderers-OcO6N-y5.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-BHTd-EC1.mjs";
3
+ import { n as renderers_default, t as WebGPURenderer } from "./renderer-C6TbU8U5.mjs";
4
+
5
+ export { WebGPURenderer, renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { c as resolveSignalField, n as defineRenderer } from "./renderer-BgmO1Dzw.mjs";
2
- import { In as signalRegistry, q as parseColor } from "./dist-Wsjx_Rza.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 } from "./gpu-BvYDrqOC.mjs";
2
+ import { In as signalRegistry, q as parseColor } from "./dist-BHTd-EC1.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 } from "./gpu-zIhSz_0X.mjs";
4
4
 
5
5
  //#region ../../nodes/node-refraction-caustics/dist/renderers-BuTkLbVU.mjs
6
6
  const REFRACTION_CAUSTICS_SHADER = `
@@ -563,4 +563,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: RefractionCaustics3DWeb
563
563
 
564
564
  //#endregion
565
565
  export { renderers_default as n, RefractionCaustics3DWebGPURenderer as t };
566
- //# sourceMappingURL=renderer-876_ArdD.mjs.map
566
+ //# sourceMappingURL=renderer-CCH0gSF7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-876_ArdD.mjs","names":[],"sources":["../../../nodes/node-refraction-caustics/dist/renderers-BuTkLbVU.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst REFRACTION_CAUSTICS_SHADER = `\nstruct RefractionCausticsUniforms {\n // vec4 0\n _pad0 : f32,\n ior : f32,\n dispersion : f32,\n refractionScale : f32,\n\n // vec4 1\n causticBrightness : f32,\n causticScale : f32,\n fluidRipples : f32,\n rippleSpeed : f32,\n\n // vec4 2\n roughness : f32,\n specularIntensity : f32,\n lightPosX : f32,\n lightPosY : f32,\n\n // vec4 3\n tintStrength : f32,\n depthInvert : f32,\n depthScale : f32,\n hasDepthMap : f32,\n\n // vec4 4\n timeProgress : f32,\n aspect : f32,\n _pad1 : f32,\n _pad2 : f32,\n\n // vec4 5: signal flags\n hasSigIOR : f32,\n hasSigDispersion : f32,\n hasSigRefractScale : f32,\n hasSigCaustic : f32,\n\n // vec4 6: signal flags\n hasSigRipples : f32,\n hasSigRoughness : f32,\n hasSigLightPosX : f32,\n hasSigLightPosY : f32,\n\n // vec4 7: reserved\n _pad3 : f32,\n _pad4 : f32,\n _pad5 : f32,\n _pad6 : f32,\n\n // vec4 8: color\n tintColor : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RefractionCausticsUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n\n@group(2) @binding(0) var depthTex : texture_2d<f32>;\n@group(2) @binding(1) var depthSamp : sampler;\n\n@group(3) @binding(0) var iorSigTex : texture_2d<f32>;\n@group(3) @binding(1) var dispersionSigTex : texture_2d<f32>;\n@group(3) @binding(2) var refractScaleSigTex : texture_2d<f32>;\n@group(3) @binding(3) var causticSigTex : texture_2d<f32>;\n@group(3) @binding(4) var ripplesSigTex : texture_2d<f32>;\n@group(3) @binding(5) var roughnessSigTex : texture_2d<f32>;\n@group(3) @binding(6) var lightPosXSigTex : texture_2d<f32>;\n@group(3) @binding(7) var lightPosYSigTex : texture_2d<f32>;\n@group(3) @binding(8) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn sampleDepth(uv: vec2<f32>) -> f32 {\n let clampedUV = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n var raw: f32 = 0.0;\n if (u.hasDepthMap > 0.5) {\n let dSample = textureSampleLevel(depthTex, depthSamp, clampedUV, 0.0);\n raw = dot(dSample.rgb, vec3<f32>(0.299, 0.587, 0.114));\n } else {\n let c = textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n raw = dot(c.rgb, vec3<f32>(0.299, 0.587, 0.114));\n }\n if (u.depthInvert > 0.5) {\n raw = 1.0 - raw;\n }\n return clamp(raw, 0.0, 1.0);\n}\n\nfn sampleSmoothDepth(uv: vec2<f32>, texelSize: vec2<f32>) -> f32 {\n let d0 = sampleDepth(uv);\n let d1 = sampleDepth(uv + vec2<f32>(texelSize.x, 0.0));\n let d2 = sampleDepth(uv - vec2<f32>(texelSize.x, 0.0));\n let d3 = sampleDepth(uv + vec2<f32>(0.0, texelSize.y));\n let d4 = sampleDepth(uv - vec2<f32>(0.0, texelSize.y));\n return (d0 * 4.0 + d1 + d2 + d3 + d4) * 0.125;\n}\n\n// Analytical fluid ripple wave height and normal gradient\nfn getFluidWave(uv: vec2<f32>, time: f32, freqScale: f32) -> vec3<f32> {\n let p = uv * freqScale * 18.0;\n let t = time * 3.0;\n\n let a1 = sin(p.x * 1.4 + p.y * 1.0 + t * 1.2);\n let a2 = sin(p.x * -1.8 + p.y * 1.6 + t * 0.9);\n let a3 = cos((p.x + p.y) * 2.2 - t * 1.4);\n\n let height = (a1 + a2 + a3) * 0.333;\n\n let dx = (1.4 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n - 1.8 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n let dy = (1.0 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n + 1.6 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n return vec3<f32>(dx, dy, height);\n}\n\n// Photometric cellular water caustic web (swimming pool / sunlight underwater filaments)\nfn getWaterCaustics(uv: vec2<f32>, time: f32, scale: f32) -> f32 {\n let p = uv * scale * 32.0;\n let t1 = time * 0.8;\n let t2 = time * 1.1;\n\n var p1 = p;\n p1.x = p1.x + sin(p.y * 0.45 + t1) * 1.6;\n p1.y = p1.y + cos(p.x * 0.45 + t1 * 0.8) * 1.6;\n\n var p2 = p * 1.2 + vec2<f32>(4.7, 2.1);\n p2.x = p2.x + cos(p2.y * 0.5 - t2 * 0.9) * 1.4;\n p2.y = p2.y + sin(p2.x * 0.5 + t2) * 1.4;\n\n let k1 = 1.0 - abs(sin(p1.x) * sin(p1.y));\n let k2 = 1.0 - abs(cos(p2.x) * cos(p2.y));\n\n // Sharp interconnected caustic web filaments\n let web = pow(k1 * k2, 3.5);\n return web;\n}\n\nfn computeSurfaceNormal(uv: vec2<f32>, texelSize: vec2<f32>, fluidRippleAmount: f32, rippleTime: f32, depthScaleVal: f32, causticScaleVal: f32) -> vec3<f32> {\n let step = texelSize * 2.0;\n let dL = sampleSmoothDepth(uv - vec2<f32>(step.x, 0.0), texelSize);\n let dR = sampleSmoothDepth(uv + vec2<f32>(step.x, 0.0), texelSize);\n let dD = sampleSmoothDepth(uv - vec2<f32>(0.0, step.y), texelSize);\n let dU = sampleSmoothDepth(uv + vec2<f32>(0.0, step.y), texelSize);\n\n var dx = (dR - dL) * depthScaleVal * 2.0;\n var dy = (dU - dD) * depthScaleVal * 2.0;\n\n if (fluidRippleAmount > 0.001) {\n let wave = getFluidWave(uv, rippleTime, causticScaleVal);\n dx = dx + wave.x * fluidRippleAmount * 0.08;\n dy = dy + wave.y * fluidRippleAmount * 0.08;\n }\n\n return normalize(vec3<f32>(-dx, -dy, 1.0));\n}\n\n// Snell's Law ray refraction with Total Internal Reflection (TIR) fallback\nfn calcRefractOffset(I: vec3<f32>, N: vec3<f32>, eta: f32, thickness: f32) -> vec2<f32> {\n let cosi = dot(-I, N);\n let cost2 = 1.0 - eta * eta * (1.0 - cosi * cosi);\n if (cost2 < 0.0) {\n // Total internal reflection -> reflect\n let R = reflect(I, N);\n return R.xy * thickness * 0.5;\n }\n let R = eta * I + (eta * cosi - sqrt(cost2)) * N;\n return R.xy * (thickness / max(0.2, abs(R.z)));\n}\n\nfn sampleAlbedoSafe(uv: vec2<f32>) -> vec4<f32> {\n if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) {\n return textureSampleLevel(srcTex, srcSamp, uv, 0.0);\n }\n // Mirror with subtle clamp for border inpainting / anti-tearing\n let mirroredUV = abs(fract(uv * 0.5 + 0.5) * 2.0 - 1.0);\n let clampedUV = clamp(mirroredUV, vec2<f32>(0.001), vec2<f32>(0.999));\n return textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n}\n\nfn spectralWavelength(t: f32) -> vec3<f32> {\n let x = clamp(t, 0.0, 1.0) * 6.0;\n var r: f32 = 0.0;\n var g: f32 = 0.0;\n var b: f32 = 0.0;\n\n if (x < 1.0) {\n r = 1.0;\n g = x;\n b = 0.0;\n } else if (x < 2.0) {\n r = 2.0 - x;\n g = 1.0;\n b = 0.0;\n } else if (x < 3.0) {\n r = 0.0;\n g = 1.0;\n b = x - 2.0;\n } else if (x < 4.0) {\n r = 0.0;\n g = 4.0 - x;\n b = 1.0;\n } else if (x < 5.0) {\n r = x - 4.0;\n g = 0.0;\n b = 1.0;\n } else {\n r = 1.0;\n g = 0.0;\n b = max(0.4, 6.0 - x);\n }\n return vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n let dims = vec2<f32>(textureDimensions(srcTex));\n let texelSize = vec2<f32>(1.0 / dims.x, 1.0 / dims.y);\n let aspect = select(u.aspect, dims.x / max(1.0, dims.y), u.aspect <= 0.0);\n\n // Resolve signals\n var ior = u.ior;\n if (u.hasSigIOR > 0.5) {\n ior = clamp(textureSampleLevel(iorSigTex, sigSamp, in.uv, 0.0).r, 1.0, 2.5);\n }\n\n var dispersion = u.dispersion;\n if (u.hasSigDispersion > 0.5) {\n dispersion = clamp(textureSampleLevel(dispersionSigTex, sigSamp, in.uv, 0.0).r, 0.0, 0.2);\n }\n\n var refractionScale = u.refractionScale;\n if (u.hasSigRefractScale > 0.5) {\n refractionScale = clamp(textureSampleLevel(refractScaleSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var causticBrightness = u.causticBrightness;\n if (u.hasSigCaustic > 0.5) {\n causticBrightness = clamp(textureSampleLevel(causticSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var fluidRipples = u.fluidRipples;\n if (u.hasSigRipples > 0.5) {\n fluidRipples = clamp(textureSampleLevel(ripplesSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var roughness = u.roughness;\n if (u.hasSigRoughness > 0.5) {\n roughness = clamp(textureSampleLevel(roughnessSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosX = u.lightPosX;\n if (u.hasSigLightPosX > 0.5) {\n lightPosX = clamp(textureSampleLevel(lightPosXSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosY = u.lightPosY;\n if (u.hasSigLightPosY > 0.5) {\n lightPosY = clamp(textureSampleLevel(lightPosYSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n let depthScaleVal = u.depthScale;\n let causticScaleVal = max(0.1, u.causticScale);\n let rippleSpeedVal = u.rippleSpeed;\n let rippleTime = u.timeProgress * rippleSpeedVal * 6.2831853;\n\n // Surface Normal & Incident Vectors\n let N = computeSurfaceNormal(in.uv, texelSize, fluidRipples, rippleTime, depthScaleVal, causticScaleVal);\n let I = vec3<f32>(0.0, 0.0, -1.0); // View vector towards surface\n let V = vec3<f32>(0.0, 0.0, 1.0); // View vector towards camera\n\n // Base Snell's Law Refraction\n let eta = 1.0 / max(1.001, ior);\n let refractVec = calcRefractOffset(I, N, eta, refractionScale * 0.16);\n let baseUV = in.uv + vec2<f32>(refractVec.x / aspect, refractVec.y);\n\n // Multi-Spectral Chromatic Rainbow Dispersion\n var accumColor = vec3<f32>(0.0);\n var accumWeight = vec3<f32>(0.0);\n var accumAlpha: f32 = 0.0;\n\n let dispersionStrength = dispersion * refractionScale * 0.6;\n let dispDirection = vec2<f32>(N.x / aspect, N.y);\n\n // 7-tap spectral rainbow integration across wavelength spectrum (Red -> Yellow -> Green -> Cyan -> Blue -> Violet)\n for (var s = 0; s < 7; s = s + 1) {\n let t = f32(s) / 6.0; // 0.0 (Red) to 1.0 (Violet)\n let specColor = spectralWavelength(t);\n let lambdaOffset = dispDirection * ((t - 0.5) * dispersionStrength);\n let sampleUV = baseUV + lambdaOffset;\n\n var sampledTex = sampleAlbedoSafe(sampleUV);\n\n // Microfacet frosted blur if roughness is enabled\n if (roughness > 0.005) {\n let blurRad = roughness * 0.018;\n let j1 = sampleAlbedoSafe(sampleUV + vec2<f32>(blurRad / aspect, blurRad * 0.5));\n let j2 = sampleAlbedoSafe(sampleUV - vec2<f32>(blurRad / aspect, blurRad * 0.5));\n sampledTex = (sampledTex * 2.0 + j1 + j2) * 0.25;\n }\n\n accumColor = accumColor + sampledTex.rgb * specColor;\n accumWeight = accumWeight + specColor;\n accumAlpha = accumAlpha + sampledTex.a;\n }\n\n let finalRefractedRGB = accumColor / max(accumWeight, vec3<f32>(0.001));\n let finalAlpha = accumAlpha / 7.0;\n\n // Incident light vector\n let lightPos3D = vec3<f32>((lightPosX - 0.5) * aspect, lightPosY - 0.5, 0.85);\n let surfPos3D = vec3<f32>((in.uv.x - 0.5) * aspect, in.uv.y - 0.5, 0.0);\n let L = normalize(lightPos3D - surfPos3D);\n\n // 1. Dynamic Fluid Caustics (active when fluidRipples > 0.001)\n var fluidCaustic = 0.0;\n if (fluidRipples > 0.001) {\n let web = getWaterCaustics(in.uv, rippleTime, causticScaleVal);\n let pLight = vec2<f32>(lightPosX, lightPosY);\n let distLight = length((in.uv - pLight) * vec2<f32>(aspect, 1.0));\n let lightAtt = 1.0 / (1.0 + distLight * distLight * 1.2);\n fluidCaustic = web * lightAtt * fluidRipples * causticBrightness * 0.45;\n }\n\n // 2. Specular Highlights & Fresnel Reflectance (Schlick's approximation)\n let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);\n let NdotV = max(dot(N, V), 0.0);\n let fresnel = f0 + (1.0 - f0) * pow(1.0 - NdotV, 5.0);\n\n let H = normalize(L + V);\n let NdotH = max(dot(N, H), 0.0);\n let specShininess = mix(256.0, 32.0, roughness);\n let specular = pow(NdotH, specShininess) * u.specularIntensity * fresnel * 1.5;\n\n // Glass Absorption & Tinting\n let tintStrengthVal = u.tintStrength;\n let tintedBase = mix(finalRefractedRGB, finalRefractedRGB * u.tintColor.rgb, tintStrengthVal);\n\n // Final Composite (Refracted Rainbow Spectrum + Fluid Caustics + Crisp Specular)\n let finalRGB = tintedBase + vec3<f32>(fluidCaustic) * u.tintColor.rgb + vec3<f32>(specular);\n\n return vec4<f32>(clamp(finalRGB, vec3<f32>(0.0), vec3<f32>(1.0)), finalAlpha);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\tsrcTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tdepthTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tsignalTextureLayout: texturesLayout(device, 8),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getRefractionCausticsResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `refraction_caustics_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `refraction_caustics_${format}.wgsl`,\n\t\t\tcode: REFRACTION_CAUSTICS_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `RefractionCausticsPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.srcTextureLayout,\n\t\t\t\tlayouts.depthTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsrcTextureLayout: layouts.srcTextureLayout,\n\t\tdepthTextureLayout: layouts.depthTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst RefractionCaustics3DWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 60;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"RefractionCaustics3D\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: srcTex } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t} });\n\targs.pass.end();\n\tconst depthMedia = op.depthMedia;\n\tlet depthTex;\n\tlet hasDepthMap = false;\n\tif (depthMedia) {\n\t\t({texture: depthTex} = await drawChildToTexture(args, depthMedia, {\n\t\t\tprops: {\n\t\t\t\t...props,\n\t\t\t\tvirtualMedia: depthMedia,\n\t\t\t\tcontainerWidth: width,\n\t\t\t\tcontainerHeight: height\n\t\t\t},\n\t\t\texclude: [srcTex]\n\t\t}));\n\t\targs.pass.end();\n\t\thasDepthMap = true;\n\t} else {\n\t\tdepthTex = srcTex;\n\t\thasDepthMap = false;\n\t}\n\tconst { pipeline, uniformLayout: uLayout, srcTextureLayout: srcLayout, depthTextureLayout: depthLayout, signalTextureLayout: sigLayout } = getRefractionCausticsResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps, 4);\n\tconst timeProgress = durationSeconds > 0 ? elapsedSeconds % durationSeconds / durationSeconds : 0;\n\tconst iorInfo = resolveSignalField(op, \"ior\", 1.52, 1, 2.5);\n\tconst dispersionInfo = resolveSignalField(op, \"dispersion\", .04, 0, .2);\n\tconst refractScaleInfo = resolveSignalField(op, \"refractionScale\", .5, 0, 2);\n\tconst causticInfo = resolveSignalField(op, \"causticBrightness\", .6, 0, 2);\n\tconst causticScaleInfo = resolveSignalField(op, \"causticScale\", 1, .1, 5);\n\tconst ripplesInfo = resolveSignalField(op, \"fluidRipples\", 0, 0, 1);\n\tconst roughnessInfo = resolveSignalField(op, \"roughness\", 0, 0, 1);\n\tconst lightPosXInfo = resolveSignalField(op, \"lightPosX\", .5, 0, 1);\n\tconst lightPosYInfo = resolveSignalField(op, \"lightPosY\", .2, 0, 1);\n\tconst specularInfo = resolveSignalField(op, \"specularIntensity\", .8, 0, 2);\n\tconst depthScaleInfo = resolveSignalField(op, \"depthScale\", 1, .1, 5);\n\tconst tintStrengthInfo = resolveSignalField(op, \"tintStrength\", 0, 0, 1);\n\tconst rippleSpeedInfo = resolveSignalField(op, \"rippleSpeed\", 1, 0, 5);\n\tconst getSigTextureView = (info, fallbackId) => {\n\t\tif (info.hasSignal && info.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, info.sd.nodeId ?? fallbackId, elapsedSeconds, durationSeconds, info.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst sigIORView = getSigTextureView(iorInfo, \"refr_ior_sig\");\n\tconst sigDispersionView = getSigTextureView(dispersionInfo, \"refr_disp_sig\");\n\tconst sigRefractScaleView = getSigTextureView(refractScaleInfo, \"refr_scale_sig\");\n\tconst sigCausticView = getSigTextureView(causticInfo, \"refr_caust_sig\");\n\tconst sigRipplesView = getSigTextureView(ripplesInfo, \"refr_rip_sig\");\n\tconst sigRoughnessView = getSigTextureView(roughnessInfo, \"refr_rough_sig\");\n\tconst sigLightPosXView = getSigTextureView(lightPosXInfo, \"refr_lightx_sig\");\n\tconst sigLightPosYView = getSigTextureView(lightPosYInfo, \"refr_lighty_sig\");\n\tconst uniformData = new Float32Array(36);\n\tuniformData[0] = 0;\n\tuniformData[1] = iorInfo.value;\n\tuniformData[2] = dispersionInfo.value;\n\tuniformData[3] = refractScaleInfo.value;\n\tuniformData[4] = causticInfo.value;\n\tuniformData[5] = causticScaleInfo.value;\n\tuniformData[6] = ripplesInfo.value;\n\tuniformData[7] = rippleSpeedInfo.value;\n\tuniformData[8] = roughnessInfo.value;\n\tuniformData[9] = specularInfo.value;\n\tuniformData[10] = lightPosXInfo.value;\n\tuniformData[11] = lightPosYInfo.value;\n\tuniformData[12] = tintStrengthInfo.value;\n\tuniformData[13] = op.depthInvert ? 1 : 0;\n\tuniformData[14] = depthScaleInfo.value;\n\tuniformData[15] = hasDepthMap ? 1 : 0;\n\tuniformData[16] = timeProgress;\n\tuniformData[17] = width / Math.max(1, height);\n\tuniformData[18] = 0;\n\tuniformData[19] = 0;\n\tuniformData[20] = iorInfo.hasSignal ? 1 : 0;\n\tuniformData[21] = dispersionInfo.hasSignal ? 1 : 0;\n\tuniformData[22] = refractScaleInfo.hasSignal ? 1 : 0;\n\tuniformData[23] = causticInfo.hasSignal ? 1 : 0;\n\tuniformData[24] = ripplesInfo.hasSignal ? 1 : 0;\n\tuniformData[25] = roughnessInfo.hasSignal ? 1 : 0;\n\tuniformData[26] = lightPosXInfo.hasSignal ? 1 : 0;\n\tuniformData[27] = lightPosYInfo.hasSignal ? 1 : 0;\n\tuniformData[28] = 0;\n\tuniformData[29] = 0;\n\tuniformData[30] = 0;\n\tuniformData[31] = 0;\n\tconst tintParsed = parseColor(op.tintColor ?? \"#ffffff\");\n\tuniformData[32] = tintParsed.r;\n\tuniformData[33] = tintParsed.g;\n\tuniformData[34] = tintParsed.b;\n\tuniformData[35] = tintParsed.a;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tsrcTex,\n\t\tdepthTex,\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, srcLayout, srcTex, sampler),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, depthLayout, depthTex, 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: sigIORView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: sigDispersionView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sigRefractScaleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sigCausticView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: sigRipplesView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sigRoughnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: sigLightPosXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: sigLightPosYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: RefractionCaustics3DWebGPURenderer });\n\n//#endregion\nexport { RefractionCaustics3DWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BuTkLbVU.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-CCH0gSF7.mjs","names":[],"sources":["../../../nodes/node-refraction-caustics/dist/renderers-BuTkLbVU.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveSignalField } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst REFRACTION_CAUSTICS_SHADER = `\nstruct RefractionCausticsUniforms {\n // vec4 0\n _pad0 : f32,\n ior : f32,\n dispersion : f32,\n refractionScale : f32,\n\n // vec4 1\n causticBrightness : f32,\n causticScale : f32,\n fluidRipples : f32,\n rippleSpeed : f32,\n\n // vec4 2\n roughness : f32,\n specularIntensity : f32,\n lightPosX : f32,\n lightPosY : f32,\n\n // vec4 3\n tintStrength : f32,\n depthInvert : f32,\n depthScale : f32,\n hasDepthMap : f32,\n\n // vec4 4\n timeProgress : f32,\n aspect : f32,\n _pad1 : f32,\n _pad2 : f32,\n\n // vec4 5: signal flags\n hasSigIOR : f32,\n hasSigDispersion : f32,\n hasSigRefractScale : f32,\n hasSigCaustic : f32,\n\n // vec4 6: signal flags\n hasSigRipples : f32,\n hasSigRoughness : f32,\n hasSigLightPosX : f32,\n hasSigLightPosY : f32,\n\n // vec4 7: reserved\n _pad3 : f32,\n _pad4 : f32,\n _pad5 : f32,\n _pad6 : f32,\n\n // vec4 8: color\n tintColor : vec4<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RefractionCausticsUniforms;\n\n@group(1) @binding(0) var srcTex : texture_2d<f32>;\n@group(1) @binding(1) var srcSamp : sampler;\n\n@group(2) @binding(0) var depthTex : texture_2d<f32>;\n@group(2) @binding(1) var depthSamp : sampler;\n\n@group(3) @binding(0) var iorSigTex : texture_2d<f32>;\n@group(3) @binding(1) var dispersionSigTex : texture_2d<f32>;\n@group(3) @binding(2) var refractScaleSigTex : texture_2d<f32>;\n@group(3) @binding(3) var causticSigTex : texture_2d<f32>;\n@group(3) @binding(4) var ripplesSigTex : texture_2d<f32>;\n@group(3) @binding(5) var roughnessSigTex : texture_2d<f32>;\n@group(3) @binding(6) var lightPosXSigTex : texture_2d<f32>;\n@group(3) @binding(7) var lightPosYSigTex : texture_2d<f32>;\n@group(3) @binding(8) var sigSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn sampleDepth(uv: vec2<f32>) -> f32 {\n let clampedUV = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n var raw: f32 = 0.0;\n if (u.hasDepthMap > 0.5) {\n let dSample = textureSampleLevel(depthTex, depthSamp, clampedUV, 0.0);\n raw = dot(dSample.rgb, vec3<f32>(0.299, 0.587, 0.114));\n } else {\n let c = textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n raw = dot(c.rgb, vec3<f32>(0.299, 0.587, 0.114));\n }\n if (u.depthInvert > 0.5) {\n raw = 1.0 - raw;\n }\n return clamp(raw, 0.0, 1.0);\n}\n\nfn sampleSmoothDepth(uv: vec2<f32>, texelSize: vec2<f32>) -> f32 {\n let d0 = sampleDepth(uv);\n let d1 = sampleDepth(uv + vec2<f32>(texelSize.x, 0.0));\n let d2 = sampleDepth(uv - vec2<f32>(texelSize.x, 0.0));\n let d3 = sampleDepth(uv + vec2<f32>(0.0, texelSize.y));\n let d4 = sampleDepth(uv - vec2<f32>(0.0, texelSize.y));\n return (d0 * 4.0 + d1 + d2 + d3 + d4) * 0.125;\n}\n\n// Analytical fluid ripple wave height and normal gradient\nfn getFluidWave(uv: vec2<f32>, time: f32, freqScale: f32) -> vec3<f32> {\n let p = uv * freqScale * 18.0;\n let t = time * 3.0;\n\n let a1 = sin(p.x * 1.4 + p.y * 1.0 + t * 1.2);\n let a2 = sin(p.x * -1.8 + p.y * 1.6 + t * 0.9);\n let a3 = cos((p.x + p.y) * 2.2 - t * 1.4);\n\n let height = (a1 + a2 + a3) * 0.333;\n\n let dx = (1.4 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n - 1.8 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n let dy = (1.0 * cos(p.x * 1.4 + p.y * 1.0 + t * 1.2)\n + 1.6 * cos(p.x * -1.8 + p.y * 1.6 + t * 0.9)\n - 2.2 * sin((p.x + p.y) * 2.2 - t * 1.4)) * freqScale * 18.0 * 0.333;\n\n return vec3<f32>(dx, dy, height);\n}\n\n// Photometric cellular water caustic web (swimming pool / sunlight underwater filaments)\nfn getWaterCaustics(uv: vec2<f32>, time: f32, scale: f32) -> f32 {\n let p = uv * scale * 32.0;\n let t1 = time * 0.8;\n let t2 = time * 1.1;\n\n var p1 = p;\n p1.x = p1.x + sin(p.y * 0.45 + t1) * 1.6;\n p1.y = p1.y + cos(p.x * 0.45 + t1 * 0.8) * 1.6;\n\n var p2 = p * 1.2 + vec2<f32>(4.7, 2.1);\n p2.x = p2.x + cos(p2.y * 0.5 - t2 * 0.9) * 1.4;\n p2.y = p2.y + sin(p2.x * 0.5 + t2) * 1.4;\n\n let k1 = 1.0 - abs(sin(p1.x) * sin(p1.y));\n let k2 = 1.0 - abs(cos(p2.x) * cos(p2.y));\n\n // Sharp interconnected caustic web filaments\n let web = pow(k1 * k2, 3.5);\n return web;\n}\n\nfn computeSurfaceNormal(uv: vec2<f32>, texelSize: vec2<f32>, fluidRippleAmount: f32, rippleTime: f32, depthScaleVal: f32, causticScaleVal: f32) -> vec3<f32> {\n let step = texelSize * 2.0;\n let dL = sampleSmoothDepth(uv - vec2<f32>(step.x, 0.0), texelSize);\n let dR = sampleSmoothDepth(uv + vec2<f32>(step.x, 0.0), texelSize);\n let dD = sampleSmoothDepth(uv - vec2<f32>(0.0, step.y), texelSize);\n let dU = sampleSmoothDepth(uv + vec2<f32>(0.0, step.y), texelSize);\n\n var dx = (dR - dL) * depthScaleVal * 2.0;\n var dy = (dU - dD) * depthScaleVal * 2.0;\n\n if (fluidRippleAmount > 0.001) {\n let wave = getFluidWave(uv, rippleTime, causticScaleVal);\n dx = dx + wave.x * fluidRippleAmount * 0.08;\n dy = dy + wave.y * fluidRippleAmount * 0.08;\n }\n\n return normalize(vec3<f32>(-dx, -dy, 1.0));\n}\n\n// Snell's Law ray refraction with Total Internal Reflection (TIR) fallback\nfn calcRefractOffset(I: vec3<f32>, N: vec3<f32>, eta: f32, thickness: f32) -> vec2<f32> {\n let cosi = dot(-I, N);\n let cost2 = 1.0 - eta * eta * (1.0 - cosi * cosi);\n if (cost2 < 0.0) {\n // Total internal reflection -> reflect\n let R = reflect(I, N);\n return R.xy * thickness * 0.5;\n }\n let R = eta * I + (eta * cosi - sqrt(cost2)) * N;\n return R.xy * (thickness / max(0.2, abs(R.z)));\n}\n\nfn sampleAlbedoSafe(uv: vec2<f32>) -> vec4<f32> {\n if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0) {\n return textureSampleLevel(srcTex, srcSamp, uv, 0.0);\n }\n // Mirror with subtle clamp for border inpainting / anti-tearing\n let mirroredUV = abs(fract(uv * 0.5 + 0.5) * 2.0 - 1.0);\n let clampedUV = clamp(mirroredUV, vec2<f32>(0.001), vec2<f32>(0.999));\n return textureSampleLevel(srcTex, srcSamp, clampedUV, 0.0);\n}\n\nfn spectralWavelength(t: f32) -> vec3<f32> {\n let x = clamp(t, 0.0, 1.0) * 6.0;\n var r: f32 = 0.0;\n var g: f32 = 0.0;\n var b: f32 = 0.0;\n\n if (x < 1.0) {\n r = 1.0;\n g = x;\n b = 0.0;\n } else if (x < 2.0) {\n r = 2.0 - x;\n g = 1.0;\n b = 0.0;\n } else if (x < 3.0) {\n r = 0.0;\n g = 1.0;\n b = x - 2.0;\n } else if (x < 4.0) {\n r = 0.0;\n g = 4.0 - x;\n b = 1.0;\n } else if (x < 5.0) {\n r = x - 4.0;\n g = 0.0;\n b = 1.0;\n } else {\n r = 1.0;\n g = 0.0;\n b = max(0.4, 6.0 - x);\n }\n return vec3<f32>(r, g, b);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n let dims = vec2<f32>(textureDimensions(srcTex));\n let texelSize = vec2<f32>(1.0 / dims.x, 1.0 / dims.y);\n let aspect = select(u.aspect, dims.x / max(1.0, dims.y), u.aspect <= 0.0);\n\n // Resolve signals\n var ior = u.ior;\n if (u.hasSigIOR > 0.5) {\n ior = clamp(textureSampleLevel(iorSigTex, sigSamp, in.uv, 0.0).r, 1.0, 2.5);\n }\n\n var dispersion = u.dispersion;\n if (u.hasSigDispersion > 0.5) {\n dispersion = clamp(textureSampleLevel(dispersionSigTex, sigSamp, in.uv, 0.0).r, 0.0, 0.2);\n }\n\n var refractionScale = u.refractionScale;\n if (u.hasSigRefractScale > 0.5) {\n refractionScale = clamp(textureSampleLevel(refractScaleSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var causticBrightness = u.causticBrightness;\n if (u.hasSigCaustic > 0.5) {\n causticBrightness = clamp(textureSampleLevel(causticSigTex, sigSamp, in.uv, 0.0).r, 0.0, 2.0);\n }\n\n var fluidRipples = u.fluidRipples;\n if (u.hasSigRipples > 0.5) {\n fluidRipples = clamp(textureSampleLevel(ripplesSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var roughness = u.roughness;\n if (u.hasSigRoughness > 0.5) {\n roughness = clamp(textureSampleLevel(roughnessSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosX = u.lightPosX;\n if (u.hasSigLightPosX > 0.5) {\n lightPosX = clamp(textureSampleLevel(lightPosXSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n var lightPosY = u.lightPosY;\n if (u.hasSigLightPosY > 0.5) {\n lightPosY = clamp(textureSampleLevel(lightPosYSigTex, sigSamp, in.uv, 0.0).r, 0.0, 1.0);\n }\n\n let depthScaleVal = u.depthScale;\n let causticScaleVal = max(0.1, u.causticScale);\n let rippleSpeedVal = u.rippleSpeed;\n let rippleTime = u.timeProgress * rippleSpeedVal * 6.2831853;\n\n // Surface Normal & Incident Vectors\n let N = computeSurfaceNormal(in.uv, texelSize, fluidRipples, rippleTime, depthScaleVal, causticScaleVal);\n let I = vec3<f32>(0.0, 0.0, -1.0); // View vector towards surface\n let V = vec3<f32>(0.0, 0.0, 1.0); // View vector towards camera\n\n // Base Snell's Law Refraction\n let eta = 1.0 / max(1.001, ior);\n let refractVec = calcRefractOffset(I, N, eta, refractionScale * 0.16);\n let baseUV = in.uv + vec2<f32>(refractVec.x / aspect, refractVec.y);\n\n // Multi-Spectral Chromatic Rainbow Dispersion\n var accumColor = vec3<f32>(0.0);\n var accumWeight = vec3<f32>(0.0);\n var accumAlpha: f32 = 0.0;\n\n let dispersionStrength = dispersion * refractionScale * 0.6;\n let dispDirection = vec2<f32>(N.x / aspect, N.y);\n\n // 7-tap spectral rainbow integration across wavelength spectrum (Red -> Yellow -> Green -> Cyan -> Blue -> Violet)\n for (var s = 0; s < 7; s = s + 1) {\n let t = f32(s) / 6.0; // 0.0 (Red) to 1.0 (Violet)\n let specColor = spectralWavelength(t);\n let lambdaOffset = dispDirection * ((t - 0.5) * dispersionStrength);\n let sampleUV = baseUV + lambdaOffset;\n\n var sampledTex = sampleAlbedoSafe(sampleUV);\n\n // Microfacet frosted blur if roughness is enabled\n if (roughness > 0.005) {\n let blurRad = roughness * 0.018;\n let j1 = sampleAlbedoSafe(sampleUV + vec2<f32>(blurRad / aspect, blurRad * 0.5));\n let j2 = sampleAlbedoSafe(sampleUV - vec2<f32>(blurRad / aspect, blurRad * 0.5));\n sampledTex = (sampledTex * 2.0 + j1 + j2) * 0.25;\n }\n\n accumColor = accumColor + sampledTex.rgb * specColor;\n accumWeight = accumWeight + specColor;\n accumAlpha = accumAlpha + sampledTex.a;\n }\n\n let finalRefractedRGB = accumColor / max(accumWeight, vec3<f32>(0.001));\n let finalAlpha = accumAlpha / 7.0;\n\n // Incident light vector\n let lightPos3D = vec3<f32>((lightPosX - 0.5) * aspect, lightPosY - 0.5, 0.85);\n let surfPos3D = vec3<f32>((in.uv.x - 0.5) * aspect, in.uv.y - 0.5, 0.0);\n let L = normalize(lightPos3D - surfPos3D);\n\n // 1. Dynamic Fluid Caustics (active when fluidRipples > 0.001)\n var fluidCaustic = 0.0;\n if (fluidRipples > 0.001) {\n let web = getWaterCaustics(in.uv, rippleTime, causticScaleVal);\n let pLight = vec2<f32>(lightPosX, lightPosY);\n let distLight = length((in.uv - pLight) * vec2<f32>(aspect, 1.0));\n let lightAtt = 1.0 / (1.0 + distLight * distLight * 1.2);\n fluidCaustic = web * lightAtt * fluidRipples * causticBrightness * 0.45;\n }\n\n // 2. Specular Highlights & Fresnel Reflectance (Schlick's approximation)\n let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);\n let NdotV = max(dot(N, V), 0.0);\n let fresnel = f0 + (1.0 - f0) * pow(1.0 - NdotV, 5.0);\n\n let H = normalize(L + V);\n let NdotH = max(dot(N, H), 0.0);\n let specShininess = mix(256.0, 32.0, roughness);\n let specular = pow(NdotH, specShininess) * u.specularIntensity * fresnel * 1.5;\n\n // Glass Absorption & Tinting\n let tintStrengthVal = u.tintStrength;\n let tintedBase = mix(finalRefractedRGB, finalRefractedRGB * u.tintColor.rgb, tintStrengthVal);\n\n // Final Composite (Refracted Rainbow Spectrum + Fluid Caustics + Crisp Specular)\n let finalRGB = tintedBase + vec3<f32>(fluidCaustic) * u.tintColor.rgb + vec3<f32>(specular);\n\n return vec4<f32>(clamp(finalRGB, vec3<f32>(0.0), vec3<f32>(1.0)), finalAlpha);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\tsrcTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tdepthTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\t\tsignalTextureLayout: texturesLayout(device, 8),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getRefractionCausticsResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `refraction_caustics_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `refraction_caustics_${format}.wgsl`,\n\t\t\tcode: REFRACTION_CAUSTICS_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `RefractionCausticsPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.srcTextureLayout,\n\t\t\t\tlayouts.depthTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsrcTextureLayout: layouts.srcTextureLayout,\n\t\tdepthTextureLayout: layouts.depthTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst RefractionCaustics3DWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 60;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"RefractionCaustics3D\" || !op) return;\n\tconst sourceMedia = props.virtualMedia.children?.[0];\n\tif (!sourceMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: srcTex } = await drawChildToTexture(args, sourceMedia, { props: {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t} });\n\targs.pass.end();\n\tconst depthMedia = op.depthMedia;\n\tlet depthTex;\n\tlet hasDepthMap = false;\n\tif (depthMedia) {\n\t\t({texture: depthTex} = await drawChildToTexture(args, depthMedia, {\n\t\t\tprops: {\n\t\t\t\t...props,\n\t\t\t\tvirtualMedia: depthMedia,\n\t\t\t\tcontainerWidth: width,\n\t\t\t\tcontainerHeight: height\n\t\t\t},\n\t\t\texclude: [srcTex]\n\t\t}));\n\t\targs.pass.end();\n\t\thasDepthMap = true;\n\t} else {\n\t\tdepthTex = srcTex;\n\t\thasDepthMap = false;\n\t}\n\tconst { pipeline, uniformLayout: uLayout, srcTextureLayout: srcLayout, depthTextureLayout: depthLayout, signalTextureLayout: sigLayout } = getRefractionCausticsResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps, 4);\n\tconst timeProgress = durationSeconds > 0 ? elapsedSeconds % durationSeconds / durationSeconds : 0;\n\tconst iorInfo = resolveSignalField(op, \"ior\", 1.52, 1, 2.5);\n\tconst dispersionInfo = resolveSignalField(op, \"dispersion\", .04, 0, .2);\n\tconst refractScaleInfo = resolveSignalField(op, \"refractionScale\", .5, 0, 2);\n\tconst causticInfo = resolveSignalField(op, \"causticBrightness\", .6, 0, 2);\n\tconst causticScaleInfo = resolveSignalField(op, \"causticScale\", 1, .1, 5);\n\tconst ripplesInfo = resolveSignalField(op, \"fluidRipples\", 0, 0, 1);\n\tconst roughnessInfo = resolveSignalField(op, \"roughness\", 0, 0, 1);\n\tconst lightPosXInfo = resolveSignalField(op, \"lightPosX\", .5, 0, 1);\n\tconst lightPosYInfo = resolveSignalField(op, \"lightPosY\", .2, 0, 1);\n\tconst specularInfo = resolveSignalField(op, \"specularIntensity\", .8, 0, 2);\n\tconst depthScaleInfo = resolveSignalField(op, \"depthScale\", 1, .1, 5);\n\tconst tintStrengthInfo = resolveSignalField(op, \"tintStrength\", 0, 0, 1);\n\tconst rippleSpeedInfo = resolveSignalField(op, \"rippleSpeed\", 1, 0, 5);\n\tconst getSigTextureView = (info, fallbackId) => {\n\t\tif (info.hasSignal && info.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, info.sd.nodeId ?? fallbackId, elapsedSeconds, durationSeconds, info.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst sigIORView = getSigTextureView(iorInfo, \"refr_ior_sig\");\n\tconst sigDispersionView = getSigTextureView(dispersionInfo, \"refr_disp_sig\");\n\tconst sigRefractScaleView = getSigTextureView(refractScaleInfo, \"refr_scale_sig\");\n\tconst sigCausticView = getSigTextureView(causticInfo, \"refr_caust_sig\");\n\tconst sigRipplesView = getSigTextureView(ripplesInfo, \"refr_rip_sig\");\n\tconst sigRoughnessView = getSigTextureView(roughnessInfo, \"refr_rough_sig\");\n\tconst sigLightPosXView = getSigTextureView(lightPosXInfo, \"refr_lightx_sig\");\n\tconst sigLightPosYView = getSigTextureView(lightPosYInfo, \"refr_lighty_sig\");\n\tconst uniformData = new Float32Array(36);\n\tuniformData[0] = 0;\n\tuniformData[1] = iorInfo.value;\n\tuniformData[2] = dispersionInfo.value;\n\tuniformData[3] = refractScaleInfo.value;\n\tuniformData[4] = causticInfo.value;\n\tuniformData[5] = causticScaleInfo.value;\n\tuniformData[6] = ripplesInfo.value;\n\tuniformData[7] = rippleSpeedInfo.value;\n\tuniformData[8] = roughnessInfo.value;\n\tuniformData[9] = specularInfo.value;\n\tuniformData[10] = lightPosXInfo.value;\n\tuniformData[11] = lightPosYInfo.value;\n\tuniformData[12] = tintStrengthInfo.value;\n\tuniformData[13] = op.depthInvert ? 1 : 0;\n\tuniformData[14] = depthScaleInfo.value;\n\tuniformData[15] = hasDepthMap ? 1 : 0;\n\tuniformData[16] = timeProgress;\n\tuniformData[17] = width / Math.max(1, height);\n\tuniformData[18] = 0;\n\tuniformData[19] = 0;\n\tuniformData[20] = iorInfo.hasSignal ? 1 : 0;\n\tuniformData[21] = dispersionInfo.hasSignal ? 1 : 0;\n\tuniformData[22] = refractScaleInfo.hasSignal ? 1 : 0;\n\tuniformData[23] = causticInfo.hasSignal ? 1 : 0;\n\tuniformData[24] = ripplesInfo.hasSignal ? 1 : 0;\n\tuniformData[25] = roughnessInfo.hasSignal ? 1 : 0;\n\tuniformData[26] = lightPosXInfo.hasSignal ? 1 : 0;\n\tuniformData[27] = lightPosYInfo.hasSignal ? 1 : 0;\n\tuniformData[28] = 0;\n\tuniformData[29] = 0;\n\tuniformData[30] = 0;\n\tuniformData[31] = 0;\n\tconst tintParsed = parseColor(op.tintColor ?? \"#ffffff\");\n\tuniformData[32] = tintParsed.r;\n\tuniformData[33] = tintParsed.g;\n\tuniformData[34] = tintParsed.b;\n\tuniformData[35] = tintParsed.a;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tsrcTex,\n\t\tdepthTex,\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, srcLayout, srcTex, sampler),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, depthLayout, depthTex, 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: sigIORView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: sigDispersionView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sigRefractScaleView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: sigCausticView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: sigRipplesView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: sigRoughnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: sigLightPosXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 7,\n\t\t\t\t\tresource: sigLightPosYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 8,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: RefractionCaustics3DWebGPURenderer });\n\n//#endregion\nexport { RefractionCaustics3DWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BuTkLbVU.mjs.map"],"mappings":"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"}