framefields 2.0.10 → 2.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +17 -6
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BxA0sL9z.d.mts → audio-BHanw8Jb.d.mts} +3 -3
  5. package/dist/{audio-BxA0sL9z.d.mts.map → audio-BHanw8Jb.d.mts.map} +1 -1
  6. package/dist/{audio-B7Al-W_0.mjs → audio-COOMNwL5.mjs} +4 -4
  7. package/dist/{audio-B7Al-W_0.mjs.map → audio-COOMNwL5.mjs.map} +1 -1
  8. package/dist/{dist-BFjSQP7i.mjs → dist-BAVZdFEJ.mjs} +3 -3
  9. package/dist/{dist-BFjSQP7i.mjs.map → dist-BAVZdFEJ.mjs.map} +1 -1
  10. package/dist/{dist-DzUJmIHt.mjs → dist-BYqNNwsl.mjs} +2 -2
  11. package/dist/{dist-DzUJmIHt.mjs.map → dist-BYqNNwsl.mjs.map} +1 -1
  12. package/dist/{dist-B9Afsv83.mjs → dist-CbG3QxDw.mjs} +651 -2
  13. package/dist/dist-CbG3QxDw.mjs.map +1 -0
  14. package/dist/{dist-B9PkqWnN.mjs → dist-Cxi68OuY.mjs} +5322 -3274
  15. package/dist/dist-Cxi68OuY.mjs.map +1 -0
  16. package/dist/effects/index.d.mts +4 -4
  17. package/dist/effects/index.mjs +25 -25
  18. package/dist/{effects-CREopCyP.mjs → effects-DzbjFhyA.mjs} +3 -3
  19. package/dist/{effects-CREopCyP.mjs.map → effects-DzbjFhyA.mjs.map} +1 -1
  20. package/dist/fonts/index.d.mts +2 -2
  21. package/dist/fonts/index.mjs +1 -1
  22. package/dist/{fonts-DhEQ5h6E.mjs → fonts-C0W6TgJk.mjs} +52 -5
  23. package/dist/fonts-C0W6TgJk.mjs.map +1 -0
  24. package/dist/{index-J9CIK_nu.d.mts → index-9B8CJowc.d.mts} +2 -2
  25. package/dist/{index-J9CIK_nu.d.mts.map → index-9B8CJowc.d.mts.map} +1 -1
  26. package/dist/{index-CvDVpaKn.d.mts → index-CDoTrMs1.d.mts} +4 -4
  27. package/dist/{index-CvDVpaKn.d.mts.map → index-CDoTrMs1.d.mts.map} +1 -1
  28. package/dist/{index-BXNNJVs8.d.mts → index-CYGpSVsf.d.mts} +2 -2
  29. package/dist/{index-BXNNJVs8.d.mts.map → index-CYGpSVsf.d.mts.map} +1 -1
  30. package/dist/{index-D1zaOwEU.d.mts → index-DDEPvMww.d.mts} +520 -71
  31. package/dist/index-DDEPvMww.d.mts.map +1 -0
  32. package/dist/{index-oodg5k9K.d.mts → index-DGJp1d30.d.mts} +3 -3
  33. package/dist/{index-oodg5k9K.d.mts.map → index-DGJp1d30.d.mts.map} +1 -1
  34. package/dist/{index-fo4E7A6C.d.mts → index-DRZu3ezy.d.mts} +3 -3
  35. package/dist/{index-fo4E7A6C.d.mts.map → index-DRZu3ezy.d.mts.map} +1 -1
  36. package/dist/{index-CQcdKyxF.d.mts → index-DnWsbbuZ.d.mts} +54 -2
  37. package/dist/index-DnWsbbuZ.d.mts.map +1 -0
  38. package/dist/index.d.mts +398 -18
  39. package/dist/index.d.mts.map +1 -1
  40. package/dist/index.mjs +633 -57
  41. package/dist/index.mjs.map +1 -1
  42. package/dist/preview/index.d.mts +2 -2
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-9ifxywUM.mjs → preview-BV2C4Fk6.mjs} +2 -2
  45. package/dist/{preview-9ifxywUM.mjs.map → preview-BV2C4Fk6.mjs.map} +1 -1
  46. package/dist/preview-engine/{chunk-VVLM6LZ3.mjs → chunk-6256GQFP.mjs} +1 -1
  47. package/dist/preview-engine/{chunk-YG35X5R5.mjs → chunk-AWTH2WZO.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-7DIAFPQP.mjs → chunk-ECPP3UG6.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-5JD65JSJ.mjs → chunk-FGHOHCFG.mjs} +1 -1
  50. package/dist/preview-engine/chunk-IMV5SBQV.mjs +1 -0
  51. package/dist/preview-engine/chunk-IQKIHFNZ.mjs +1 -0
  52. package/dist/preview-engine/chunk-L3IEJZ5S.mjs +474 -0
  53. package/dist/preview-engine/chunk-M7NMFDJ3.mjs +3 -0
  54. package/dist/preview-engine/chunk-NFAGEP43.mjs +1448 -0
  55. package/dist/preview-engine/{chunk-AG5JNZYQ.mjs → chunk-Q66QQI6N.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-JAOXXYXG.mjs → chunk-QYRDQMNB.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-XCYFPA34.mjs → chunk-RJUAM52F.mjs} +1 -1
  58. package/dist/preview-engine/chunk-VRGREB3V.mjs +1 -0
  59. package/dist/preview-engine/{chunk-AW7HNZKR.mjs → chunk-Y6HWYPKX.mjs} +1 -1
  60. package/dist/preview-engine/effects.mjs +1 -1
  61. package/dist/preview-engine/fonts.mjs +1 -1
  62. package/dist/preview-engine/framefields.mjs +27 -27
  63. package/dist/preview-engine/player.mjs +1 -1
  64. package/dist/preview-engine/renderers-5BV6JGTU.mjs +248 -0
  65. package/dist/preview-engine/renderers-7X2W6QWX.mjs +1 -0
  66. package/dist/preview-engine/renderers-EOJMPPAQ.mjs +1 -0
  67. package/dist/preview-engine/renderers-G5KQISVL.mjs +1 -0
  68. package/dist/preview-engine/renderers-GMX2ZQDG.mjs +1 -0
  69. package/dist/preview-engine/renderers-TVTQ2R74.mjs +1 -0
  70. package/dist/preview-engine/renderers-ZIMBODX6.mjs +1 -0
  71. package/dist/{program-xRfFoPxe.mjs → program-BmNKgzja.mjs} +281 -23
  72. package/dist/program-BmNKgzja.mjs.map +1 -0
  73. package/dist/renderer/index.d.mts +2 -2
  74. package/dist/renderer/index.mjs +2 -2
  75. package/dist/{renderer-D-4Yh-RK.mjs → renderer-1VuQTY1Z.mjs} +2 -2
  76. package/dist/{renderer-D-4Yh-RK.mjs.map → renderer-1VuQTY1Z.mjs.map} +1 -1
  77. package/dist/renderer-6oMSare3.mjs +3 -0
  78. package/dist/renderer-B1ComPb2.mjs +3 -0
  79. package/dist/{renderer-CgmFh6MY.mjs → renderer-B1YMwl2B.mjs} +1 -1
  80. package/dist/{renderer-BtRfKx5N.mjs → renderer-B2ieylQ3.mjs} +2 -2
  81. package/dist/{renderer-BtRfKx5N.mjs.map → renderer-B2ieylQ3.mjs.map} +1 -1
  82. package/dist/{renderer-DYm4duFr.mjs → renderer-B8-kzZdP.mjs} +2 -2
  83. package/dist/{renderer-DYm4duFr.mjs.map → renderer-B8-kzZdP.mjs.map} +1 -1
  84. package/dist/{renderer-Dju9CaeL.mjs → renderer-B8UaFNqb.mjs} +3 -3
  85. package/dist/{renderer-Dju9CaeL.mjs.map → renderer-B8UaFNqb.mjs.map} +1 -1
  86. package/dist/{renderer-BA8YwBRQ.mjs → renderer-BDbTWSpP.mjs} +3 -3
  87. package/dist/{renderer-BA8YwBRQ.mjs.map → renderer-BDbTWSpP.mjs.map} +1 -1
  88. package/dist/{renderer-DxtHmyAa.mjs → renderer-BIIWCg_J.mjs} +3 -3
  89. package/dist/{renderer-DxtHmyAa.mjs.map → renderer-BIIWCg_J.mjs.map} +1 -1
  90. package/dist/{renderer-CJNyhr_S.mjs → renderer-BJ1aTkZf.mjs} +3 -3
  91. package/dist/{renderer-CJNyhr_S.mjs.map → renderer-BJ1aTkZf.mjs.map} +1 -1
  92. package/dist/renderer-BQ5Bz5D0.mjs +3 -0
  93. package/dist/{renderer-DBlPbsgi.mjs → renderer-BSaYG8aw.mjs} +1 -1
  94. package/dist/{renderer-2NQWaZd7.d.mts → renderer-BTdOMMEx.d.mts} +2 -2
  95. package/dist/{renderer-2NQWaZd7.d.mts.map → renderer-BTdOMMEx.d.mts.map} +1 -1
  96. package/dist/renderer-BZcn_iBl.mjs +3 -0
  97. package/dist/{renderer-CroHPOsX.mjs → renderer-Bc04fivZ.mjs} +3 -3
  98. package/dist/{renderer-CroHPOsX.mjs.map → renderer-Bc04fivZ.mjs.map} +1 -1
  99. package/dist/{renderer-xKOVmd2O.mjs → renderer-BfAWZziM.mjs} +193 -12
  100. package/dist/renderer-BfAWZziM.mjs.map +1 -0
  101. package/dist/{renderer-DTvfYkI9.mjs → renderer-Bfgd4N0O.mjs} +3 -3
  102. package/dist/{renderer-DTvfYkI9.mjs.map → renderer-Bfgd4N0O.mjs.map} +1 -1
  103. package/dist/{renderer-b6sZN90h.mjs → renderer-BhZZEyFX.mjs} +2 -2
  104. package/dist/{renderer-b6sZN90h.mjs.map → renderer-BhZZEyFX.mjs.map} +1 -1
  105. package/dist/{renderer-wVldKtFU.mjs → renderer-Bhdf90Zq.mjs} +2 -2
  106. package/dist/{renderer-wVldKtFU.mjs.map → renderer-Bhdf90Zq.mjs.map} +1 -1
  107. package/dist/renderer-Bp6sDMa6.mjs +3 -0
  108. package/dist/renderer-Bt7_sb_Y.mjs +3 -0
  109. package/dist/{renderer-BiSALMQy.mjs → renderer-Bv21DbWy.mjs} +1 -1
  110. package/dist/{renderer-CoZKST2Y.mjs → renderer-Bv6q84TU.mjs} +2 -2
  111. package/dist/{renderer-CoZKST2Y.mjs.map → renderer-Bv6q84TU.mjs.map} +1 -1
  112. package/dist/renderer-C606ZPUn.mjs +3 -0
  113. package/dist/renderer-C9jyKn1i.mjs +3 -0
  114. package/dist/renderer-CERfcxgv.mjs +3 -0
  115. package/dist/renderer-CG5PzNkv.mjs +3 -0
  116. package/dist/{renderer-BGXbGqY4.mjs → renderer-CI7sG_cv.mjs} +2 -2
  117. package/dist/{renderer-BGXbGqY4.mjs.map → renderer-CI7sG_cv.mjs.map} +1 -1
  118. package/dist/renderer-CPoIMVdk.mjs +3 -0
  119. package/dist/{renderer-DCkSR2Ne.mjs → renderer-CWTpc4ff.mjs} +2 -2
  120. package/dist/{renderer-DCkSR2Ne.mjs.map → renderer-CWTpc4ff.mjs.map} +1 -1
  121. package/dist/{renderer-D7ztfQHX.mjs → renderer-CXn5HAnK.mjs} +3 -3
  122. package/dist/{renderer-D7ztfQHX.mjs.map → renderer-CXn5HAnK.mjs.map} +1 -1
  123. package/dist/{renderer-DjTiNeAp.mjs → renderer-C_TPMHiH.mjs} +2 -2
  124. package/dist/{renderer-DjTiNeAp.mjs.map → renderer-C_TPMHiH.mjs.map} +1 -1
  125. package/dist/renderer-Ca7L1EOp.mjs +3 -0
  126. package/dist/{renderer-DAMJZNtX.mjs → renderer-CaaOKMSd.mjs} +2 -2
  127. package/dist/{renderer-DAMJZNtX.mjs.map → renderer-CaaOKMSd.mjs.map} +1 -1
  128. package/dist/{renderer-CIYcdZuZ.mjs → renderer-CdciwwMI.mjs} +3 -3
  129. package/dist/{renderer-CIYcdZuZ.mjs.map → renderer-CdciwwMI.mjs.map} +1 -1
  130. package/dist/{renderer-BZmfKIom.mjs → renderer-CfC_aiew.mjs} +3 -3
  131. package/dist/{renderer-BZmfKIom.mjs.map → renderer-CfC_aiew.mjs.map} +1 -1
  132. package/dist/{renderer-8qpGxSSO.mjs → renderer-ChdLYS-G.mjs} +3 -3
  133. package/dist/{renderer-8qpGxSSO.mjs.map → renderer-ChdLYS-G.mjs.map} +1 -1
  134. package/dist/renderer-Cl6GkeHx.mjs +3 -0
  135. package/dist/renderer-ClcjrFyo.mjs +3 -0
  136. package/dist/{renderer-BgdkEFmv.mjs → renderer-CnXW28b9.mjs} +2 -2
  137. package/dist/{renderer-BgdkEFmv.mjs.map → renderer-CnXW28b9.mjs.map} +1 -1
  138. package/dist/{renderer-6GeDT4Mx.mjs → renderer-Ctk2zzfy.mjs} +3 -3
  139. package/dist/{renderer-6GeDT4Mx.mjs.map → renderer-Ctk2zzfy.mjs.map} +1 -1
  140. package/dist/{renderer-But0u-xi.mjs → renderer-CtyD_Xju.mjs} +2 -2
  141. package/dist/{renderer-But0u-xi.mjs.map → renderer-CtyD_Xju.mjs.map} +1 -1
  142. package/dist/renderer-CySUP_wk.mjs +3 -0
  143. package/dist/renderer-D2l_Odyg.mjs +3 -0
  144. package/dist/{renderer-BJ6Y-7ke.mjs → renderer-D2nCGcjv.mjs} +2 -2
  145. package/dist/{renderer-BJ6Y-7ke.mjs.map → renderer-D2nCGcjv.mjs.map} +1 -1
  146. package/dist/renderer-DCPCYySt.mjs +3 -0
  147. package/dist/{renderer-BnvqEqvE.mjs → renderer-DIgsilTw.mjs} +3 -3
  148. package/dist/{renderer-BnvqEqvE.mjs.map → renderer-DIgsilTw.mjs.map} +1 -1
  149. package/dist/renderer-DIkpJEOZ.mjs +3 -0
  150. package/dist/{renderer-BpCxKWQm.mjs → renderer-DML9qpmS.mjs} +2 -2
  151. package/dist/{renderer-BpCxKWQm.mjs.map → renderer-DML9qpmS.mjs.map} +1 -1
  152. package/dist/renderer-DNSXPkf_.mjs +3 -0
  153. package/dist/renderer-DP-CvZ_Z.mjs +3 -0
  154. package/dist/renderer-DeXb8R6h.mjs +3 -0
  155. package/dist/renderer-DezO-ZaP.mjs +4 -0
  156. package/dist/renderer-DhXe04fC.mjs +3 -0
  157. package/dist/{renderer-jkZ_IQnW.mjs → renderer-DirxsOjq.mjs} +2 -2
  158. package/dist/{renderer-jkZ_IQnW.mjs.map → renderer-DirxsOjq.mjs.map} +1 -1
  159. package/dist/{renderer-CfeoxM_3.mjs → renderer-Djlb4TLO.mjs} +3 -3
  160. package/dist/{renderer-CfeoxM_3.mjs.map → renderer-Djlb4TLO.mjs.map} +1 -1
  161. package/dist/renderer-DnH3SI7w.mjs +3 -0
  162. package/dist/{renderer-DdVBt8Rz.mjs → renderer-DpGc-N3G.mjs} +3 -3
  163. package/dist/{renderer-DdVBt8Rz.mjs.map → renderer-DpGc-N3G.mjs.map} +1 -1
  164. package/dist/renderer-Dpw4oi33.mjs +3 -0
  165. package/dist/{renderer-CcU7dVn9.mjs → renderer-DxTs4Iyi.mjs} +2 -2
  166. package/dist/{renderer-CcU7dVn9.mjs.map → renderer-DxTs4Iyi.mjs.map} +1 -1
  167. package/dist/{renderer-CNF10fCq.mjs → renderer-Dy0utCl7.mjs} +3 -3
  168. package/dist/{renderer-CNF10fCq.mjs.map → renderer-Dy0utCl7.mjs.map} +1 -1
  169. package/dist/renderer-Md-ytU0v.mjs +3 -0
  170. package/dist/{renderer-CStktK20.mjs → renderer-RKsXlF_0.mjs} +43 -43
  171. package/dist/{renderer-CStktK20.mjs.map → renderer-RKsXlF_0.mjs.map} +1 -1
  172. package/dist/renderer-U-bhWO9Q.mjs +3 -0
  173. package/dist/{renderer-5h0llpx7.mjs → renderer-WSGuj_V6.mjs} +2 -2
  174. package/dist/{renderer-5h0llpx7.mjs.map → renderer-WSGuj_V6.mjs.map} +1 -1
  175. package/dist/{renderer-_bygZSKk.mjs → renderer-bsWnRNpJ.mjs} +2 -2
  176. package/dist/{renderer-_bygZSKk.mjs.map → renderer-bsWnRNpJ.mjs.map} +1 -1
  177. package/dist/{renderer-DNNqpK7t.mjs → renderer-cgxO2xN6.mjs} +3 -3
  178. package/dist/{renderer-DNNqpK7t.mjs.map → renderer-cgxO2xN6.mjs.map} +1 -1
  179. package/dist/{renderer-DryPrxYc.mjs → renderer-dncoIVdd.mjs} +1 -1
  180. package/dist/{renderer-DffynBHa.mjs → renderer-kwmlLQOO.mjs} +3 -3
  181. package/dist/{renderer-DffynBHa.mjs.map → renderer-kwmlLQOO.mjs.map} +1 -1
  182. package/dist/{renderer-9wp5R7PL.mjs → renderer-vqkKWqa5.mjs} +2 -2
  183. package/dist/{renderer-9wp5R7PL.mjs.map → renderer-vqkKWqa5.mjs.map} +1 -1
  184. package/dist/renderer-zA5okHds.mjs +3 -0
  185. package/dist/{renderers-CP8CFWDs-BLgwUYX2.mjs → renderers-CP8CFWDs-DwQTx8S7.mjs} +3 -3
  186. package/dist/{renderers-CP8CFWDs-BLgwUYX2.mjs.map → renderers-CP8CFWDs-DwQTx8S7.mjs.map} +1 -1
  187. package/dist/signals/index.d.mts +5 -5
  188. package/dist/signals/index.mjs +6 -6
  189. package/dist/{signals-CsxqD2AA.mjs → signals-Bv1OweKd.mjs} +3 -3
  190. package/dist/{signals-CsxqD2AA.mjs.map → signals-Bv1OweKd.mjs.map} +1 -1
  191. package/package.json +55 -55
  192. package/dist/dist-B9Afsv83.mjs.map +0 -1
  193. package/dist/dist-B9PkqWnN.mjs.map +0 -1
  194. package/dist/fonts-DhEQ5h6E.mjs.map +0 -1
  195. package/dist/index-CQcdKyxF.d.mts.map +0 -1
  196. package/dist/index-D1zaOwEU.d.mts.map +0 -1
  197. package/dist/preview-engine/chunk-CNSHAFEA.mjs +0 -1
  198. package/dist/preview-engine/chunk-QTKJXDIW.mjs +0 -997
  199. package/dist/preview-engine/chunk-RNOO4UR5.mjs +0 -3
  200. package/dist/preview-engine/chunk-T6CC2KCZ.mjs +0 -418
  201. package/dist/preview-engine/chunk-UC7CSW2A.mjs +0 -1
  202. package/dist/preview-engine/renderers-32PIFHPS.mjs +0 -1
  203. package/dist/preview-engine/renderers-3Y3EMRDJ.mjs +0 -1
  204. package/dist/preview-engine/renderers-7HNVXNAI.mjs +0 -248
  205. package/dist/preview-engine/renderers-CHJWUJVI.mjs +0 -1
  206. package/dist/preview-engine/renderers-CI2GXWLP.mjs +0 -1
  207. package/dist/preview-engine/renderers-EE2GFG7J.mjs +0 -1
  208. package/dist/preview-engine/renderers-UGZUPONY.mjs +0 -1
  209. package/dist/program-xRfFoPxe.mjs.map +0 -1
  210. package/dist/renderer-B4F6wL68.mjs +0 -3
  211. package/dist/renderer-B4i1jmiT.mjs +0 -3
  212. package/dist/renderer-B5ylY3uM.mjs +0 -3
  213. package/dist/renderer-BPw23wiR.mjs +0 -3
  214. package/dist/renderer-BghW-bSZ.mjs +0 -3
  215. package/dist/renderer-Bw3oZ9YT.mjs +0 -3
  216. package/dist/renderer-C2009W-_.mjs +0 -3
  217. package/dist/renderer-C36yoGXG.mjs +0 -3
  218. package/dist/renderer-CL3evUmF.mjs +0 -3
  219. package/dist/renderer-CM1_2ZWA.mjs +0 -3
  220. package/dist/renderer-CWlzudP8.mjs +0 -3
  221. package/dist/renderer-Cd5vzrGs.mjs +0 -3
  222. package/dist/renderer-CeJ_vDXI.mjs +0 -3
  223. package/dist/renderer-CjY77sB_.mjs +0 -3
  224. package/dist/renderer-D5Z6mda5.mjs +0 -3
  225. package/dist/renderer-DCJa7OGk.mjs +0 -3
  226. package/dist/renderer-DGwSl7g1.mjs +0 -3
  227. package/dist/renderer-DNoRNfMm.mjs +0 -3
  228. package/dist/renderer-DOZ8bpyY.mjs +0 -3
  229. package/dist/renderer-DRHyRNU8.mjs +0 -3
  230. package/dist/renderer-DlD85Xoi.mjs +0 -3
  231. package/dist/renderer-Dr0bgOrW.mjs +0 -3
  232. package/dist/renderer-DurtG-Hc.mjs +0 -3
  233. package/dist/renderer-eFv9HBmL.mjs +0 -3
  234. package/dist/renderer-iuV6wQoL.mjs +0 -4
  235. package/dist/renderer-n-uuWPF4.mjs +0 -3
  236. package/dist/renderer-rzccTFuY.mjs +0 -3
  237. package/dist/renderer-xKOVmd2O.mjs.map +0 -1
  238. package/dist/renderer-y9eGFPFL.mjs +0 -3
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-D2nCGcjv.mjs";
2
+
3
+ export { renderers_default as default };
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-kwmlLQOO.mjs";
2
+
3
+ export { renderers_default as default };
@@ -0,0 +1,4 @@
1
+ import { t as renderers_default } from "./renderers-CP8CFWDs-DwQTx8S7.mjs";
2
+ import "./renderer-C2n-EHxg.mjs";
3
+
4
+ export { renderers_default as default };
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-CXn5HAnK.mjs";
2
+
3
+ export { renderers_default as default };
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
2
- import { J as parseColor, nt as signalRegistry } from "./dist-B9PkqWnN.mjs";
2
+ import { Y as parseColor, rt as signalRegistry } from "./dist-Cxi68OuY.mjs";
3
3
 
