framefields 2.0.2 → 2.0.5

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 (206) hide show
  1. package/README.md +10 -32
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-x28ZgQBP.mjs → audio-COkiXyDb.mjs} +3 -3
  5. package/dist/{audio-x28ZgQBP.mjs.map → audio-COkiXyDb.mjs.map} +1 -1
  6. package/dist/{audio-Dvwwz8xU.d.mts → audio-nmU-BWxI.d.mts} +3 -3
  7. package/dist/{audio-Dvwwz8xU.d.mts.map → audio-nmU-BWxI.d.mts.map} +1 -1
  8. package/dist/{dist-1iUYuPct.mjs → dist-55MP0aN4.mjs} +59 -16
  9. package/dist/dist-55MP0aN4.mjs.map +1 -0
  10. package/dist/{dist-gjHmorxL.mjs → dist-DgIKXWZ1.mjs} +75 -16
  11. package/dist/dist-DgIKXWZ1.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +4 -4
  13. package/dist/effects/index.mjs +23 -23
  14. package/dist/{effects-CHWORCYd.mjs → effects-m3FuatqZ.mjs} +2 -2
  15. package/dist/{effects-CHWORCYd.mjs.map → effects-m3FuatqZ.mjs.map} +1 -1
  16. package/dist/fonts/index.d.mts +1 -1
  17. package/dist/fonts/index.mjs +1 -1
  18. package/dist/{fonts-DrGTBJJk.mjs → fonts-C_AWIMdb.mjs} +13 -2
  19. package/dist/fonts-C_AWIMdb.mjs.map +1 -0
  20. package/dist/{index-DKFGNyMB.d.mts → index-Bx7JBFT6.d.mts} +9 -2
  21. package/dist/index-Bx7JBFT6.d.mts.map +1 -0
  22. package/dist/{index-B0BNPEoH.d.mts → index-C8rstr3Y.d.mts} +5 -5
  23. package/dist/index-C8rstr3Y.d.mts.map +1 -0
  24. package/dist/{index-D2wJqSl5.d.mts → index-CAGDH7l6.d.mts} +3 -3
  25. package/dist/{index-D2wJqSl5.d.mts.map → index-CAGDH7l6.d.mts.map} +1 -1
  26. package/dist/{index-DiSKzDGR.d.mts → index-CbzEM_o6.d.mts} +8 -1
  27. package/dist/index-CbzEM_o6.d.mts.map +1 -0
  28. package/dist/{index-BMVVmc4G.d.mts → index-DY3mLoPO.d.mts} +2 -2
  29. package/dist/{index-BMVVmc4G.d.mts.map → index-DY3mLoPO.d.mts.map} +1 -1
  30. package/dist/{index-D1ZsMpke.d.mts → index-i0xPY4Fe.d.mts} +3 -3
  31. package/dist/{index-D1ZsMpke.d.mts.map → index-i0xPY4Fe.d.mts.map} +1 -1
  32. package/dist/{index-D2jDC7O5.d.mts → index-ogL8Y-Ng.d.mts} +9 -1
  33. package/dist/index-ogL8Y-Ng.d.mts.map +1 -0
  34. package/dist/index.d.mts +88 -70
  35. package/dist/index.d.mts.map +1 -1
  36. package/dist/index.mjs +44 -39
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/preview/index.d.mts +3 -3
  39. package/dist/preview/index.mjs +10 -10
  40. package/dist/{preview-uQM210iy.mjs → preview-BM0Zzcn1.mjs} +74 -66
  41. package/dist/preview-BM0Zzcn1.mjs.map +1 -0
  42. package/dist/preview-engine/{chunk-HAXK42HG.mjs → chunk-2RMSCL6V.mjs} +1 -1
  43. package/dist/preview-engine/chunk-45JOFIHE.mjs +8 -0
  44. package/dist/preview-engine/{chunk-MT2DZQHO.mjs → chunk-4Q7JG6WJ.mjs} +1 -1
  45. package/dist/preview-engine/chunk-7S6ZFYLI.mjs +418 -0
  46. package/dist/preview-engine/chunk-KNZU3Z2F.mjs +3 -0
  47. package/dist/preview-engine/{chunk-SWD76532.mjs → chunk-PCB2VB5K.mjs} +2 -2
  48. package/dist/preview-engine/{chunk-GYG2IIBR.mjs → chunk-RJJRPL42.mjs} +1 -1
  49. package/dist/preview-engine/chunk-UC7CSW2A.mjs +1 -0
  50. package/dist/preview-engine/{chunk-4BEJJKEU.mjs → chunk-YK4XHUP4.mjs} +7 -7
  51. package/dist/preview-engine/effects.mjs +1 -1
  52. package/dist/preview-engine/fonts.mjs +1 -1
  53. package/dist/preview-engine/framefields.mjs +84 -76
  54. package/dist/preview-engine/player.mjs +5 -5
  55. package/dist/preview-engine/{renderers-YVN3EIOP.mjs → renderers-76MPTVZK.mjs} +1 -1
  56. package/dist/preview-engine/{renderers-R3XEYD5V.mjs → renderers-LFA5NW4V.mjs} +1 -1
  57. package/dist/{program-Dl510wmI.mjs → program-DGqyGGvj.mjs} +2 -2
  58. package/dist/{program-Dl510wmI.mjs.map → program-DGqyGGvj.mjs.map} +1 -1
  59. package/dist/renderer/index.d.mts +2 -2
  60. package/dist/renderer/index.mjs +2 -2
  61. package/dist/renderer--fkO4O8d.mjs +3 -0
  62. package/dist/{renderer-D7EX8IjU.mjs → renderer-0gJC-sc8.mjs} +2 -2
  63. package/dist/{renderer-D7EX8IjU.mjs.map → renderer-0gJC-sc8.mjs.map} +1 -1
  64. package/dist/{renderer-7DOcIxFG.mjs → renderer-2r4EgfdZ.mjs} +2 -2
  65. package/dist/{renderer-7DOcIxFG.mjs.map → renderer-2r4EgfdZ.mjs.map} +1 -1
  66. package/dist/{renderer-COkcU3db.mjs → renderer-5OiVjQan.mjs} +4 -4
  67. package/dist/{renderer-COkcU3db.mjs.map → renderer-5OiVjQan.mjs.map} +1 -1
  68. package/dist/renderer-6x7CgHhJ.mjs +3 -0
  69. package/dist/renderer-B0RDWv1C.mjs +3 -0
  70. package/dist/{renderer-CMzEjdzi.mjs → renderer-B9l641o-.mjs} +2 -2
  71. package/dist/{renderer-CMzEjdzi.mjs.map → renderer-B9l641o-.mjs.map} +1 -1
  72. package/dist/renderer-BFOkGS0N.mjs +3 -0
  73. package/dist/{renderer-pxXf9dvk.mjs → renderer-BJiL-BQY.mjs} +2 -2
  74. package/dist/{renderer-pxXf9dvk.mjs.map → renderer-BJiL-BQY.mjs.map} +1 -1
  75. package/dist/{renderer-B1CvhW4p.mjs → renderer-BMrm2Zbz.mjs} +2 -2
  76. package/dist/{renderer-B1CvhW4p.mjs.map → renderer-BMrm2Zbz.mjs.map} +1 -1
  77. package/dist/{renderer-Cj-whdVr.mjs → renderer-BUHMkkLU.mjs} +2 -2
  78. package/dist/{renderer-Cj-whdVr.mjs.map → renderer-BUHMkkLU.mjs.map} +1 -1
  79. package/dist/{renderer-CB5aWAaf.mjs → renderer-BYsmLk63.mjs} +2 -2
  80. package/dist/{renderer-CB5aWAaf.mjs.map → renderer-BYsmLk63.mjs.map} +1 -1
  81. package/dist/renderer-BaoJiMJO.mjs +3 -0
  82. package/dist/{renderer-DbaQLI4z.mjs → renderer-BtkU0BT-.mjs} +2 -2
  83. package/dist/{renderer-DbaQLI4z.mjs.map → renderer-BtkU0BT-.mjs.map} +1 -1
  84. package/dist/{renderer-Dt6fzgX5.mjs → renderer-Bwsh5TUv.mjs} +2 -2
  85. package/dist/{renderer-Dt6fzgX5.mjs.map → renderer-Bwsh5TUv.mjs.map} +1 -1
  86. package/dist/{renderer-vCFTm0oe.mjs → renderer-C28Bab-M.mjs} +2 -2
  87. package/dist/{renderer-vCFTm0oe.mjs.map → renderer-C28Bab-M.mjs.map} +1 -1
  88. package/dist/{renderer-HFfcJlmR.mjs → renderer-C3L9SNRO.mjs} +2 -2
  89. package/dist/{renderer-HFfcJlmR.mjs.map → renderer-C3L9SNRO.mjs.map} +1 -1
  90. package/dist/renderer-C4O-L73n.mjs +3 -0
  91. package/dist/{renderer-CB7lH5K8.mjs → renderer-C9BKcHZb.mjs} +1 -1
  92. package/dist/renderer-CGVuhBbA.mjs +3 -0
  93. package/dist/renderer-CHKB-Or4.mjs +3 -0
  94. package/dist/renderer-CL9gPcfZ.mjs +3 -0
  95. package/dist/{renderer-BXMmISWG.mjs → renderer-CMM4DZ1i.mjs} +2 -2
  96. package/dist/{renderer-BXMmISWG.mjs.map → renderer-CMM4DZ1i.mjs.map} +1 -1
  97. package/dist/{renderer-C17wL9QX.mjs → renderer-COkFM1KL.mjs} +2 -2
  98. package/dist/{renderer-C17wL9QX.mjs.map → renderer-COkFM1KL.mjs.map} +1 -1
  99. package/dist/renderer-CSkFF-qe.mjs +3 -0
  100. package/dist/renderer-CU2c6zWc.mjs +3 -0
  101. package/dist/{renderer-CDOUAN7X.mjs → renderer-CXUohIJ9.mjs} +2 -2
  102. package/dist/{renderer-CDOUAN7X.mjs.map → renderer-CXUohIJ9.mjs.map} +1 -1
  103. package/dist/{renderer-ByDhfrPE.mjs → renderer-CeADvUU_.mjs} +2 -2
  104. package/dist/{renderer-ByDhfrPE.mjs.map → renderer-CeADvUU_.mjs.map} +1 -1
  105. package/dist/{renderer-CH8sdfYX.mjs → renderer-CgVdRbc-.mjs} +2 -2
  106. package/dist/{renderer-CH8sdfYX.mjs.map → renderer-CgVdRbc-.mjs.map} +1 -1
  107. package/dist/renderer-CiLiH6w_.mjs +3 -0
  108. package/dist/{renderer-Dp_FfvF-.mjs → renderer-CnRoblJF.mjs} +2 -2
  109. package/dist/{renderer-Dp_FfvF-.mjs.map → renderer-CnRoblJF.mjs.map} +1 -1
  110. package/dist/{renderer-BAQmR0Zo.mjs → renderer-CsQ7nY0z.mjs} +1 -1
  111. package/dist/{renderer-CclIvsLO.mjs → renderer-CwAjqb2o.mjs} +1 -1
  112. package/dist/{renderer-CszOjcRW.mjs → renderer-Cx5H41JR.mjs} +1 -1
  113. package/dist/{renderer-Fco4EmAu.mjs → renderer-D1Zs78PQ.mjs} +126 -105
  114. package/dist/{renderer-Fco4EmAu.mjs.map → renderer-D1Zs78PQ.mjs.map} +1 -1
  115. package/dist/{renderer-BQHbp-Sp.mjs → renderer-D1ib-wB3.mjs} +2 -2
  116. package/dist/{renderer-BQHbp-Sp.mjs.map → renderer-D1ib-wB3.mjs.map} +1 -1
  117. package/dist/{renderer-Tp6OXWNZ.mjs → renderer-D54yO_M_.mjs} +2 -2
  118. package/dist/{renderer-Tp6OXWNZ.mjs.map → renderer-D54yO_M_.mjs.map} +1 -1
  119. package/dist/{renderer-Cl1oUXMi.mjs → renderer-D5N2JO7g.mjs} +2 -2
  120. package/dist/{renderer-Cl1oUXMi.mjs.map → renderer-D5N2JO7g.mjs.map} +1 -1
  121. package/dist/{renderer-BsgIcBKH.mjs → renderer-DBp6A7tR.mjs} +2 -2
  122. package/dist/{renderer-BsgIcBKH.mjs.map → renderer-DBp6A7tR.mjs.map} +1 -1
  123. package/dist/{renderer-vvpdx1vk.mjs → renderer-DI2RcpKU.mjs} +2 -2
  124. package/dist/{renderer-vvpdx1vk.mjs.map → renderer-DI2RcpKU.mjs.map} +1 -1
  125. package/dist/renderer-DMaYsSM4.mjs +3 -0
  126. package/dist/renderer-DZ7t_l1d.mjs +3 -0
  127. package/dist/{renderer-Ryo2CEFD.mjs → renderer-D_QS6p1q.mjs} +2 -2
  128. package/dist/{renderer-Ryo2CEFD.mjs.map → renderer-D_QS6p1q.mjs.map} +1 -1
  129. package/dist/{renderer-DDp7_TUi.d.mts → renderer-DcPOsAVu.d.mts} +2 -2
  130. package/dist/{renderer-DDp7_TUi.d.mts.map → renderer-DcPOsAVu.d.mts.map} +1 -1
  131. package/dist/{renderer-B_NuVaIP.mjs → renderer-Dcd-Pkzd.mjs} +2 -2
  132. package/dist/{renderer-B_NuVaIP.mjs.map → renderer-Dcd-Pkzd.mjs.map} +1 -1
  133. package/dist/{renderer-WkVrkCVA.mjs → renderer-DjiUZ0Vs.mjs} +2 -2
  134. package/dist/{renderer-WkVrkCVA.mjs.map → renderer-DjiUZ0Vs.mjs.map} +1 -1
  135. package/dist/renderer-DkJEnKQu.mjs +3 -0
  136. package/dist/renderer-DlkrKqQj.mjs +3 -0
  137. package/dist/renderer-DxOQ5S8T.mjs +3 -0
  138. package/dist/renderer-Ibvw1tE_.mjs +3 -0
  139. package/dist/{renderer-CwQhzcUn.mjs → renderer-JjMO41Cv.mjs} +2 -2
  140. package/dist/{renderer-CwQhzcUn.mjs.map → renderer-JjMO41Cv.mjs.map} +1 -1
  141. package/dist/renderer-M0jeFo6S.mjs +4 -0
  142. package/dist/renderer-NhSzqWsQ.mjs +3 -0
  143. package/dist/renderer-OrhgkzVu.mjs +3 -0
  144. package/dist/{renderer-DxjVQV6f.mjs → renderer-Q7_DUcnu.mjs} +2 -2
  145. package/dist/{renderer-DxjVQV6f.mjs.map → renderer-Q7_DUcnu.mjs.map} +1 -1
  146. package/dist/{renderer-I-Sw3JBB.mjs → renderer-QfSB-cRU.mjs} +2 -2
  147. package/dist/{renderer-I-Sw3JBB.mjs.map → renderer-QfSB-cRU.mjs.map} +1 -1
  148. package/dist/{renderer-OWQmmg4Z.mjs → renderer-WXylxlu2.mjs} +2 -2
  149. package/dist/{renderer-OWQmmg4Z.mjs.map → renderer-WXylxlu2.mjs.map} +1 -1
  150. package/dist/renderer-WrFAaLxW.mjs +3 -0
  151. package/dist/renderer-bbOALT4F.mjs +3 -0
  152. package/dist/{renderer-BGXU6vcW.mjs → renderer-bebAt6Dz.mjs} +2 -2
  153. package/dist/{renderer-BGXU6vcW.mjs.map → renderer-bebAt6Dz.mjs.map} +1 -1
  154. package/dist/{renderer-B9-QSJcG.mjs → renderer-eC1gRPRo.mjs} +2 -2
  155. package/dist/{renderer-B9-QSJcG.mjs.map → renderer-eC1gRPRo.mjs.map} +1 -1
  156. package/dist/renderer-lXmyzdcx.mjs +3 -0
  157. package/dist/renderer-ospMsCzr.mjs +3 -0
  158. package/dist/{renderer-k2JL79kM.mjs → renderer-vUjNMbLq.mjs} +2 -2
  159. package/dist/{renderer-k2JL79kM.mjs.map → renderer-vUjNMbLq.mjs.map} +1 -1
  160. package/dist/renderer-xc9wkiC7.mjs +3 -0
  161. package/dist/{renderer-XcmYTd6P.mjs → renderer-z6Qb5Z-W.mjs} +143 -4
  162. package/dist/renderer-z6Qb5Z-W.mjs.map +1 -0
  163. package/dist/{renderers-BWg16W-V-BXG_cjhM.mjs → renderers-BWg16W-V-jhdCp6Vd.mjs} +2 -2
  164. package/dist/{renderers-BWg16W-V-BXG_cjhM.mjs.map → renderers-BWg16W-V-jhdCp6Vd.mjs.map} +1 -1
  165. package/dist/signals/index.d.mts +5 -5
  166. package/dist/signals/index.mjs +4 -4
  167. package/package.json +55 -55
  168. package/dist/dist-1iUYuPct.mjs.map +0 -1
  169. package/dist/dist-gjHmorxL.mjs.map +0 -1
  170. package/dist/fonts-DrGTBJJk.mjs.map +0 -1
  171. package/dist/index-B0BNPEoH.d.mts.map +0 -1
  172. package/dist/index-D2jDC7O5.d.mts.map +0 -1
  173. package/dist/index-DKFGNyMB.d.mts.map +0 -1
  174. package/dist/index-DiSKzDGR.d.mts.map +0 -1
  175. package/dist/preview-engine/chunk-47VT677S.mjs +0 -8
  176. package/dist/preview-engine/chunk-DPST2XLC.mjs +0 -418
  177. package/dist/preview-engine/chunk-DRLEOHN5.mjs +0 -1
  178. package/dist/preview-engine/chunk-SZ7YRPKO.mjs +0 -3
  179. package/dist/preview-uQM210iy.mjs.map +0 -1
  180. package/dist/renderer-3BNskNuJ.mjs +0 -3
  181. package/dist/renderer-9dHlMQGX.mjs +0 -3
  182. package/dist/renderer-BGvORwkQ.mjs +0 -3
  183. package/dist/renderer-BLikd6BK.mjs +0 -3
  184. package/dist/renderer-BSbTJBWc.mjs +0 -3
  185. package/dist/renderer-BU1rwNRT.mjs +0 -3
  186. package/dist/renderer-BZJm3m4f.mjs +0 -3
  187. package/dist/renderer-BqyAgNt3.mjs +0 -3
  188. package/dist/renderer-BryTM2g7.mjs +0 -3
  189. package/dist/renderer-CQCoggIa.mjs +0 -3
  190. package/dist/renderer-CV2m6k1V.mjs +0 -3
  191. package/dist/renderer-CYY-poLe.mjs +0 -3
  192. package/dist/renderer-C_Ki91kc.mjs +0 -3
  193. package/dist/renderer-CmApuKjS.mjs +0 -3
  194. package/dist/renderer-Cu074POw.mjs +0 -3
  195. package/dist/renderer-D4qLmox-.mjs +0 -3
  196. package/dist/renderer-D6cJ6MSq.mjs +0 -3
  197. package/dist/renderer-DQLGnEFc.mjs +0 -3
  198. package/dist/renderer-DY2SVYUW.mjs +0 -3
  199. package/dist/renderer-DoAY5JbB.mjs +0 -4
  200. package/dist/renderer-DuplLRbp.mjs +0 -3
  201. package/dist/renderer-DvfUbZ31.mjs +0 -3
  202. package/dist/renderer-Q_uUQipO.mjs +0 -3
  203. package/dist/renderer-UQFCgeNx.mjs +0 -3
  204. package/dist/renderer-XcmYTd6P.mjs.map +0 -1
  205. package/dist/renderer-eMsnzJg9.mjs +0 -3
  206. package/dist/renderer-pHiz78e0.mjs +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Dp_FfvF-.mjs","names":[],"sources":["../../../nodes/node-vignette/dist/renderers-BgSXYX3i.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VIGNETTE_SHADER = `\nstruct VignetteUniforms {\n strength : f32,\n radius : f32,\n softness : f32,\n roundness : f32,\n\n centerX : f32,\n centerY : f32,\n hasStrengthSig : f32,\n hasRadiusSig : f32,\n\n hasSoftnessSig : f32,\n hasRoundnessSig: f32,\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : VignetteUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(2) var softnessSigTex : texture_2d<f32>;\n@group(2) @binding(3) var roundnessSigTex : texture_2d<f32>;\n@group(2) @binding(4) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(5) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(6) var signalSamp : 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\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n if (color.a < 1e-5) {\n return color;\n }\n\n // Resolve parameter overrides or dynamic signals\n var strength = u.strength;\n if (u.hasStrengthSig > 0.5) {\n strength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var softness = u.softness;\n if (u.hasSoftnessSig > 0.5) {\n softness = textureSampleLevel(softnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var roundness = u.roundness;\n if (u.hasRoundnessSig > 0.5) {\n roundness = textureSampleLevel(roundnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let center = vec2<f32>(centerX, centerY);\n let dimensions = vec2<f32>(textureDimensions(tex));\n let aspect = dimensions.x / dimensions.y;\n let uvOffset = in.uv - center;\n\n // Calculate aspect ratio corrected coordinate for circle\n let correctedOffset = vec2<f32>(\n uvOffset.x * mix(1.0, aspect, roundness),\n uvOffset.y\n );\n let dist = length(correctedOffset);\n\n // Calculate vignette edge falloff\n let edge0 = radius;\n let edge1 = max(0.0, radius - softness);\n let vignetteFactor = smoothstep(edge0, edge1, dist);\n\n // Blend based on strength\n let intensity = strength / 100.0;\n let finalVignette = mix(1.0, vignetteFactor, intensity);\n\n // Unpremultiply, apply vignette, and repremultiply\n let unpremult_rgb = color.rgb / color.a;\n let final_rgb = unpremult_rgb * finalVignette;\n\n return vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * color.a, color.a);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst vignetteUniformData = new Float32Array(12);\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\tsingleTextureLayout: 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\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 getVignetteResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `vignette_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vignetteModule = device.createShaderModule({\n\t\t\tlabel: `vignette_${format}.wgsl`,\n\t\t\tcode: VIGNETTE_SHADER\n\t\t});\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: `VignettePipeline_${format}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: vignetteModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: vignetteModule,\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\tvignettePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst VignetteWebGPURenderer = 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 !== \"Vignette\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"vignette_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView = void 0;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tlet rawVal = op[configKey];\n\t\t\tif (rawVal !== void 0 && rawVal !== null) {\n\t\t\t\tif (typeof rawVal === \"object\" && \"value\" in rawVal) {\n\t\t\t\t\tconst sig = rawVal;\n\t\t\t\t\tif (sig.gpuBinding?.textureView) {\n\t\t\t\t\t\tgpuTextureView = sig.gpuBinding.textureView;\n\t\t\t\t\t\thasStaticSig = true;\n\t\t\t\t\t}\n\t\t\t\t\trawVal = sig.value;\n\t\t\t\t} else if (typeof rawVal === \"function\") rawVal = rawVal(frame, fps);\n\t\t\t}\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 50, 0, 100);\n\tconst radiusRes = resolveBindable(\"radius\", 1, .1, 2);\n\tconst softnessRes = resolveBindable(\"softness\", .5, 0, 1);\n\tconst roundnessRes = resolveBindable(\"roundness\", .5, 0, 1);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1);\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\targs.pass.end();\n\tconst { vignettePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getVignetteResources(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 : 0;\n\tconst getSignalView = (res, suffix) => {\n\t\tif (res.gpuTextureView) return res.gpuTextureView;\n\t\tif (res.hasStaticSig && res.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, res.sd.nodeId ?? `${nodeId}_${suffix}`, elapsedSeconds, durationSeconds, res.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst softnessView = getSignalView(softnessRes, \"softness_sig\");\n\tconst roundnessView = getSignalView(roundnessRes, \"roundness_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\tvignetteUniformData[0] = strengthRes.val;\n\tvignetteUniformData[1] = radiusRes.val;\n\tvignetteUniformData[2] = softnessRes.val;\n\tvignetteUniformData[3] = roundnessRes.val;\n\tvignetteUniformData[4] = centerXRes.val;\n\tvignetteUniformData[5] = centerYRes.val;\n\tvignetteUniformData[6] = strengthRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[7] = radiusRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[8] = softnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[9] = roundnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[10] = centerXRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[11] = centerYRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vignetteUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst vignettePass = 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\tvignettePass.setPipeline(pipeline);\n\tvignettePass.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\tvignettePass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler));\n\tvignettePass.setBindGroup(2, 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: strengthView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: softnessView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: roundnessView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: centerXView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: centerYView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\tvignettePass.draw(4);\n\tvignettePass.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: VignetteWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BgSXYX3i.mjs.map"],"mappings":";;;;AAIA,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqHxB,MAAM,sCAAsC,IAAI,SAAS;AACzD,MAAM,sBAAsB,IAAI,aAAa,GAAG;AAChD,SAAS,iBAAiB,QAAQ;CACjC,IAAI,MAAM,oBAAoB,IAAI,OAAO;AACzC,KAAI,IAAK,QAAO;AAChB,OAAM;EACL,eAAe,OAAO,sBAAsB,EAAE,SAAS,CAAC;GACvD,SAAS;GACT,YAAY,eAAe;GAC3B,QAAQ,EAAE,MAAM,WAAW;GAC3B,CAAC,EAAE,CAAC;EACL,qBAAqB,OAAO,sBAAsB,EAAE,SAAS,CAAC;GAC7D,SAAS;GACT,YAAY,eAAe;GAC3B,SAAS,EAAE,YAAY,SAAS;GAChC,EAAE;GACF,SAAS;GACT,YAAY,eAAe;GAC3B,SAAS,EAAE,MAAM,aAAa;GAC9B,CAAC,EAAE,CAAC;EACL,qBAAqB,OAAO,sBAAsB,EAAE,SAAS;GAC5D;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,SAAS,EAAE,YAAY,SAAS;IAChC;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,SAAS,EAAE,YAAY,SAAS;IAChC;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,SAAS,EAAE,YAAY,SAAS;IAChC;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,SAAS,EAAE,YAAY,SAAS;IAChC;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,SAAS,EAAE,YAAY,SAAS;IAChC;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,SAAS,EAAE,YAAY,SAAS;IAChC;GACD;IACC,SAAS;IACT,YAAY,eAAe;IAC3B,SAAS,EAAE,MAAM,aAAa;IAC9B;GACD,EAAE,CAAC;EACJ,+BAA+B,IAAI,KAAK;EACxC;AACD,qBAAoB,IAAI,QAAQ,IAAI;AACpC,QAAO;;AAER,SAAS,qBAAqB,QAAQ,QAAQ;CAC7C,MAAM,UAAU,iBAAiB,OAAO;CACxC,MAAM,WAAW,YAAY;CAC7B,IAAI,WAAW,QAAQ,cAAc,IAAI,SAAS;AAClD,KAAI,CAAC,UAAU;EACd,MAAM,iBAAiB,OAAO,mBAAmB;GAChD,OAAO,YAAY,OAAO;GAC1B,MAAM;GACN,CAAC;AACF,aAAW,OAAO,qBAAqB;GACtC,OAAO,oBAAoB;GAC3B,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB;IACvD,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,EAAE,CAAC;GACJ,QAAQ;IACP,QAAQ;IACR,YAAY;IACZ;GACD,UAAU;IACT,QAAQ;IACR,YAAY;IACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB;GACD,WAAW,EAAE,UAAU,kBAAkB;GACzC,CAAC;AACF,UAAQ,cAAc,IAAI,UAAU,SAAS;;AAE9C,QAAO;EACN,kBAAkB;EAClB,eAAe,QAAQ;EACvB,qBAAqB,QAAQ;EAC7B,qBAAqB,QAAQ;EAC7B;;AAEF,MAAM,yBAAyB,OAAO,SAAS;CAC9C,MAAM,EAAE,KAAK,SAAS,MAAM,YAAY,eAAe,aAAa,cAAc,OAAO,cAAc;CACvG,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,cAAc,CAAC,GAAI;CAClC,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,SAAS,GAAG,SAAS,OAAO,KAAK,GAAG,OAAO,CAAC,KAAK;CACvD,MAAM,mBAAmB,WAAW,cAAc,QAAQ,WAAW;EACpE,MAAM,WAAW,GAAG,GAAG,UAAU;EACjC,MAAM,QAAQ,WAAW,GAAG,SAAS,YAAY;EACjD,MAAM,YAAY,CAAC,EAAE,OAAO,oBAAoB,MAAM,YAAY,SAAS,YAAY,MAAM,YAAY,SAAS;EAClH,MAAM,KAAK,aAAa,OAAO,YAAY,OAAO,MAAM,WAAW,OAAO;EAC1E,IAAI,MAAM;EACV,IAAI,eAAe;EACnB,IAAI,iBAAiB,KAAK;AAC1B,MAAI,CAAC,UAAW,KAAI,OAAO,mBAAmB,MAAM,YAAY,SAAS,SAAU,OAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO,MAAM,WAAW,QAAQ,aAAa,CAAC,CAAC;OACrK;GACJ,IAAI,SAAS,GAAG;AAChB,OAAI,WAAW,KAAK,KAAK,WAAW,MACnC;QAAI,OAAO,WAAW,YAAY,WAAW,QAAQ;KACpD,MAAM,MAAM;AACZ,SAAI,IAAI,YAAY,aAAa;AAChC,uBAAiB,IAAI,WAAW;AAChC,qBAAe;;AAEhB,cAAS,IAAI;eACH,OAAO,WAAW,WAAY,UAAS,OAAO,OAAO,IAAI;;GAErE,MAAM,SAAS,OAAO,UAAU,aAAa;AAC7C,SAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,MAAM,OAAO,GAAG,eAAe,OAAO,CAAC;;WAEvE,IAAI;AACZ,SAAM,KAAK,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO,GAAG,UAAU,EAAE,CAAC,CAAC;AAChE,kBAAe;;AAEhB,SAAO;GACN;GACA;GACA;GACA;GACA;;CAEF,MAAM,cAAc,gBAAgB,YAAY,IAAI,GAAG,IAAI;CAC3D,MAAM,YAAY,gBAAgB,UAAU,GAAG,IAAI,EAAE;CACrD,MAAM,cAAc,gBAAgB,YAAY,IAAI,GAAG,EAAE;CACzD,MAAM,eAAe,gBAAgB,aAAa,IAAI,GAAG,EAAE;CAC3D,MAAM,aAAa,gBAAgB,WAAW,IAAI,GAAG,EAAE;CACvD,MAAM,aAAa,gBAAgB,WAAW,IAAI,GAAG,EAAE;CACvD,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ,CAAC,GAAG,MAAM,mBAAmB,EAAE,EAAE,cAAc,CAAC;CAC/G,MAAM,UAAU,OAAO,YAAY;AACnC,KAAI,SAAS,WAAW,SAAS,SAAS;EACzC,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,OAAO,QAAQ,QAAQ,CAAC,KAAK;AAChC,KAAI,SAAS,YAAY;EACxB,GAAG;EACH,GAAG;EACH;EACA;EACA,CAAC;AACF,KAAI,SAAS,cAAc;AAC3B,OAAM,UAAU,YAAY;EAC3B,GAAG;EACH,cAAc;EACd,EAAE,SAAS,QAAQ,OAAO,OAAO;AAClC,KAAI,SAAS,cAAc;AAC3B,KAAI,SAAS,YAAY;AACzB,MAAK,KAAK,KAAK;CACf,MAAM,EAAE,kBAAkB,UAAU,eAAe,SAAS,qBAAqB,SAAS,qBAAqB,cAAc,qBAAqB,IAAI,QAAQ,IAAI,SAAS,OAAO;CAClL,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,iBAAiB,MAAM,cAAc,KAAK,IAAI,MAAM,YAAY,MAAM,QAAQ;CACpF,MAAM,kBAAkB,MAAM,cAAc,UAAU,aAAa,MAAM,aAAa,SAAS,aAAa,MAAM,MAAM,eAAe,KAAK,IAAI,MAAM,aAAa,MAAM;CACzK,MAAM,iBAAiB,KAAK,WAAW;AACtC,MAAI,IAAI,eAAgB,QAAO,IAAI;AACnC,MAAI,IAAI,gBAAgB,IAAI,GAAI,QAAO,eAAe,yBAAyB,IAAI,QAAQ,SAAS,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,gBAAgB,iBAAiB,IAAI,IAAI,OAAO,QAAQ,MAAM,UAAU,OAAO,IAAI;AAC/N,SAAO,eAAe,uBAAuB,IAAI,OAAO;;CAEzD,MAAM,eAAe,cAAc,aAAa,eAAe;CAC/D,MAAM,aAAa,cAAc,WAAW,aAAa;CACzD,MAAM,eAAe,cAAc,aAAa,eAAe;CAC/D,MAAM,gBAAgB,cAAc,cAAc,gBAAgB;CAClE,MAAM,cAAc,cAAc,YAAY,cAAc;CAC5D,MAAM,cAAc,cAAc,YAAY,cAAc;AAC5D,qBAAoB,KAAK,YAAY;AACrC,qBAAoB,KAAK,UAAU;AACnC,qBAAoB,KAAK,YAAY;AACrC,qBAAoB,KAAK,aAAa;AACtC,qBAAoB,KAAK,WAAW;AACpC,qBAAoB,KAAK,WAAW;AACpC,qBAAoB,KAAK,YAAY,eAAe,IAAI;AACxD,qBAAoB,KAAK,UAAU,eAAe,IAAI;AACtD,qBAAoB,KAAK,YAAY,eAAe,IAAI;AACxD,qBAAoB,KAAK,aAAa,eAAe,IAAI;AACzD,qBAAoB,MAAM,WAAW,eAAe,IAAI;AACxD,qBAAoB,MAAM,WAAW,eAAe,IAAI;CACxD,MAAM,gBAAgB,IAAI,SAAS,mBAAmB,oBAAoB;CAC1E,MAAM,SAAS,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC9D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,eAAe,QAAQ,gBAAgB,EAAE,kBAAkB,CAAC;EACjE,MAAM,OAAO,YAAY;EACzB,QAAQ;EACR,SAAS;EACT,YAAY;GACX,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH;EACD,CAAC,EAAE,CAAC;AACL,cAAa,YAAY,SAAS;AAClC,cAAa,aAAa,GAAG,IAAI,OAAO,gBAAgB;EACvD,QAAQ;EACR,SAAS,CAAC;GACT,SAAS;GACT,UAAU,EAAE,QAAQ,eAAe;GACnC,CAAC;EACF,CAAC,CAAC;AACH,cAAa,aAAa,GAAG,IAAI,SAAS,eAAe,aAAa,IAAI,QAAQ,SAAS,QAAQ,QAAQ,CAAC;AAC5G,cAAa,aAAa,GAAG,IAAI,OAAO,gBAAgB;EACvD,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;EACD,CAAC,CAAC;AACH,cAAa,KAAK,EAAE;AACpB,cAAa,KAAK;CAClB,MAAM,YAAY,IAAI,SAAS,WAAW,SAAS,YAAY;EAC9D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,OAAO;AACrC,KAAI,SAAS,YAAY,WAAW,QAAQ;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,EAAE,EAAE,SAAS,GAAG,WAAW,GAAG,CAAC;AAChC,MAAK,OAAO;;AAKb,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,wBAAwB,CAAC"}
1
+ {"version":3,"file":"renderer-CnRoblJF.mjs","names":[],"sources":["../../../nodes/node-vignette/dist/renderers-BgSXYX3i.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VIGNETTE_SHADER = `\nstruct VignetteUniforms {\n strength : f32,\n radius : f32,\n softness : f32,\n roundness : f32,\n\n centerX : f32,\n centerY : f32,\n hasStrengthSig : f32,\n hasRadiusSig : f32,\n\n hasSoftnessSig : f32,\n hasRoundnessSig: f32,\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : VignetteUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(2) var softnessSigTex : texture_2d<f32>;\n@group(2) @binding(3) var roundnessSigTex : texture_2d<f32>;\n@group(2) @binding(4) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(5) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(6) var signalSamp : 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\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n if (color.a < 1e-5) {\n return color;\n }\n\n // Resolve parameter overrides or dynamic signals\n var strength = u.strength;\n if (u.hasStrengthSig > 0.5) {\n strength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var softness = u.softness;\n if (u.hasSoftnessSig > 0.5) {\n softness = textureSampleLevel(softnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var roundness = u.roundness;\n if (u.hasRoundnessSig > 0.5) {\n roundness = textureSampleLevel(roundnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let center = vec2<f32>(centerX, centerY);\n let dimensions = vec2<f32>(textureDimensions(tex));\n let aspect = dimensions.x / dimensions.y;\n let uvOffset = in.uv - center;\n\n // Calculate aspect ratio corrected coordinate for circle\n let correctedOffset = vec2<f32>(\n uvOffset.x * mix(1.0, aspect, roundness),\n uvOffset.y\n );\n let dist = length(correctedOffset);\n\n // Calculate vignette edge falloff\n let edge0 = radius;\n let edge1 = max(0.0, radius - softness);\n let vignetteFactor = smoothstep(edge0, edge1, dist);\n\n // Blend based on strength\n let intensity = strength / 100.0;\n let finalVignette = mix(1.0, vignetteFactor, intensity);\n\n // Unpremultiply, apply vignette, and repremultiply\n let unpremult_rgb = color.rgb / color.a;\n let final_rgb = unpremult_rgb * finalVignette;\n\n return vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * color.a, color.a);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst vignetteUniformData = new Float32Array(12);\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\tsingleTextureLayout: 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\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 getVignetteResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `vignette_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vignetteModule = device.createShaderModule({\n\t\t\tlabel: `vignette_${format}.wgsl`,\n\t\t\tcode: VIGNETTE_SHADER\n\t\t});\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: `VignettePipeline_${format}`,\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t] }),\n\t\t\tvertex: {\n\t\t\t\tmodule: vignetteModule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule: vignetteModule,\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\tvignettePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst VignetteWebGPURenderer = 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 !== \"Vignette\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"vignette_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView = void 0;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tlet rawVal = op[configKey];\n\t\t\tif (rawVal !== void 0 && rawVal !== null) {\n\t\t\t\tif (typeof rawVal === \"object\" && \"value\" in rawVal) {\n\t\t\t\t\tconst sig = rawVal;\n\t\t\t\t\tif (sig.gpuBinding?.textureView) {\n\t\t\t\t\t\tgpuTextureView = sig.gpuBinding.textureView;\n\t\t\t\t\t\thasStaticSig = true;\n\t\t\t\t\t}\n\t\t\t\t\trawVal = sig.value;\n\t\t\t\t} else if (typeof rawVal === \"function\") rawVal = rawVal(frame, fps);\n\t\t\t}\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 50, 0, 100);\n\tconst radiusRes = resolveBindable(\"radius\", 1, .1, 2);\n\tconst softnessRes = resolveBindable(\"softness\", .5, 0, 1);\n\tconst roundnessRes = resolveBindable(\"roundness\", .5, 0, 1);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1);\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\targs.pass.end();\n\tconst { vignettePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getVignetteResources(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 : 0;\n\tconst getSignalView = (res, suffix) => {\n\t\tif (res.gpuTextureView) return res.gpuTextureView;\n\t\tif (res.hasStaticSig && res.sd) return signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, res.sd.nodeId ?? `${nodeId}_${suffix}`, elapsedSeconds, durationSeconds, res.sd, width, height, props.renderId, frame, fps);\n\t\treturn signalRegistry.getDummy1x1TextureView(ctx.device);\n\t};\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst softnessView = getSignalView(softnessRes, \"softness_sig\");\n\tconst roundnessView = getSignalView(roundnessRes, \"roundness_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\tvignetteUniformData[0] = strengthRes.val;\n\tvignetteUniformData[1] = radiusRes.val;\n\tvignetteUniformData[2] = softnessRes.val;\n\tvignetteUniformData[3] = roundnessRes.val;\n\tvignetteUniformData[4] = centerXRes.val;\n\tvignetteUniformData[5] = centerYRes.val;\n\tvignetteUniformData[6] = strengthRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[7] = radiusRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[8] = softnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[9] = roundnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[10] = centerXRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[11] = centerYRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vignetteUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst vignettePass = 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\tvignettePass.setPipeline(pipeline);\n\tvignettePass.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\tvignettePass.setBindGroup(1, ctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler));\n\tvignettePass.setBindGroup(2, 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: strengthView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: softnessView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: roundnessView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: centerXView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 5,\n\t\t\t\tresource: centerYView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 6,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t}));\n\tvignettePass.draw(4);\n\tvignettePass.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: VignetteWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BgSXYX3i.mjs.map"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { n as renderers_default, t as PatchHealWebGPURenderer } from "./renderer-OWQmmg4Z.mjs";
1
+ import { n as renderers_default, t as PatchHealWebGPURenderer } from "./renderer-WXylxlu2.mjs";
2
2
 
3
3
  export { PatchHealWebGPURenderer, renderers_default as default };
@@ -1,3 +1,3 @@
1
- import { n as renderers_default, t as RefractionCaustics3DWebGPURenderer } from "./renderer-B_NuVaIP.mjs";
1
+ import { n as renderers_default, t as RefractionCaustics3DWebGPURenderer } from "./renderer-Dcd-Pkzd.mjs";
2
2
 
3
3
  export { RefractionCaustics3DWebGPURenderer, renderers_default as default };
@@ -1,3 +1,3 @@
1
- import { n as renderers_default, t as ColorBalanceWebGPURenderer } from "./renderer-CDOUAN7X.mjs";
1
+ import { n as renderers_default, t as ColorBalanceWebGPURenderer } from "./renderer-CXUohIJ9.mjs";
2
2
 
3
3
  export { ColorBalanceWebGPURenderer, renderers_default as default };
@@ -1,8 +1,8 @@
1
1
  import { a as __toCommonJS, i as __require, o as __toESM, t as __commonJSMin } from "./chunk-GMkBE123.mjs";
2
2
  import { Bt as takeRenderDiagnostics, Ht as updateClockSignals, wt as getMediaType } from "./dist-Bx6J0VcM.mjs";
3
3
  import { r as registerWebGPURenderer, t as audioRegistry } from "./renderer-CtVkU_GA.mjs";
4
- import { B as inputStore, C as WebGPUAudioProcessor, F as ensureDevice, G as lutStore, L as getHeadlessFontPath, R as getRenderer2D, T as clearAllVideoCache, at as R2_CUSTOM_DOMAIN, d as NodeSurfaceProvider, et as shaderStore, it as GetFontAssetUrl, q as mediaDecoderCache, rt as textureCache, y as SlugFontCache, z as initHeadlessWebGPU } from "./dist-gjHmorxL.mjs";
5
- import { i as mixAudioTracks, r as drawCompositionTree, t as compositionStateStore, y as preloadFont } from "./dist-1iUYuPct.mjs";
4
+ import { B as inputStore, C as WebGPUAudioProcessor, F as ensureDevice, G as lutStore, R as getRenderer2D, T as clearAllVideoCache, d as NodeSurfaceProvider, et as shaderStore, q as mediaDecoderCache, rt as textureCache, y as SlugFontCache, z as initHeadlessWebGPU } from "./dist-DgIKXWZ1.mjs";
5
+ import { i as mixAudioTracks, r as drawCompositionTree, t as compositionStateStore, y as preloadCompositionFonts } from "./dist-55MP0aN4.mjs";
6
6
  import { t as require_dist_cjs$20 } from "./dist-cjs-BUwe2XhR.mjs";
7
7
  import { D as require_dist_cjs$21, O as dist_es_exports$1, _ as require_dist_cjs$33, a as require_dist_cjs$26, b as init_protocols, c as require_dist_cjs$37, d as require_dist_cjs$32, f as require_dist_cjs$23, g as require_dist_cjs$34, h as require_dist_cjs$35, i as require_dist_cjs$28, k as init_dist_es$1, l as require_dist_cjs$27, m as require_dist_cjs$22, n as require_dist_cjs$31, o as require_dist_cjs$29, p as require_dist_cjs$24, r as require_dist_cjs$30, s as require_dist_cjs$25, t as require_dist_cjs$38, u as require_dist_cjs$36, v as dist_es_exports, x as protocols_exports, y as init_dist_es } from "./dist-cjs-BKmGCgtm.mjs";
8
8
  import { F as require_dist_cjs$42, I as require_dist_cjs$44, P as require_dist_cjs$39, R as require_dist_cjs$43, T as schema_exports, t as require_dist_cjs$41, v as init_tslib_es6, w as init_schema, y as tslib_es6_exports, z as require_dist_cjs$40 } from "./dist-cjs-DsMdld8l.mjs";
@@ -26,7 +26,7 @@ import * as webcodecs from "@napi-rs/webcodecs";
26
26
  import { VideoFrame } from "@napi-rs/webcodecs";
27
27
  import { fileURLToPath, pathToFileURL } from "node:url";
28
28
  import { registerMediabunnyServer } from "@mediabunny/server";
29
- import { execSync, spawn } from "node:child_process";
29
+ import { exec, spawn } from "node:child_process";
30
30
  import sharp from "sharp";
31
31
 
32
32
  //#region ../../node_modules/.pnpm/@inversifyjs+common@1.5.2/node_modules/@inversifyjs/common/lib/esm/index.js
@@ -21593,7 +21593,7 @@ const envSchema = z$1.object({
21593
21593
  * App version read from the monorepo root package.json.
21594
21594
  * Used for version-aware render fingerprinting.
21595
21595
  */
21596
- const APP_VERSION = "2.0.2";
21596
+ const APP_VERSION = "2.0.5";
21597
21597
  let loggerContext = {
21598
21598
  getStore: () => void 0,
21599
21599
  run: (_store, callback, ...args) => callback(...args)
@@ -21749,52 +21749,16 @@ S3StorageService = __decorate([
21749
21749
  ], S3StorageService);
21750
21750
 
21751
21751
  //#endregion
21752
- //#region ../renderer/dist/bootstrap-mediabunny-DmJWs7fU.mjs
21752
+ //#region ../renderer/dist/bootstrap-mediabunny-DIMlnLDP.mjs
21753
21753
  /**
21754
- * Recursively scans and preloads only the required font assets inside a VirtualMediaData tree.
21755
- * This ensures typography renders correctly on Node.js without pre-loading or memory bloating from large media assets.
21754
+ * Preloads only the fonts (and emoji) a VirtualMediaData tree's text uses, so
21755
+ * typography renders correctly on Node.js without loading its media. Shared
21756
+ * with the browser preview; emoji need a font set with
21757
+ * `FontManager.registerEmojiFont()`.
21756
21758
  */
21757
21759
  async function preloadFonts(media, device = null) {
21758
21760
  if (!media) return;
21759
- const promises = [];
21760
- const op = media.operation;
21761
- if (R2_CUSTOM_DOMAIN) SlugFontCache.emojiFontUrl = `https://${R2_CUSTOM_DOMAIN}/static/NotoColorEmoji.ttf`;
21762
- if (!SlugFontCache.emojiFontPath) try {
21763
- const isDev = import.meta.url.endsWith(".ts");
21764
- const emojiLocalUrl = new URL(isDev ? "./assets/NotoColorEmoji.ttf" : "../src/assets/NotoColorEmoji.ttf", import.meta.url).href;
21765
- let fontPath = emojiLocalUrl;
21766
- if (emojiLocalUrl.startsWith("file://")) try {
21767
- fontPath = new URL(emojiLocalUrl).pathname;
21768
- } catch {
21769
- fontPath = emojiLocalUrl.replace(/^file:\/\//, "");
21770
- }
21771
- SlugFontCache.emojiFontPath = fontPath;
21772
- } catch {}
21773
- if (op) {
21774
- const opText = op;
21775
- const isTextNode = opText.op === "text" || opText.kind === "text" || opText.op === "caption" || opText.kind === "caption" || typeof opText.text === "string";
21776
- const fontFamily = opText.fontFamily || (isTextNode ? "Inter" : void 0);
21777
- if (fontFamily) {
21778
- const fontUrl = getHeadlessFontPath(fontFamily) ?? GetFontAssetUrl(fontFamily);
21779
- promises.push(preloadFont(fontFamily, fontUrl).catch((err) => {
21780
- rendererLogger.error(err, `[HeadlessMediaRenderer] Failed to preload font "${fontFamily}" from ${fontUrl}`);
21781
- }));
21782
- if (device) promises.push(SlugFontCache.preloadSlugFont(device, fontFamily, fontUrl).catch((err) => {
21783
- rendererLogger.error(err, `[HeadlessMediaRenderer] Failed to preload Slug font "${fontFamily}" from ${fontUrl}`);
21784
- }));
21785
- }
21786
- if (opText.op === "text" && opText.text && device) {
21787
- const matches = opText.text.match(/\p{Extended_Pictographic}/gu);
21788
- if (matches) {
21789
- const fontSize = opText.fontSize ?? 48;
21790
- for (const char of matches) promises.push(SlugFontCache.preloadEmoji(device, char, fontSize).catch((err) => {
21791
- rendererLogger.error(err, `[HeadlessMediaRenderer] Failed to preload emoji texture for "${char}"`);
21792
- }));
21793
- }
21794
- }
21795
- }
21796
- if (media.children && media.children.length > 0) for (const child of media.children) promises.push(preloadFonts(child, device));
21797
- await Promise.all(promises);
21761
+ await preloadCompositionFonts(media, device, (err, what) => rendererLogger.error(err, `[HeadlessMediaRenderer] Failed to preload ${what}`));
21798
21762
  }
21799
21763
  /**
21800
21764
  * Pipelined Asynchronous DMA Staging Ring for WebGPU.
@@ -22004,52 +21968,52 @@ const BUILTIN_NODE_RENDERERS = [
22004
21968
  {
22005
21969
  packageName: "@framefields/node-lut",
22006
21970
  ops: ["ApplyLUT"],
22007
- load: () => import("./renderer-CYY-poLe.mjs")
21971
+ load: () => import("./renderer-DxOQ5S8T.mjs")
22008
21972
  },
22009
21973
  {
22010
21974
  packageName: "@framefields/node-audio-compressor",
22011
21975
  ops: ["AudioCompressor"],
22012
- load: () => import("./renderer-UQFCgeNx.mjs")
21976
+ load: () => import("./renderer-CGVuhBbA.mjs")
22013
21977
  },
22014
21978
  {
22015
21979
  packageName: "@framefields/node-audio-delay",
22016
21980
  ops: ["AudioDelay"],
22017
- load: () => import("./renderer-DQLGnEFc.mjs")
21981
+ load: () => import("./renderer-C4O-L73n.mjs")
22018
21982
  },
22019
21983
  {
22020
21984
  packageName: "@framefields/node-audio-fade",
22021
21985
  ops: ["AudioFade"],
22022
- load: () => import("./renderer-D4qLmox-.mjs")
21986
+ load: () => import("./renderer-lXmyzdcx.mjs")
22023
21987
  },
22024
21988
  {
22025
21989
  packageName: "@framefields/node-audio-noise-gate",
22026
21990
  ops: ["AudioNoiseGate"],
22027
- load: () => import("./renderer-Q_uUQipO.mjs")
21991
+ load: () => import("./renderer-Ibvw1tE_.mjs")
22028
21992
  },
22029
21993
  {
22030
21994
  packageName: "@framefields/node-audio-parametric-eq",
22031
21995
  ops: ["AudioParametricEq"],
22032
- load: () => import("./renderer-CV2m6k1V.mjs")
21996
+ load: () => import("./renderer-DZ7t_l1d.mjs")
22033
21997
  },
22034
21998
  {
22035
21999
  packageName: "@framefields/node-audio-reverb",
22036
22000
  ops: ["AudioReverb"],
22037
- load: () => import("./renderer-9dHlMQGX.mjs")
22001
+ load: () => import("./renderer--fkO4O8d.mjs")
22038
22002
  },
22039
22003
  {
22040
22004
  packageName: "@framefields/node-audio-signal-extractor",
22041
22005
  ops: ["AudioSignalExtractor"],
22042
- load: () => import("./renderer-DoAY5JbB.mjs")
22006
+ load: () => import("./renderer-M0jeFo6S.mjs")
22043
22007
  },
22044
22008
  {
22045
22009
  packageName: "@framefields/node-blur",
22046
22010
  ops: ["Blur"],
22047
- load: () => import("./renderer-DvfUbZ31.mjs")
22011
+ load: () => import("./renderer-BFOkGS0N.mjs")
22048
22012
  },
22049
22013
  {
22050
22014
  packageName: "@framefields/node-camera-parallax-3d",
22051
22015
  ops: ["CameraParallax3D"],
22052
- load: () => import("./renderer-Cj-whdVr.mjs")
22016
+ load: () => import("./renderer-BUHMkkLU.mjs")
22053
22017
  },
22054
22018
  {
22055
22019
  packageName: "@framefields/node-canvas-generator",
@@ -22069,17 +22033,17 @@ const BUILTIN_NODE_RENDERERS = [
22069
22033
  {
22070
22034
  packageName: "@framefields/node-color-balance",
22071
22035
  ops: ["ColorBalance"],
22072
- load: () => import("./renderer-CszOjcRW.mjs")
22036
+ load: () => import("./renderer-Cx5H41JR.mjs")
22073
22037
  },
22074
22038
  {
22075
22039
  packageName: "@framefields/node-colorkey",
22076
22040
  ops: ["ColorKey"],
22077
- load: () => import("./renderer-BZJm3m4f.mjs")
22041
+ load: () => import("./renderer-ospMsCzr.mjs")
22078
22042
  },
22079
22043
  {
22080
22044
  packageName: "@framefields/node-compositor",
22081
22045
  ops: ["Compositor"],
22082
- load: () => import("./renderer-COkcU3db.mjs")
22046
+ load: () => import("./renderer-5OiVjQan.mjs")
22083
22047
  },
22084
22048
  {
22085
22049
  packageName: "@framefields/node-corner-pin",
@@ -22104,7 +22068,7 @@ const BUILTIN_NODE_RENDERERS = [
22104
22068
  {
22105
22069
  packageName: "@framefields/node-displacement-map",
22106
22070
  ops: ["DisplacementMap"],
22107
- load: () => import("./renderer-pHiz78e0.mjs")
22071
+ load: () => import("./renderer-bbOALT4F.mjs")
22108
22072
  },
22109
22073
  {
22110
22074
  packageName: "@framefields/node-extract-frame",
@@ -22114,12 +22078,12 @@ const BUILTIN_NODE_RENDERERS = [
22114
22078
  {
22115
22079
  packageName: "@framefields/node-extract-lut",
22116
22080
  ops: ["ExtractLUT"],
22117
- load: () => import("./renderer-HFfcJlmR.mjs")
22081
+ load: () => import("./renderer-C3L9SNRO.mjs")
22118
22082
  },
22119
22083
  {
22120
22084
  packageName: "@framefields/node-film-grain",
22121
22085
  ops: ["FilmGrain"],
22122
- load: () => import("./renderer-CmApuKjS.mjs")
22086
+ load: () => import("./renderer-OrhgkzVu.mjs")
22123
22087
  },
22124
22088
  {
22125
22089
  packageName: "@framefields/node-flip",
@@ -22129,17 +22093,17 @@ const BUILTIN_NODE_RENDERERS = [
22129
22093
  {
22130
22094
  packageName: "@framefields/node-gradient-map",
22131
22095
  ops: ["GradientMap"],
22132
- load: () => import("./renderer-CB7lH5K8.mjs")
22096
+ load: () => import("./renderer-C9BKcHZb.mjs")
22133
22097
  },
22134
22098
  {
22135
22099
  packageName: "@framefields/node-halftone-screen",
22136
22100
  ops: ["HalftoneScreen"],
22137
- load: () => import("./renderer-BU1rwNRT.mjs")
22101
+ load: () => import("./renderer-BaoJiMJO.mjs")
22138
22102
  },
22139
22103
  {
22140
22104
  packageName: "@framefields/node-high-pass",
22141
22105
  ops: ["HighPass"],
22142
- load: () => import("./renderer-BqyAgNt3.mjs")
22106
+ load: () => import("./renderer-CiLiH6w_.mjs")
22143
22107
  },
22144
22108
  {
22145
22109
  packageName: "@framefields/node-kenburns",
@@ -22154,7 +22118,7 @@ const BUILTIN_NODE_RENDERERS = [
22154
22118
  {
22155
22119
  packageName: "@framefields/node-levels",
22156
22120
  ops: ["Levels"],
22157
- load: () => import("./renderer-C_Ki91kc.mjs")
22121
+ load: () => import("./renderer-CL9gPcfZ.mjs")
22158
22122
  },
22159
22123
  {
22160
22124
  packageName: "@framefields/node-liquify",
@@ -22164,7 +22128,7 @@ const BUILTIN_NODE_RENDERERS = [
22164
22128
  {
22165
22129
  packageName: "@framefields/node-mask-math",
22166
22130
  ops: ["MaskMath"],
22167
- load: () => import("./renderer-DY2SVYUW.mjs")
22131
+ load: () => import("./renderer-NhSzqWsQ.mjs")
22168
22132
  },
22169
22133
  {
22170
22134
  packageName: "@framefields/node-mesh-warp",
@@ -22174,37 +22138,37 @@ const BUILTIN_NODE_RENDERERS = [
22174
22138
  {
22175
22139
  packageName: "@framefields/node-modulate",
22176
22140
  ops: ["Modulate"],
22177
- load: () => import("./renderer-eMsnzJg9.mjs")
22141
+ load: () => import("./renderer-B0RDWv1C.mjs")
22178
22142
  },
22179
22143
  {
22180
22144
  packageName: "@framefields/node-noise-generator",
22181
22145
  ops: ["NoiseGenerator"],
22182
- load: () => import("./renderer-B9-QSJcG.mjs")
22146
+ load: () => import("./renderer-eC1gRPRo.mjs")
22183
22147
  },
22184
22148
  {
22185
22149
  packageName: "@framefields/node-paint",
22186
22150
  ops: ["Paint"],
22187
- load: () => import("./renderer-BSbTJBWc.mjs")
22151
+ load: () => import("./renderer-CHKB-Or4.mjs")
22188
22152
  },
22189
22153
  {
22190
22154
  packageName: "@framefields/node-patch-heal",
22191
22155
  ops: ["PatchHeal"],
22192
- load: () => import("./renderer-BAQmR0Zo.mjs")
22156
+ load: () => import("./renderer-CsQ7nY0z.mjs")
22193
22157
  },
22194
22158
  {
22195
22159
  packageName: "@framefields/node-refine-edge",
22196
22160
  ops: ["RefineEdge"],
22197
- load: () => import("./renderer-DuplLRbp.mjs")
22161
+ load: () => import("./renderer-DMaYsSM4.mjs")
22198
22162
  },
22199
22163
  {
22200
22164
  packageName: "@framefields/node-refraction-caustics",
22201
22165
  ops: ["RefractionCaustics3D"],
22202
- load: () => import("./renderer-CclIvsLO.mjs")
22166
+ load: () => import("./renderer-CwAjqb2o.mjs")
22203
22167
  },
22204
22168
  {
22205
22169
  packageName: "@framefields/node-relight-3d",
22206
22170
  ops: ["Relight3D"],
22207
- load: () => import("./renderer-D6cJ6MSq.mjs")
22171
+ load: () => import("./renderer-CSkFF-qe.mjs")
22208
22172
  },
22209
22173
  {
22210
22174
  packageName: "@framefields/node-resizer-scaler",
@@ -22219,12 +22183,12 @@ const BUILTIN_NODE_RENDERERS = [
22219
22183
  {
22220
22184
  packageName: "@framefields/node-shadows-highlights",
22221
22185
  ops: ["ShadowsHighlights"],
22222
- load: () => import("./renderer-BLikd6BK.mjs")
22186
+ load: () => import("./renderer-DkJEnKQu.mjs")
22223
22187
  },
22224
22188
  {
22225
22189
  packageName: "@framefields/node-shape-generator",
22226
22190
  ops: ["ShapeGenerator"],
22227
- load: () => import("./renderer-D7EX8IjU.mjs")
22191
+ load: () => import("./renderer-0gJC-sc8.mjs")
22228
22192
  },
22229
22193
  {
22230
22194
  packageName: "@framefields/node-signal-gate",
@@ -22234,27 +22198,27 @@ const BUILTIN_NODE_RENDERERS = [
22234
22198
  {
22235
22199
  packageName: "@framefields/node-stereo-panning",
22236
22200
  ops: ["StereoPanning"],
22237
- load: () => import("./renderer-Cu074POw.mjs")
22201
+ load: () => import("./renderer-DlkrKqQj.mjs")
22238
22202
  },
22239
22203
  {
22240
22204
  packageName: "@framefields/node-tile-offset",
22241
22205
  ops: ["TileOffset"],
22242
- load: () => import("./renderer-BryTM2g7.mjs")
22206
+ load: () => import("./renderer-6x7CgHhJ.mjs")
22243
22207
  },
22244
22208
  {
22245
22209
  packageName: "@framefields/node-unsharp-mask",
22246
22210
  ops: ["UnsharpMask"],
22247
- load: () => import("./renderer-3BNskNuJ.mjs")
22211
+ load: () => import("./renderer-CU2c6zWc.mjs")
22248
22212
  },
22249
22213
  {
22250
22214
  packageName: "@framefields/node-vignette",
22251
22215
  ops: ["Vignette"],
22252
- load: () => import("./renderer-BGvORwkQ.mjs")
22216
+ load: () => import("./renderer-WrFAaLxW.mjs")
22253
22217
  },
22254
22218
  {
22255
22219
  packageName: "@framefields/node-vision",
22256
22220
  ops: ["Vision"],
22257
- load: () => import("./renderer-CQCoggIa.mjs")
22221
+ load: () => import("./renderer-xc9wkiC7.mjs")
22258
22222
  }
22259
22223
  ];
22260
22224
  /**
@@ -22453,7 +22417,7 @@ const bootstrapMediabunny = () => {
22453
22417
  };
22454
22418
 
22455
22419
  //#endregion
22456
- //#region ../renderer/dist/headless-webgpu-renderer-5ajPGQL3.mjs
22420
+ //#region ../renderer/dist/headless-webgpu-renderer-BSmCX3bP.mjs
22457
22421
  const DEFAULTS = {
22458
22422
  blackPixelThreshold: .1,
22459
22423
  blackFrameRatio: .98,
@@ -23090,6 +23054,72 @@ function resolveQuality(quality) {
23090
23054
  default: return QUALITY_VERY_HIGH;
23091
23055
  }
23092
23056
  }
23057
+ let cachedVramUsage = "N/A";
23058
+ let vramProbeInFlight = false;
23059
+ function refreshVramUsage() {
23060
+ if (vramProbeInFlight) return;
23061
+ vramProbeInFlight = true;
23062
+ exec("nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits", {
23063
+ encoding: "utf-8",
23064
+ timeout: 2e3
23065
+ }, (err, stdout) => {
23066
+ vramProbeInFlight = false;
23067
+ if (err || !stdout) return;
23068
+ const [used, total] = stdout.trim().split(",").map((s) => s.trim());
23069
+ if (used && total) cachedVramUsage = `${used}MB / ${total}MB`;
23070
+ });
23071
+ }
23072
+ function getVramUsage() {
23073
+ return cachedVramUsage;
23074
+ }
23075
+ const DEFAULT_RING_CAPACITY = 2;
23076
+ const MIN_RING_CAPACITY = 2;
23077
+ const MAX_RING_CAPACITY = 8;
23078
+ function resolveRingCapacity(explicit) {
23079
+ const fromEnv = Number(process.env.FRAMEFIELDS_RING_CAPACITY);
23080
+ const requested = explicit ?? (Number.isFinite(fromEnv) && fromEnv > 0 ? fromEnv : NaN);
23081
+ if (!Number.isFinite(requested) || requested <= 0) return DEFAULT_RING_CAPACITY;
23082
+ return Math.max(MIN_RING_CAPACITY, Math.min(MAX_RING_CAPACITY, Math.floor(requested)));
23083
+ }
23084
+ var NodeSurfacePool = class {
23085
+ idle = [];
23086
+ maxIdle = 2;
23087
+ acquire(device, width, height) {
23088
+ const index = this.idle.findIndex((entry) => entry.device === device && entry.surface.width === width && entry.surface.height === height);
23089
+ if (index >= 0) {
23090
+ const [entry] = this.idle.splice(index, 1);
23091
+ if (entry) return entry.surface;
23092
+ }
23093
+ for (let i$1 = this.idle.length - 1; i$1 >= 0; i$1--) {
23094
+ const entry = this.idle[i$1];
23095
+ if (entry && entry.device !== device) {
23096
+ this.idle.splice(i$1, 1);
23097
+ try {
23098
+ entry.surface.destroy();
23099
+ } catch {}
23100
+ }
23101
+ }
23102
+ return new NodeSurfaceProvider(device, width, height);
23103
+ }
23104
+ release(device, surface) {
23105
+ if (this.idle.length >= this.maxIdle) {
23106
+ try {
23107
+ surface.destroy();
23108
+ } catch {}
23109
+ return;
23110
+ }
23111
+ this.idle.push({
23112
+ device,
23113
+ surface
23114
+ });
23115
+ }
23116
+ destroy() {
23117
+ for (const entry of this.idle.splice(0)) try {
23118
+ entry.surface.destroy();
23119
+ } catch {}
23120
+ }
23121
+ };
23122
+ const nodeSurfacePool = new NodeSurfacePool();
23093
23123
  function formatLutAsCube(lut) {
23094
23124
  const lines = [
23095
23125
  "# Created by Gatewai",
@@ -23152,7 +23182,7 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23152
23182
  const device = await ensureDevice();
23153
23183
  try {
23154
23184
  await preloadFonts(virtualMedia, device);
23155
- surface = new NodeSurfaceProvider(device, width, height);
23185
+ surface = nodeSurfacePool.acquire(device, width, height);
23156
23186
  renderer = getRenderer2D(device, surface.colorFormat);
23157
23187
  const ctx = {
23158
23188
  device,
@@ -23219,9 +23249,7 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23219
23249
  try {
23220
23250
  shaderStore.clear(renderId);
23221
23251
  } catch {}
23222
- try {
23223
- surface?.destroy();
23224
- } catch {}
23252
+ if (surface) nodeSurfacePool.release(device, surface);
23225
23253
  try {
23226
23254
  textureCache.destroy();
23227
23255
  } catch {}
@@ -23456,22 +23484,9 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23456
23484
  const heapTotalMb = Math.round(mem.heapTotal / 1024 / 1024);
23457
23485
  return `Process: ${Math.round(mem.rss / 1024 / 1024)}MB RSS (${heapUsedMb}MB/${heapTotalMb}MB Heap), System: ${Math.round(usedMem / 1024 / 1024)}MB/${Math.round(totalMem / 1024 / 1024)}MB`;
23458
23486
  };
23459
- const getVramUsage = () => {
23460
- try {
23461
- const [used, total] = execSync("nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits", {
23462
- encoding: "utf-8",
23463
- stdio: [
23464
- "ignore",
23465
- "pipe",
23466
- "ignore"
23467
- ]
23468
- }).trim().split(",").map((s) => s.trim());
23469
- if (used && total) return `${used}MB / ${total}MB`;
23470
- } catch {}
23471
- return "N/A";
23472
- };
23473
23487
  let statsInterval;
23474
23488
  if (process.env.NODE_ENV === "production") statsInterval = setInterval(() => {
23489
+ refreshVramUsage();
23475
23490
  rendererLogger.info({
23476
23491
  renderId,
23477
23492
  cpu: getCpuUsage(),
@@ -23522,7 +23537,7 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23522
23537
  height,
23523
23538
  fps,
23524
23539
  videoSource,
23525
- ringCapacity: 2,
23540
+ ringCapacity: resolveRingCapacity(options?.ringCapacity),
23526
23541
  onFrame: inspector ? (rgba) => inspector.inspect(rgba, width, height) : void 0
23527
23542
  });
23528
23543
  const ctx = surface && renderer ? {
@@ -23530,7 +23545,8 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23530
23545
  renderer,
23531
23546
  surface
23532
23547
  } : null;
23533
- if (ctx && renderer) {
23548
+ const prePass = async (frame) => {
23549
+ if (!ctx || !renderer) return;
23534
23550
  const preEncoder = device.createCommandEncoder();
23535
23551
  const dummyTex = renderer.getTemporaryTexture(width, height);
23536
23552
  const dummyView = dummyTex.createView();
@@ -23541,7 +23557,7 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23541
23557
  a: 0
23542
23558
  }, width, height, "clear").end();
23543
23559
  await drawCompositionTree(ctx, preEncoder, dummyView, dummyTex, width, height, virtualMedia, {
23544
- frame: 0,
23560
+ frame,
23545
23561
  fps,
23546
23562
  isHeadless: true,
23547
23563
  renderId,
@@ -23552,7 +23568,8 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23552
23568
  });
23553
23569
  device.queue.submit([preEncoder.finish()]);
23554
23570
  await lutStore.awaitAllPending(device);
23555
- }
23571
+ };
23572
+ await prePass(0);
23556
23573
  for (let i$1 = 0; i$1 < totalFrames; i$1++) {
23557
23574
  if (i$1 % 10 === 0) rendererLogger.info({
23558
23575
  renderId,
@@ -23560,6 +23577,10 @@ var HeadlessWebGPURenderer = class HeadlessWebGPURenderer$1 {
23560
23577
  totalFrames
23561
23578
  }, `[HeadlessWebGPURenderer] Rendering frame ${i$1}/${totalFrames}`);
23562
23579
  if (ctx && surface && renderer && pipeline) {
23580
+ if (i$1 > 0 && (lutStore.hasPending(device) || SlugFontCache.hasPending())) {
23581
+ updateClockSignals(i$1, fps, durationMs);
23582
+ await prePass(i$1);
23583
+ }
23563
23584
  compositionStateStore.setState(renderId, i$1, fps, true);
23564
23585
  updateClockSignals(i$1, fps, durationMs);
23565
23586
  const encoder = device.createCommandEncoder();
@@ -23865,4 +23886,4 @@ async function renderFrameGrid(target, options = {}) {
23865
23886
 
23866
23887
  //#endregion
23867
23888
  export { HeadlessWebGPURenderer as a, HeadlessMediaRenderer as i, renderFrameGrid as n, formatQaReport as o, resolveSamplePoints as r, renderSemaphore as s, computeGridLayout as t };
23868
- //# sourceMappingURL=renderer-Fco4EmAu.mjs.map
23889
+ //# sourceMappingURL=renderer-D1Zs78PQ.mjs.map