4
4
  //#region ../../nodes/node-refraction-caustics/dist/renderers-qLDoFraM.mjs
5
5
  const REFRACTION_CAUSTICS_SHADER = `
@@ -741,4 +741,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: RefractionCaustics3DWeb
741
741
 
742
742
  //#endregion
743
743
  export { renderers_default as n, RefractionCaustics3DWebGPURenderer as t };
744
- //# sourceMappingURL=renderer-jkZ_IQnW.mjs.map
744
+ //# sourceMappingURL=renderer-DirxsOjq.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-jkZ_IQnW.mjs","names":[],"sources":["../../../nodes/node-refraction-caustics/dist/renderers-qLDoFraM.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\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\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn 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: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] }),\n\t\tsrcTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tdepthTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tsignalTextureLayout: device.createBindGroupLayout({ entries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tsampler: { type: \"filtering\" }\n\t\t\t}\n\t\t] }),\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 = device.createRenderPipeline({\n\t\t\tlabel: `RefractionCausticsPipeline_${format}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\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\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\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}\nfunction resolveSignalField(op, fieldName, defaultValue, minVal, maxVal) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && (signalInput.outputItem?.type === \"Signal\" || signalInput.outputItem?.type === \"Numeric\"));\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") {\n\t\tconst raw = Number(signalInput.outputItem.data ?? defaultValue);\n\t\tvalue = Math.max(minVal, Math.min(maxVal, raw));\n\t} else {\n\t\tconst raw = Number(op[fieldName] ?? defaultValue);\n\t\tvalue = Math.max(minVal, Math.min(maxVal, raw));\n\t}\n\telse if (sd) {\n\t\tconst raw = Number(sd.offset ?? defaultValue);\n\t\tvalue = Math.max(minVal, Math.min(maxVal, raw));\n\t}\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst RefractionCaustics3DWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = 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 srcTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst srcView = srcTex.createView();\n\tctx.renderer.beginFrame(encoder, srcView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t}, srcView, srcTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\targs.pass.end();\n\tconst depthMedia = op.depthMedia;\n\tlet depthTex;\n\tlet depthView;\n\tlet hasDepthMap = false;\n\tif (depthMedia) {\n\t\tdepthTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\t...props.excludeTextures || [],\n\t\t\ttargetTexture,\n\t\t\tsrcTex\n\t\t]);\n\t\tdepthView = depthTex.createView();\n\t\tctx.renderer.beginFrame(encoder, depthView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, width, height, \"clear\").end();\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(depthMedia, {\n\t\t\t...props,\n\t\t\tvirtualMedia: depthMedia,\n\t\t\tcontainerWidth: width,\n\t\t\tcontainerHeight: height\n\t\t}, depthView, depthTex, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t\targs.pass.end();\n\t\thasDepthMap = true;\n\t} else {\n\t\tdepthTex = srcTex;\n\t\tdepthView = srcView;\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 = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 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\tconst renderPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\trenderPass.setPipeline(pipeline);\n\trenderPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\trenderPass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcLayout, srcTex, sampler));\n\trenderPass.setBindGroup(2, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, depthLayout, depthTex, sampler));\n\trenderPass.setBindGroup(3, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: sigIORView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sigDispersionView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sigRefractScaleView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: sigCausticView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sigRipplesView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: sigRoughnessView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: sigLightPosXView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tresource: sigLightPosYView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\trenderPass.draw(4);\n\trenderPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: op.opacity ?? 1 });\n\targs.pass = finalPass;\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-qLDoFraM.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DirxsOjq.mjs","names":[],"sources":["../../../nodes/node-refraction-caustics/dist/renderers-qLDoFraM.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\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\nstruct VSOut {\n @builtin(position) pos : vec4<f32>,\n @location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n var pos = array<vec2<f32>, 4>(\n vec2<f32>(-1.0, 1.0),\n vec2<f32>(1.0, 1.0),\n vec2<f32>(-1.0, -1.0),\n vec2<f32>(1.0, -1.0)\n );\n var uv = array<vec2<f32>, 4>(\n vec2<f32>(0.0, 0.0),\n vec2<f32>(1.0, 0.0),\n vec2<f32>(0.0, 1.0),\n vec2<f32>(1.0, 1.0)\n );\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn 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: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}] }),\n\t\tsrcTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tdepthTextureLayout: device.createBindGroupLayout({ entries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}] }),\n\t\tsignalTextureLayout: device.createBindGroupLayout({ entries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\ttexture: { sampleType: \"float\" }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\t\tsampler: { type: \"filtering\" }\n\t\t\t}\n\t\t] }),\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 = device.createRenderPipeline({\n\t\t\tlabel: `RefractionCausticsPipeline_${format}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\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\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t});\n\t\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}\nfunction resolveSignalField(op, fieldName, defaultValue, minVal, maxVal) {\n\tconst handleId = op[`${fieldName}HandleId`];\n\tconst signalInput = handleId ? op.inputs?.[handleId] : null;\n\tconst hasSignal = !!(signalInput?.connectionValid && (signalInput.outputItem?.type === \"Signal\" || signalInput.outputItem?.type === \"Numeric\"));\n\tconst sd = hasSignal && signalInput?.outputItem?.data ? signalInput.outputItem.data : null;\n\tlet value = defaultValue;\n\tif (!hasSignal) if (signalInput?.connectionValid && signalInput.outputItem?.type === \"Number\") {\n\t\tconst raw = Number(signalInput.outputItem.data ?? defaultValue);\n\t\tvalue = Math.max(minVal, Math.min(maxVal, raw));\n\t} else {\n\t\tconst raw = Number(op[fieldName] ?? defaultValue);\n\t\tvalue = Math.max(minVal, Math.min(maxVal, raw));\n\t}\n\telse if (sd) {\n\t\tconst raw = Number(sd.offset ?? defaultValue);\n\t\tvalue = Math.max(minVal, Math.min(maxVal, raw));\n\t}\n\treturn {\n\t\thasSignal,\n\t\tsd,\n\t\tvalue\n\t};\n}\nconst RefractionCaustics3DWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = 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 srcTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst srcView = srcTex.createView();\n\tctx.renderer.beginFrame(encoder, srcView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(sourceMedia, {\n\t\t...props,\n\t\tvirtualMedia: sourceMedia,\n\t\tcontainerWidth: width,\n\t\tcontainerHeight: height\n\t}, srcView, srcTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\targs.pass.end();\n\tconst depthMedia = op.depthMedia;\n\tlet depthTex;\n\tlet depthView;\n\tlet hasDepthMap = false;\n\tif (depthMedia) {\n\t\tdepthTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\t...props.excludeTextures || [],\n\t\t\ttargetTexture,\n\t\t\tsrcTex\n\t\t]);\n\t\tdepthView = depthTex.createView();\n\t\tctx.renderer.beginFrame(encoder, depthView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, width, height, \"clear\").end();\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(depthMedia, {\n\t\t\t...props,\n\t\t\tvirtualMedia: depthMedia,\n\t\t\tcontainerWidth: width,\n\t\t\tcontainerHeight: height\n\t\t}, depthView, depthTex, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t\targs.pass.end();\n\t\thasDepthMap = true;\n\t} else {\n\t\tdepthTex = srcTex;\n\t\tdepthView = srcView;\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 = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 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\tconst renderPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\trenderPass.setPipeline(pipeline);\n\trenderPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\trenderPass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, srcLayout, srcTex, sampler));\n\trenderPass.setBindGroup(2, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, depthLayout, depthTex, sampler));\n\trenderPass.setBindGroup(3, ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: sigIORView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sigDispersionView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sigRefractScaleView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: sigCausticView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sigRipplesView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: sigRoughnessView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: sigLightPosXView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 7,\n\t\t\t\tresource: sigLightPosYView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 8,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\trenderPass.draw(4);\n\trenderPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: op.opacity ?? 1 });\n\targs.pass = finalPass;\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-qLDoFraM.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { It as resolveNumber, Rt as resolveString } from "./dist-B9Afsv83.mjs";
1
+ import { Jt as resolveNumber, Xt as resolveString } from "./dist-CbG3QxDw.mjs";
2
2
  import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
3
- import { C as WebGPUAudioProcessor } from "./dist-B9PkqWnN.mjs";
3
+ import { C as WebGPUAudioProcessor } from "./dist-Cxi68OuY.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-parametric-eq/dist/renderers-BMaULpZV.mjs
6
6
  const PARAM_ORDER = [
@@ -269,4 +269,4 @@ var renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProces
269
269
 
270
270
  //#endregion
271
271
  export { renderers_default as t };
272
- //# sourceMappingURL=renderer-CfeoxM_3.mjs.map
272
+ //# sourceMappingURL=renderer-Djlb4TLO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CfeoxM_3.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-BMaULpZV.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\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 sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasFrequencySig = isHandleConnected(\"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(\"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(\"qHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BMaULpZV.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,aAAa,kBAAkB,eAAe,GAAG,IAAI;CAC3D,MAAM,UAAU,kBAAkB,YAAY,GAAG,IAAI;CACrD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"renderer-Djlb4TLO.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-BMaULpZV.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\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 sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst inputs = op.inputs || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasFrequencySig = isHandleConnected(\"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(\"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(\"qHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BMaULpZV.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,EAAE;CAC9B,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,qBAAqB,gBAAgB;EAC1C,MAAM,WAAW,GAAG;AACpB,MAAI,OAAO,aAAa,YAAY,CAAC,SAAU,QAAO;EACtD,MAAM,QAAQ,OAAO;AACrB,SAAO,QAAQ,OAAO,mBAAmB,MAAM,eAAe,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,SAAS,UAAU;;CAEzI,MAAM,kBAAkB,kBAAkB,oBAAoB,GAAG,IAAI;CACrE,MAAM,aAAa,kBAAkB,eAAe,GAAG,IAAI;CAC3D,MAAM,UAAU,kBAAkB,YAAY,GAAG,IAAI;CACrD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-cgxO2xN6.mjs";
2
+
3
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
2
- import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DzUJmIHt.mjs";
3
- import { $ as probeVideoSize } from "./dist-B9PkqWnN.mjs";
2
+ import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BYqNNwsl.mjs";
3
+ import { et as probeVideoSize } from "./dist-Cxi68OuY.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-rotate/dist/renderers-BzrxSSux.mjs
@@ -260,4 +260,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
260
260
 
261
261
  //#endregion
262
262
  export { renderers_default as t };
263
- //# sourceMappingURL=renderer-DdVBt8Rz.mjs.map
263
+ //# sourceMappingURL=renderer-DpGc-N3G.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DdVBt8Rz.mjs","names":[],"sources":["../../../nodes/node-rotate/dist/renderers-BzrxSSux.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { probeVideoSize } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst rotateConfig = configBuilder().field(\"angle\", z.number().default(90), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Angle Signal\",\n\tdescription: \"Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down.\"\n}).field(\"fit\", z.enum([\n\t\"cover\",\n\t\"contain\",\n\t\"fill\"\n]).default(\"cover\"), { description: \"How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it.\" }).field(\"scale\", z.number().min(.01).max(20).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Scale Signal\",\n\tdescription: \"Extra zoom applied after the fit (1 = exactly fitted).\"\n}).build();\nconst RotateNodeConfigSchema = rotateConfig.schema;\nconst RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ROTATE_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n/**\n* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.\n* `cover` is the smallest size whose rotated rectangle still covers the whole\n* output; `contain` the largest whose rotated bounding box fits inside it.\n*/\nfunction rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {\n\tif (fit === \"fill\") return {\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t};\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst c = Math.abs(Math.cos(rad));\n\tconst s = Math.abs(Math.sin(rad));\n\tconst k = fit === \"cover\" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));\n\treturn {\n\t\twidth: sourceWidth * k,\n\t\theight: sourceHeight * k\n\t};\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_ROTATE_SHADER = `\nstruct RotateUniforms {\n\toutSize: vec2<f32>,\n\tsize : vec2<f32>,\n\tcs : vec2<f32>,\n\t_pad : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RotateUniforms;\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\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet p = (in.uv - vec2<f32>(0.5)) * u.outSize;\n\t// Clockwise on screen (y down): undo it with the transpose.\n\tlet q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);\n\tlet uv = q / u.size + vec2<f32>(0.5);\n\t// Distance (output px) inside the source rectangle's nearest edge.\n\tlet edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;\n\tlet coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);\n\tlet color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\t// Premultiplied: coverage scales every channel.\n\treturn color * coverage;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(8);\nfunction getRotateResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tbuffer: { type: \"uniform\" }\n\t}] });\n\tconst textureLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\ttexture: { sampleType: \"float\" }\n\t}, {\n\t\tbinding: 1,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tsampler: { type: \"filtering\" }\n\t}] });\n\tconst shaderModule = device.createShaderModule({ code: WGSL_ROTATE_SHADER });\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: targetFormat }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction resolveNumber(raw, fallback, frame, fps) {\n\tconst value = typeof raw === \"function\" ? raw(frame, fps) : raw !== null && typeof raw === \"object\" ? \"get\" in raw && typeof raw.get === \"function\" ? raw.get({\n\t\tframe,\n\t\tfps\n\t}) : \"value\" in raw ? raw.value : raw : raw;\n\tconst n = Number(value ?? fallback);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* The child's own size: the nearest stated metadata down the chain, else the\n* source file's display size. A layer built from a bare path states none, and\n* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.\n*/\nasync function intrinsicSize(media) {\n\tfor (let node = media; node;) {\n\t\tconst { width, height } = node.metadata ?? {};\n\t\tif (width && height) return {\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t\tconst op = node.operation;\n\t\tif (op.op === \"source\") {\n\t\t\tconst url = typeof op.url === \"string\" ? op.url : op.source;\n\t\t\treturn typeof url === \"string\" ? probeVideoSize(url) : null;\n\t\t}\n\t\tnode = node.children?.[0];\n\t}\n\treturn null;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Rotate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intrinsic = await intrinsicSize(childMedia);\n\tconst sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;\n\tconst childTex = ctx.renderer.getTemporaryTexture(sourceWidth, sourceHeight, [...props.excludeTextures || [], targetTexture]);\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, sourceWidth, sourceHeight, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tcontainerWidth: sourceWidth,\n\t\tcontainerHeight: sourceHeight,\n\t\tvirtualMedia: childMedia\n\t}, childView, childTex, sourceWidth, sourceHeight);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst angle = resolveNumber(op.angle, 90, compositionFrame, fps);\n\tconst scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));\n\tconst size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? \"cover\");\n\tconst rad = angle * Math.PI / 180;\n\tuniformData[0] = width;\n\tuniformData[1] = height;\n\tuniformData[2] = size.width * scale;\n\tuniformData[3] = size.height * scale;\n\tuniformData[4] = Math.cos(rad);\n\tuniformData[5] = Math.sin(rad);\n\tconst { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: ctx.renderer.samplerCache.getSampler(ctx.device)\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst renderPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\trenderPass.setPipeline(pipeline);\n\trenderPass.setBindGroup(0, uBindGroup);\n\trenderPass.setBindGroup(1, tBindGroup);\n\trenderPass.draw(4);\n\trenderPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: op.opacity ?? 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { rotateConfig as a, RotateResultSchema as i, ROTATE_OUTPUT_TYPE_MAP as n, rotatedSourceSize as o, RotateNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-BzrxSSux.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DpGc-N3G.mjs","names":[],"sources":["../../../nodes/node-rotate/dist/renderers-BzrxSSux.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { probeVideoSize } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst rotateConfig = configBuilder().field(\"angle\", z.number().default(90), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Angle Signal\",\n\tdescription: \"Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down.\"\n}).field(\"fit\", z.enum([\n\t\"cover\",\n\t\"contain\",\n\t\"fill\"\n]).default(\"cover\"), { description: \"How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it.\" }).field(\"scale\", z.number().min(.01).max(20).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Scale Signal\",\n\tdescription: \"Extra zoom applied after the fit (1 = exactly fitted).\"\n}).build();\nconst RotateNodeConfigSchema = rotateConfig.schema;\nconst RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ROTATE_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n/**\n* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.\n* `cover` is the smallest size whose rotated rectangle still covers the whole\n* output; `contain` the largest whose rotated bounding box fits inside it.\n*/\nfunction rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {\n\tif (fit === \"fill\") return {\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t};\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst c = Math.abs(Math.cos(rad));\n\tconst s = Math.abs(Math.sin(rad));\n\tconst k = fit === \"cover\" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));\n\treturn {\n\t\twidth: sourceWidth * k,\n\t\theight: sourceHeight * k\n\t};\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_ROTATE_SHADER = `\nstruct RotateUniforms {\n\toutSize: vec2<f32>,\n\tsize : vec2<f32>,\n\tcs : vec2<f32>,\n\t_pad : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RotateUniforms;\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\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet p = (in.uv - vec2<f32>(0.5)) * u.outSize;\n\t// Clockwise on screen (y down): undo it with the transpose.\n\tlet q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);\n\tlet uv = q / u.size + vec2<f32>(0.5);\n\t// Distance (output px) inside the source rectangle's nearest edge.\n\tlet edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;\n\tlet coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);\n\tlet color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\t// Premultiplied: coverage scales every channel.\n\treturn color * coverage;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(8);\nfunction getRotateResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tbuffer: { type: \"uniform\" }\n\t}] });\n\tconst textureLayout = device.createBindGroupLayout({ entries: [{\n\t\tbinding: 0,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\ttexture: { sampleType: \"float\" }\n\t}, {\n\t\tbinding: 1,\n\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\tsampler: { type: \"filtering\" }\n\t}] });\n\tconst shaderModule = device.createShaderModule({ code: WGSL_ROTATE_SHADER });\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: shaderModule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: targetFormat }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction resolveNumber(raw, fallback, frame, fps) {\n\tconst value = typeof raw === \"function\" ? raw(frame, fps) : raw !== null && typeof raw === \"object\" ? \"get\" in raw && typeof raw.get === \"function\" ? raw.get({\n\t\tframe,\n\t\tfps\n\t}) : \"value\" in raw ? raw.value : raw : raw;\n\tconst n = Number(value ?? fallback);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* The child's own size: the nearest stated metadata down the chain, else the\n* source file's display size. A layer built from a bare path states none, and\n* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.\n*/\nasync function intrinsicSize(media) {\n\tfor (let node = media; node;) {\n\t\tconst { width, height } = node.metadata ?? {};\n\t\tif (width && height) return {\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t\tconst op = node.operation;\n\t\tif (op.op === \"source\") {\n\t\t\tconst url = typeof op.url === \"string\" ? op.url : op.source;\n\t\t\treturn typeof url === \"string\" ? probeVideoSize(url) : null;\n\t\t}\n\t\tnode = node.children?.[0];\n\t}\n\treturn null;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Rotate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intrinsic = await intrinsicSize(childMedia);\n\tconst sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;\n\tconst childTex = ctx.renderer.getTemporaryTexture(sourceWidth, sourceHeight, [...props.excludeTextures || [], targetTexture]);\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, sourceWidth, sourceHeight, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tcontainerWidth: sourceWidth,\n\t\tcontainerHeight: sourceHeight,\n\t\tvirtualMedia: childMedia\n\t}, childView, childTex, sourceWidth, sourceHeight);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst angle = resolveNumber(op.angle, 90, compositionFrame, fps);\n\tconst scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));\n\tconst size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? \"cover\");\n\tconst rad = angle * Math.PI / 180;\n\tuniformData[0] = width;\n\tuniformData[1] = height;\n\tuniformData[2] = size.width * scale;\n\tuniformData[3] = size.height * scale;\n\tuniformData[4] = Math.cos(rad);\n\tuniformData[5] = Math.sin(rad);\n\tconst { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: ctx.renderer.samplerCache.getSampler(ctx.device)\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst renderPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\trenderPass.setPipeline(pipeline);\n\trenderPass.setBindGroup(0, uBindGroup);\n\trenderPass.setBindGroup(1, tBindGroup);\n\trenderPass.draw(4);\n\trenderPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: op.opacity ?? 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { rotateConfig as a, RotateResultSchema as i, ROTATE_OUTPUT_TYPE_MAP as n, rotatedSourceSize as o, RotateNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-BzrxSSux.mjs.map"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-Ctk2zzfy.mjs";
2
+
3
+ export { renderers_default as default };
@@ -1,4 +1,4 @@
1
- import { J as parseColor, nt as signalRegistry } from "./dist-B9PkqWnN.mjs";
1
+ import { Y as parseColor, rt as signalRegistry } from "./dist-Cxi68OuY.mjs";
2
2
 
3
3
  //#region ../../nodes/node-gradient-map/dist/renderers-BZz0QfQj.mjs
4
4
  const deviceResourceCache = /* @__PURE__ */ new WeakMap();
@@ -308,4 +308,4 @@ var renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };
308
308
 
309
309
  //#endregion
310
310
  export { renderers_default as n, GradientMapWebGPURenderer as t };
311
- //# sourceMappingURL=renderer-CcU7dVn9.mjs.map
311
+ //# sourceMappingURL=renderer-DxTs4Iyi.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CcU7dVn9.mjs","names":[],"sources":["../../../nodes/node-gradient-map/dist/renderers-BZz0QfQj.mjs"],"sourcesContent":["import { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_GRADIENT_MAP_SHADER = `\nstruct GradientStop {\n\tpos : vec4<f32>,\n\tcol : vec4<f32>,\n};\n\nstruct GradientMapUniforms {\n\tnumStops : f32,\n\tisSmooth : f32,\n\tdither : f32,\n\topacity : f32,\n\n\thasOpacitySig : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n\n\tstops : array<GradientStop, 16>,\n};\n\n@group(0) @binding(0) var<uniform> u : GradientMapUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn ditherNoise(pos: vec2<f32>) -> f32 {\n\tlet p = fract(pos * vec2<f32>(0.1031, 0.1030));\n\tlet d = dot(p, p.yx + 33.33);\n\treturn fract((p.x + p.y) * d) - 0.5;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\t// ITU-R BT.709 Luminance\n\tvar lum = dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n\tif (u.dither > 0.5) {\n\t\tlet d = ditherNoise(in.pos.xy) * (1.0 / 255.0);\n\t\tlum = clamp(lum + d, 0.0, 1.0);\n\t} else {\n\t\tlum = clamp(lum, 0.0, 1.0);\n\t}\n\n\tlet count = i32(clamp(u.numStops, 2.0, 16.0));\n\tvar gradColor = u.stops[0].col.rgb;\n\n\tif (lum <= u.stops[0].pos.x) {\n\t\tgradColor = u.stops[0].col.rgb;\n\t} else if (lum >= u.stops[count - 1].pos.x) {\n\t\tgradColor = u.stops[count - 1].col.rgb;\n\t} else {\n\t\tfor (var i = 0; i < 15; i = i + 1) {\n\t\t\tif (i >= count - 1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet p0 = u.stops[i].pos.x;\n\t\t\tlet p1 = u.stops[i + 1].pos.x;\n\n\t\t\tif (lum >= p0 && lum <= p1) {\n\t\t\t\tlet range = max(p1 - p0, 1e-5);\n\t\t\t\tlet t = clamp((lum - p0) / range, 0.0, 1.0);\n\t\t\t\tif (u.isSmooth > 0.5) {\n\t\t\t\t\tgradColor = mix(u.stops[i].col.rgb, u.stops[i + 1].col.rgb, t);\n\t\t\t\t} else {\n\t\t\t\t\tgradColor = u.stops[i].col.rgb;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar opacity = u.opacity;\n\tif (u.hasOpacitySig > 0.5) {\n\t\topacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\topacity = clamp(opacity, 0.0, 1.0);\n\n\tlet finalRgb = mix(rgb, gradColor, opacity);\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nfunction getGradientMapResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = device.createBindGroupLayout({\n\t\tlabel: \"GradientMapUniformLayout\",\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}]\n\t});\n\tconst textureLayout = device.createBindGroupLayout({\n\t\tlabel: \"GradientMapTextureLayout\",\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}]\n\t});\n\tconst signalLayout = device.createBindGroupLayout({\n\t\tlabel: \"GradientMapSignalLayout\",\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}]\n\t});\n\tconst module = device.createShaderModule({\n\t\tlabel: \"GradientMapShaderModule\",\n\t\tcode: WGSL_GRADIENT_MAP_SHADER\n\t});\n\tres = {\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"GradientMapPipeline\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalLayout\n\t\t\t] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(136);\nconst GradientMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"GradientMap\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst tmpTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpView = tmpTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia\n\t}, tmpView, tmpTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst sortedStops = [...Array.isArray(op.stops) ? op.stops : [{\n\t\tposition: 0,\n\t\tcolor: \"#000000\"\n\t}, {\n\t\tposition: 1,\n\t\tcolor: \"#ffffff\"\n\t}]].sort((a, b) => a.position - b.position);\n\tconst numStops = Math.min(Math.max(sortedStops.length, 2), 16);\n\tconst opacityHandleId = op.opacityHandleId;\n\tconst opacitySignalInput = opacityHandleId ? op.inputs?.[opacityHandleId] : null;\n\tconst hasOpacitySig = !!(opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Signal\");\n\tconst opacitySigData = hasOpacitySig ? opacitySignalInput?.outputItem?.data : null;\n\tlet opacityVal = Number(op.opacity ?? 1);\n\tif (!hasOpacitySig && opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Number\") opacityVal = Number(opacitySignalInput.outputItem.data ?? 1);\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tlet opacityView;\n\tif (hasOpacitySig && opacitySigData) opacityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, opacitySigData.nodeId ?? \"gradient_map_opacity\", elapsedSeconds, durationSeconds, opacitySigData, width, height, props.renderId, frame, fps);\n\telse opacityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = numStops;\n\tuniformBufferData[1] = op.smooth === false ? 0 : 1;\n\tuniformBufferData[2] = op.dither === false ? 0 : 1;\n\tuniformBufferData[3] = opacityVal;\n\tuniformBufferData[4] = hasOpacitySig ? 1 : 0;\n\tuniformBufferData[5] = 0;\n\tuniformBufferData[6] = 0;\n\tuniformBufferData[7] = 0;\n\tfor (let i = 0; i < 16; i++) {\n\t\tconst stop = sortedStops[Math.min(i, numStops - 1)];\n\t\tconst baseIdx = 8 + i * 8;\n\t\tconst parsed = parseColor(stop.color);\n\t\tuniformBufferData[baseIdx + 0] = stop.position;\n\t\tuniformBufferData[baseIdx + 1] = 0;\n\t\tuniformBufferData[baseIdx + 2] = 0;\n\t\tuniformBufferData[baseIdx + 3] = 0;\n\t\tuniformBufferData[baseIdx + 4] = parsed.r;\n\t\tuniformBufferData[baseIdx + 5] = parsed.g;\n\t\tuniformBufferData[baseIdx + 6] = parsed.b;\n\t\tuniformBufferData[baseIdx + 7] = parsed.a;\n\t}\n\tconst { pipeline, uniformLayout, textureLayout, signalLayout } = getGradientMapResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst renderPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\trenderPass.setPipeline(pipeline);\n\trenderPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer }\n\t\t}]\n\t}));\n\trenderPass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler));\n\trenderPass.setBindGroup(2, ctx.device.createBindGroup({\n\t\tlayout: signalLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: opacityView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t}));\n\trenderPass.draw(4);\n\trenderPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: props.opacity ?? 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };\n\n//#endregion\nexport { GradientMapWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BZz0QfQj.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-DxTs4Iyi.mjs","names":[],"sources":["../../../nodes/node-gradient-map/dist/renderers-BZz0QfQj.mjs"],"sourcesContent":["import { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_GRADIENT_MAP_SHADER = `\nstruct GradientStop {\n\tpos : vec4<f32>,\n\tcol : vec4<f32>,\n};\n\nstruct GradientMapUniforms {\n\tnumStops : f32,\n\tisSmooth : f32,\n\tdither : f32,\n\topacity : f32,\n\n\thasOpacitySig : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n\n\tstops : array<GradientStop, 16>,\n};\n\n@group(0) @binding(0) var<uniform> u : GradientMapUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n\nstruct VSOut {\n\t@builtin(position) pos : vec4<f32>,\n\t@location(0) uv : vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\n\tvar pos = array<vec2<f32>, 4>(\n\t\tvec2<f32>(-1.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0),\n\t\tvec2<f32>(-1.0, -1.0),\n\t\tvec2<f32>(1.0, -1.0)\n\t);\n\tvar uv = array<vec2<f32>, 4>(\n\t\tvec2<f32>(0.0, 0.0),\n\t\tvec2<f32>(1.0, 0.0),\n\t\tvec2<f32>(0.0, 1.0),\n\t\tvec2<f32>(1.0, 1.0)\n\t);\n\treturn VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\n}\n\nfn ditherNoise(pos: vec2<f32>) -> f32 {\n\tlet p = fract(pos * vec2<f32>(0.1031, 0.1030));\n\tlet d = dot(p, p.yx + 33.33);\n\treturn fract((p.x + p.y) * d) - 0.5;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\t// ITU-R BT.709 Luminance\n\tvar lum = dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n\tif (u.dither > 0.5) {\n\t\tlet d = ditherNoise(in.pos.xy) * (1.0 / 255.0);\n\t\tlum = clamp(lum + d, 0.0, 1.0);\n\t} else {\n\t\tlum = clamp(lum, 0.0, 1.0);\n\t}\n\n\tlet count = i32(clamp(u.numStops, 2.0, 16.0));\n\tvar gradColor = u.stops[0].col.rgb;\n\n\tif (lum <= u.stops[0].pos.x) {\n\t\tgradColor = u.stops[0].col.rgb;\n\t} else if (lum >= u.stops[count - 1].pos.x) {\n\t\tgradColor = u.stops[count - 1].col.rgb;\n\t} else {\n\t\tfor (var i = 0; i < 15; i = i + 1) {\n\t\t\tif (i >= count - 1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet p0 = u.stops[i].pos.x;\n\t\t\tlet p1 = u.stops[i + 1].pos.x;\n\n\t\t\tif (lum >= p0 && lum <= p1) {\n\t\t\t\tlet range = max(p1 - p0, 1e-5);\n\t\t\t\tlet t = clamp((lum - p0) / range, 0.0, 1.0);\n\t\t\t\tif (u.isSmooth > 0.5) {\n\t\t\t\t\tgradColor = mix(u.stops[i].col.rgb, u.stops[i + 1].col.rgb, t);\n\t\t\t\t} else {\n\t\t\t\t\tgradColor = u.stops[i].col.rgb;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar opacity = u.opacity;\n\tif (u.hasOpacitySig > 0.5) {\n\t\topacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\topacity = clamp(opacity, 0.0, 1.0);\n\n\tlet finalRgb = mix(rgb, gradColor, opacity);\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nfunction getGradientMapResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = device.createBindGroupLayout({\n\t\tlabel: \"GradientMapUniformLayout\",\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tbuffer: { type: \"uniform\" }\n\t\t}]\n\t});\n\tconst textureLayout = device.createBindGroupLayout({\n\t\tlabel: \"GradientMapTextureLayout\",\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}]\n\t});\n\tconst signalLayout = device.createBindGroupLayout({\n\t\tlabel: \"GradientMapSignalLayout\",\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\ttexture: { sampleType: \"float\" }\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tvisibility: GPUShaderStage.FRAGMENT,\n\t\t\tsampler: { type: \"filtering\" }\n\t\t}]\n\t});\n\tconst module = device.createShaderModule({\n\t\tlabel: \"GradientMapShaderModule\",\n\t\tcode: WGSL_GRADIENT_MAP_SHADER\n\t});\n\tres = {\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"GradientMapPipeline\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalLayout\n\t\t\t] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(136);\nconst GradientMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"GradientMap\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst tmpTex = ctx.renderer.getTemporaryTexture(width, height, [...props.excludeTextures || [], targetTexture]);\n\tconst tmpView = tmpTex.createView();\n\tctx.renderer.beginFrame(encoder, tmpView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tctx.renderer.pushScissor({\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth,\n\t\theight\n\t});\n\tctx.renderer.pushIdentity();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia\n\t}, tmpView, tmpTex, width, height);\n\tctx.renderer.popTransform();\n\tctx.renderer.popScissor();\n\tconst sortedStops = [...Array.isArray(op.stops) ? op.stops : [{\n\t\tposition: 0,\n\t\tcolor: \"#000000\"\n\t}, {\n\t\tposition: 1,\n\t\tcolor: \"#ffffff\"\n\t}]].sort((a, b) => a.position - b.position);\n\tconst numStops = Math.min(Math.max(sortedStops.length, 2), 16);\n\tconst opacityHandleId = op.opacityHandleId;\n\tconst opacitySignalInput = opacityHandleId ? op.inputs?.[opacityHandleId] : null;\n\tconst hasOpacitySig = !!(opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Signal\");\n\tconst opacitySigData = hasOpacitySig ? opacitySignalInput?.outputItem?.data : null;\n\tlet opacityVal = Number(op.opacity ?? 1);\n\tif (!hasOpacitySig && opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Number\") opacityVal = Number(opacitySignalInput.outputItem.data ?? 1);\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : frame / fps;\n\tconst durationSeconds = props.virtualMedia?.metadata?.durationMs ? props.virtualMedia.metadata.durationMs / 1e3 : props.durationMs !== void 0 ? props.durationMs / 1e3 : 0;\n\tlet opacityView;\n\tif (hasOpacitySig && opacitySigData) opacityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, opacitySigData.nodeId ?? \"gradient_map_opacity\", elapsedSeconds, durationSeconds, opacitySigData, width, height, props.renderId, frame, fps);\n\telse opacityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = numStops;\n\tuniformBufferData[1] = op.smooth === false ? 0 : 1;\n\tuniformBufferData[2] = op.dither === false ? 0 : 1;\n\tuniformBufferData[3] = opacityVal;\n\tuniformBufferData[4] = hasOpacitySig ? 1 : 0;\n\tuniformBufferData[5] = 0;\n\tuniformBufferData[6] = 0;\n\tuniformBufferData[7] = 0;\n\tfor (let i = 0; i < 16; i++) {\n\t\tconst stop = sortedStops[Math.min(i, numStops - 1)];\n\t\tconst baseIdx = 8 + i * 8;\n\t\tconst parsed = parseColor(stop.color);\n\t\tuniformBufferData[baseIdx + 0] = stop.position;\n\t\tuniformBufferData[baseIdx + 1] = 0;\n\t\tuniformBufferData[baseIdx + 2] = 0;\n\t\tuniformBufferData[baseIdx + 3] = 0;\n\t\tuniformBufferData[baseIdx + 4] = parsed.r;\n\t\tuniformBufferData[baseIdx + 5] = parsed.g;\n\t\tuniformBufferData[baseIdx + 6] = parsed.b;\n\t\tuniformBufferData[baseIdx + 7] = parsed.a;\n\t}\n\tconst { pipeline, uniformLayout, textureLayout, signalLayout } = getGradientMapResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst renderPass = encoder.beginRenderPass({ colorAttachments: [{\n\t\tview: outTex.createView(),\n\t\tloadOp: \"clear\",\n\t\tstoreOp: \"store\",\n\t\tclearValue: {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}\n\t}] });\n\trenderPass.setPipeline(pipeline);\n\trenderPass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer }\n\t\t}]\n\t}));\n\trenderPass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler));\n\trenderPass.setBindGroup(2, ctx.device.createBindGroup({\n\t\tlayout: signalLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: opacityView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t}));\n\trenderPass.draw(4);\n\trenderPass.end();\n\tconst finalPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"load\");\n\tctx.renderer.drawTexture(finalPass, outTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t}, { opacity: props.opacity ?? 1 });\n\targs.pass = finalPass;\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };\n\n//#endregion\nexport { GradientMapWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BZz0QfQj.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { It as resolveNumber } from "./dist-B9Afsv83.mjs";
1
+ import { Jt as resolveNumber } from "./dist-CbG3QxDw.mjs";
2
2
  import { n as defineRenderer } from "./renderer-CtVkU_GA.mjs";
3
- import { C as WebGPUAudioProcessor } from "./dist-B9PkqWnN.mjs";
3
+ import { C as WebGPUAudioProcessor } from "./dist-Cxi68OuY.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-reverb/dist/renderers-DVURMqMp.mjs
6
6
  const PARAM_ORDER = [
@@ -377,4 +377,4 @@ var renderers_default = defineRenderer({ audioProcessor: reverbAudioProcessor })
377
377
 
378
378
  //#endregion
379
379
  export { renderers_default as t };
380
- //# sourceMappingURL=renderer-CNF10fCq.mjs.map
380
+ //# sourceMappingURL=renderer-Dy0utCl7.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CNF10fCq.mjs","names":[],"sources":["../../../nodes/node-audio-reverb/dist/renderers-DVURMqMp.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"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 inputs = op.inputs || {};\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 isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasRoomSizeSig = isHandleConnected(\"roomSizeHandleId\") ? 1 : 0;\n\tconst hasDampingSig = isHandleConnected(\"dampingHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(\"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(\"dryHandleId\") ? 1 : 0;\n\tconst hasWidthSig = isHandleConnected(\"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-DVURMqMp.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Dy0utCl7.mjs","names":[],"sources":["../../../nodes/node-audio-reverb/dist/renderers-DVURMqMp.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"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 inputs = op.inputs || {};\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 isHandleConnected = (handleIdKey) => {\n\t\tconst handleId = op[handleIdKey];\n\t\tif (typeof handleId !== \"string\" || !handleId) return false;\n\t\tconst input = inputs[handleId];\n\t\treturn Boolean(input?.connectionValid && input.outputItem && (input.outputItem.type === \"Signal\" || input.outputItem.type === \"Number\"));\n\t};\n\tconst hasRoomSizeSig = isHandleConnected(\"roomSizeHandleId\") ? 1 : 0;\n\tconst hasDampingSig = isHandleConnected(\"dampingHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(\"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(\"dryHandleId\") ? 1 : 0;\n\tconst hasWidthSig = isHandleConnected(\"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-DVURMqMp.mjs.map"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-Dy0utCl7.mjs";
2
+
3
+ export { renderers_default as default };