framefields 2.2.0 → 2.3.1

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 (322) hide show
  1. package/README.md +11 -2
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BvYmTu5T.d.mts → audio-BNnEclHU.d.mts} +3 -3
  5. package/dist/{audio-BvYmTu5T.d.mts.map → audio-BNnEclHU.d.mts.map} +1 -1
  6. package/dist/{audio-DMUr01vS.mjs → audio-CS104aUj.mjs} +3 -3
  7. package/dist/{audio-DMUr01vS.mjs.map → audio-CS104aUj.mjs.map} +1 -1
  8. package/dist/{dist-CT___nEU.mjs → dist-BOdxAhOT.mjs} +7 -5
  9. package/dist/dist-BOdxAhOT.mjs.map +1 -0
  10. package/dist/{dist-cjxDXQdx.mjs → dist-jU289ehm.mjs} +209 -31
  11. package/dist/{dist-cjxDXQdx.mjs.map → dist-jU289ehm.mjs.map} +1 -1
  12. package/dist/effects/index.d.mts +5 -5
  13. package/dist/effects/index.mjs +36 -36
  14. package/dist/{effects-C06-AOge.mjs → effects-BzOlVD-w.mjs} +532 -4
  15. package/dist/effects-BzOlVD-w.mjs.map +1 -0
  16. package/dist/fonts/index.d.mts +1 -1
  17. package/dist/fonts/index.mjs +2 -2
  18. package/dist/{fonts-C0UuLQvr.mjs → fonts-BhlV_3Qt.mjs} +2 -2
  19. package/dist/{fonts-C0UuLQvr.mjs.map → fonts-BhlV_3Qt.mjs.map} +1 -1
  20. package/dist/{gpu-Du7GpVFW.mjs → gpu-BA1Wz_mS.mjs} +2 -2
  21. package/dist/{gpu-Du7GpVFW.mjs.map → gpu-BA1Wz_mS.mjs.map} +1 -1
  22. package/dist/{index-B-oUlLoO.d.mts → index-AdrZIWT0.d.mts} +27 -2
  23. package/dist/index-AdrZIWT0.d.mts.map +1 -0
  24. package/dist/{index-BcA8rep0.d.mts → index-B-55dXDu.d.mts} +1 -1
  25. package/dist/{index-BcA8rep0.d.mts.map → index-B-55dXDu.d.mts.map} +1 -1
  26. package/dist/{index-D-Iek5sq.d.mts → index-B3BwLHa6.d.mts} +3 -3
  27. package/dist/{index-D-Iek5sq.d.mts.map → index-B3BwLHa6.d.mts.map} +1 -1
  28. package/dist/{index-CwbszPDG.d.mts → index-BU51pxZO.d.mts} +956 -9
  29. package/dist/index-BU51pxZO.d.mts.map +1 -0
  30. package/dist/{index-XdQPNJnq.d.mts → index-CeRv1KC0.d.mts} +3 -3
  31. package/dist/{index-XdQPNJnq.d.mts.map → index-CeRv1KC0.d.mts.map} +1 -1
  32. package/dist/{index-DXfp_T-3.d.mts → index-Cg2ptXcs.d.mts} +2 -2
  33. package/dist/{index-DXfp_T-3.d.mts.map → index-Cg2ptXcs.d.mts.map} +1 -1
  34. package/dist/{index-CdyE1tst.d.mts → index-QmkcUL3W.d.mts} +2 -2
  35. package/dist/{index-CdyE1tst.d.mts.map → index-QmkcUL3W.d.mts.map} +1 -1
  36. package/dist/index.d.mts +1383 -11
  37. package/dist/index.d.mts.map +1 -1
  38. package/dist/index.mjs +3122 -83
  39. package/dist/index.mjs.map +1 -1
  40. package/dist/preview/index.d.mts +2 -2
  41. package/dist/preview/index.mjs +10 -10
  42. package/dist/{preview-M0TsUzC6.mjs → preview-BVyG76gO.mjs} +2 -2
  43. package/dist/{preview-M0TsUzC6.mjs.map → preview-BVyG76gO.mjs.map} +1 -1
  44. package/dist/preview-engine/audio.mjs +1 -1
  45. package/dist/preview-engine/chunk-2JKXYG6J.mjs +127 -0
  46. package/dist/preview-engine/chunk-7I7PKKDL.mjs +214 -0
  47. package/dist/preview-engine/chunk-BQY4BUMN.mjs +1 -0
  48. package/dist/preview-engine/{chunk-RSMO7NPN.mjs → chunk-BSOJR4JU.mjs} +1 -1
  49. package/dist/preview-engine/chunk-BVA5NGSH.mjs +1 -0
  50. package/dist/preview-engine/{chunk-ZTHWCQ2A.mjs → chunk-FNE22WGA.mjs} +1 -1
  51. package/dist/preview-engine/chunk-GCTVRM7J.mjs +1522 -0
  52. package/dist/preview-engine/chunk-KERW7QJ4.mjs +174 -0
  53. package/dist/preview-engine/{chunk-7B5S5D4N.mjs → chunk-TPAEN6VV.mjs} +1 -1
  54. package/dist/preview-engine/chunk-YQRKT47I.mjs +1 -0
  55. package/dist/preview-engine/crypto-W5UAWSNT.mjs +1 -0
  56. package/dist/preview-engine/effects.mjs +1 -1
  57. package/dist/preview-engine/framefields.mjs +26 -26
  58. package/dist/preview-engine/player.mjs +5 -5
  59. package/dist/preview-engine/rapier-AHBIGHEL.mjs +1 -0
  60. package/dist/preview-engine/rapier-JD7KNQRV.mjs +1 -0
  61. package/dist/preview-engine/renderers-3F5AIDEL.mjs +228 -0
  62. package/dist/preview-engine/renderers-6ODPWZ2R.mjs +96 -0
  63. package/dist/preview-engine/renderers-7NCG6BYS.mjs +94 -0
  64. package/dist/preview-engine/renderers-BGGRPAVV.mjs +363 -0
  65. package/dist/preview-engine/renderers-DN2GF3I7.mjs +82 -0
  66. package/dist/preview-engine/renderers-FGHOLJJK.mjs +44 -0
  67. package/dist/preview-engine/renderers-FK72LKQC.mjs +275 -0
  68. package/dist/preview-engine/renderers-FQWWAETX.mjs +203 -0
  69. package/dist/preview-engine/renderers-HMR2NAD7.mjs +81 -0
  70. package/dist/preview-engine/renderers-HUW2ZMS3.mjs +1 -0
  71. package/dist/preview-engine/renderers-JLFGBYN4.mjs +78 -0
  72. package/dist/preview-engine/renderers-LLUEOW5T.mjs +77 -0
  73. package/dist/preview-engine/renderers-NC64EQDE.mjs +1 -0
  74. package/dist/preview-engine/renderers-PVYP2ONH.mjs +76 -0
  75. package/dist/preview-engine/renderers-TPBPNXWH.mjs +26 -0
  76. package/dist/preview-engine/renderers-UJ4YVJZT.mjs +80 -0
  77. package/dist/preview-engine/renderers-WHBDHTRI.mjs +78 -0
  78. package/dist/preview-engine/renderers-WP67KK5K.mjs +89 -0
  79. package/dist/preview-engine/renderers-YNFKFM7D.mjs +67 -0
  80. package/dist/preview-engine/renderers-ZSENYGIY.mjs +84 -0
  81. package/dist/preview-engine/signals.mjs +1 -1
  82. package/dist/{program-DzknMiY0.mjs → program-CCSfHMfh.mjs} +346 -13
  83. package/dist/program-CCSfHMfh.mjs.map +1 -0
  84. package/dist/renderer/index.d.mts +2 -2
  85. package/dist/renderer/index.mjs +2 -2
  86. package/dist/renderer-1Kv7oA86.mjs +5 -0
  87. package/dist/{renderer-1vhaKMeg.mjs → renderer-1uLtqb74.mjs} +141 -56
  88. package/dist/renderer-1uLtqb74.mjs.map +1 -0
  89. package/dist/{renderer-BerD3T-X.mjs → renderer-4VpA7LfU.mjs} +2 -2
  90. package/dist/{renderer-BerD3T-X.mjs.map → renderer-4VpA7LfU.mjs.map} +1 -1
  91. package/dist/{renderer-BNqwn0gZ.mjs → renderer-8BM6sJUR.mjs} +2 -2
  92. package/dist/{renderer-BNqwn0gZ.mjs.map → renderer-8BM6sJUR.mjs.map} +1 -1
  93. package/dist/renderer-AVHJ33nv.mjs +5 -0
  94. package/dist/{renderer-0gY4IQhM.mjs → renderer-AtLlZMQ9.mjs} +2 -2
  95. package/dist/{renderer-0gY4IQhM.mjs.map → renderer-AtLlZMQ9.mjs.map} +1 -1
  96. package/dist/renderer-B8dJGf8R.mjs +6 -0
  97. package/dist/{renderer-57ATc_mQ.mjs → renderer-B93zd3sx.mjs} +2 -2
  98. package/dist/{renderer-57ATc_mQ.mjs.map → renderer-B93zd3sx.mjs.map} +1 -1
  99. package/dist/renderer-BARst3ZD.mjs +3 -0
  100. package/dist/{renderer-CJB9nU1x.mjs → renderer-BD7Lmb8h.mjs} +3 -3
  101. package/dist/{renderer-CJB9nU1x.mjs.map → renderer-BD7Lmb8h.mjs.map} +1 -1
  102. package/dist/renderer-BEA6nknY.mjs +5 -0
  103. package/dist/renderer-BFRI5alp.mjs +222 -0
  104. package/dist/renderer-BFRI5alp.mjs.map +1 -0
  105. package/dist/{renderer-BiwIh_w4.mjs → renderer-BG5sbTXt.mjs} +3 -3
  106. package/dist/{renderer-BiwIh_w4.mjs.map → renderer-BG5sbTXt.mjs.map} +1 -1
  107. package/dist/{renderer-DtgMsjyL.mjs → renderer-BI4OMlEx.mjs} +2 -2
  108. package/dist/{renderer-DtgMsjyL.mjs.map → renderer-BI4OMlEx.mjs.map} +1 -1
  109. package/dist/renderer-BOfi06L2.mjs +5 -0
  110. package/dist/renderer-BOhvtAGL.mjs +5 -0
  111. package/dist/renderer-BQT3GI9g.mjs +5 -0
  112. package/dist/{renderer-DJfFc-XW.mjs → renderer-BRwp1kV-.mjs} +3 -3
  113. package/dist/{renderer-DJfFc-XW.mjs.map → renderer-BRwp1kV-.mjs.map} +1 -1
  114. package/dist/{renderer-u8ynJtAC.mjs → renderer-BVUTOGHs.mjs} +2 -2
  115. package/dist/{renderer-u8ynJtAC.mjs.map → renderer-BVUTOGHs.mjs.map} +1 -1
  116. package/dist/renderer-BXmStgeT.mjs +5 -0
  117. package/dist/renderer-Bajxo7Nt.mjs +5 -0
  118. package/dist/{renderer-BHskWZNG.mjs → renderer-Bel1UHA5.mjs} +2 -2
  119. package/dist/{renderer-AF884a7T.mjs → renderer-BetA_iVd.mjs} +3 -3
  120. package/dist/{renderer-AF884a7T.mjs.map → renderer-BetA_iVd.mjs.map} +1 -1
  121. package/dist/{renderer-DpW_LxLO.mjs → renderer-BmDpyiII.mjs} +3 -3
  122. package/dist/{renderer-DpW_LxLO.mjs.map → renderer-BmDpyiII.mjs.map} +1 -1
  123. package/dist/{renderer-BteUC_7n.mjs → renderer-BonWt8jF.mjs} +3 -3
  124. package/dist/{renderer-BteUC_7n.mjs.map → renderer-BonWt8jF.mjs.map} +1 -1
  125. package/dist/{renderer-BC8XOVl5.mjs → renderer-BpEsZG3t.mjs} +3 -3
  126. package/dist/{renderer-BC8XOVl5.mjs.map → renderer-BpEsZG3t.mjs.map} +1 -1
  127. package/dist/{renderer-aArb4RwJ.mjs → renderer-BvBIHi6N.mjs} +2 -2
  128. package/dist/{renderer-aArb4RwJ.mjs.map → renderer-BvBIHi6N.mjs.map} +1 -1
  129. package/dist/{renderer-Db3JIF1K.mjs → renderer-BvvuGfZk.mjs} +3 -3
  130. package/dist/{renderer-Db3JIF1K.mjs.map → renderer-BvvuGfZk.mjs.map} +1 -1
  131. package/dist/renderer-BzRR0KMm.mjs +5 -0
  132. package/dist/{renderer-DEuIwr-t.mjs → renderer-Bzl0s07U.mjs} +2 -2
  133. package/dist/{renderer-DEuIwr-t.mjs.map → renderer-Bzl0s07U.mjs.map} +1 -1
  134. package/dist/renderer-C39GD6jP.mjs +331 -0
  135. package/dist/renderer-C39GD6jP.mjs.map +1 -0
  136. package/dist/renderer-C3Gjy2iE.mjs +5 -0
  137. package/dist/{renderer-Br6KyRO_.mjs → renderer-C3lPwajT.mjs} +3 -3
  138. package/dist/{renderer-Br6KyRO_.mjs.map → renderer-C3lPwajT.mjs.map} +1 -1
  139. package/dist/renderer-C5hQgkz-.mjs +5 -0
  140. package/dist/{renderer-CebB0v1y.mjs → renderer-C6cF5seJ.mjs} +2 -2
  141. package/dist/{renderer-CebB0v1y.mjs.map → renderer-C6cF5seJ.mjs.map} +1 -1
  142. package/dist/renderer-C8GZ0pCV.mjs +191 -0
  143. package/dist/renderer-C8GZ0pCV.mjs.map +1 -0
  144. package/dist/{renderer-CuVPo-wP.mjs → renderer-CFe9pZFN.mjs} +2 -2
  145. package/dist/{renderer-CuVPo-wP.mjs.map → renderer-CFe9pZFN.mjs.map} +1 -1
  146. package/dist/renderer-CLF-MiOA.mjs +5 -0
  147. package/dist/renderer-CLa43fCd.mjs +5 -0
  148. package/dist/{renderer-Bvx56GR6.mjs → renderer-CLdwOhST.mjs} +2 -2
  149. package/dist/{renderer-Bvx56GR6.mjs.map → renderer-CLdwOhST.mjs.map} +1 -1
  150. package/dist/renderer-CMK1d6w_.mjs +5 -0
  151. package/dist/{renderer-CursFKUf.mjs → renderer-CMdtUn5o.mjs} +2 -2
  152. package/dist/{renderer-CursFKUf.mjs.map → renderer-CMdtUn5o.mjs.map} +1 -1
  153. package/dist/{renderer-DXqIslFk.mjs → renderer-CNYfB5cC.mjs} +2 -2
  154. package/dist/{renderer-DXqIslFk.mjs.map → renderer-CNYfB5cC.mjs.map} +1 -1
  155. package/dist/renderer-CPEQOe3u.mjs +5 -0
  156. package/dist/{renderer-BbdZ0YHR.mjs → renderer-CWx3Kg79.mjs} +3 -3
  157. package/dist/{renderer-BbdZ0YHR.mjs.map → renderer-CWx3Kg79.mjs.map} +1 -1
  158. package/dist/{renderer-CWBHVCvA.mjs → renderer-CdOy3EBJ.mjs} +2 -2
  159. package/dist/{renderer-CWBHVCvA.mjs.map → renderer-CdOy3EBJ.mjs.map} +1 -1
  160. package/dist/{renderer-DupsdRIw.mjs → renderer-Celrh689.mjs} +3 -3
  161. package/dist/{renderer-DupsdRIw.mjs.map → renderer-Celrh689.mjs.map} +1 -1
  162. package/dist/renderer-CemfjOM9.mjs +5 -0
  163. package/dist/{renderer-jYxN4mHn.mjs → renderer-ChloaI6P.mjs} +3 -3
  164. package/dist/{renderer-jYxN4mHn.mjs.map → renderer-ChloaI6P.mjs.map} +1 -1
  165. package/dist/{renderer-DqdhsSwS.mjs → renderer-CiMpdh0s.mjs} +2 -2
  166. package/dist/{renderer-DqdhsSwS.mjs.map → renderer-CiMpdh0s.mjs.map} +1 -1
  167. package/dist/renderer-CkcrScs9.mjs +5 -0
  168. package/dist/{renderer-CMT4QcpV.mjs → renderer-Cn6VlWHZ.mjs} +3 -3
  169. package/dist/{renderer-CMT4QcpV.mjs.map → renderer-Cn6VlWHZ.mjs.map} +1 -1
  170. package/dist/renderer-CqewgazK.mjs +224 -0
  171. package/dist/renderer-CqewgazK.mjs.map +1 -0
  172. package/dist/{renderer-C6md3msE.mjs → renderer-Cu5k5D9N.mjs} +2 -2
  173. package/dist/{renderer-C6md3msE.mjs.map → renderer-Cu5k5D9N.mjs.map} +1 -1
  174. package/dist/{renderer-id8TbKBY.mjs → renderer-CuphUktB.mjs} +2 -2
  175. package/dist/{renderer-id8TbKBY.mjs.map → renderer-CuphUktB.mjs.map} +1 -1
  176. package/dist/renderer-CwrLihY6.mjs +5 -0
  177. package/dist/{renderer-BzDjy1_x.mjs → renderer-D1Jt-c3F.mjs} +2 -2
  178. package/dist/{renderer-BzDjy1_x.mjs.map → renderer-D1Jt-c3F.mjs.map} +1 -1
  179. package/dist/{renderer-Beg7FLt2.mjs → renderer-D1wd0FhZ.mjs} +75 -27
  180. package/dist/renderer-D1wd0FhZ.mjs.map +1 -0
  181. package/dist/{renderer-jqByPgkD.mjs → renderer-D26S5hUh.mjs} +2 -2
  182. package/dist/{renderer-jqByPgkD.mjs.map → renderer-D26S5hUh.mjs.map} +1 -1
  183. package/dist/renderer-D4S6i2MC.mjs +5 -0
  184. package/dist/{renderer-BmGPTWwV.mjs → renderer-D7ss6fLB.mjs} +3 -3
  185. package/dist/{renderer-BmGPTWwV.mjs.map → renderer-D7ss6fLB.mjs.map} +1 -1
  186. package/dist/renderer-DB8F0XoP.mjs +5 -0
  187. package/dist/{renderer-PKQNH21k.mjs → renderer-DCGLXnYW.mjs} +2 -2
  188. package/dist/{renderer-CrABA3lB.mjs → renderer-DCYabwlC.mjs} +2 -2
  189. package/dist/{renderer-CrABA3lB.mjs.map → renderer-DCYabwlC.mjs.map} +1 -1
  190. package/dist/renderer-DGpVLJOn.mjs +5 -0
  191. package/dist/renderer-DGxibeSa.mjs +5 -0
  192. package/dist/renderer-DJQm3bAW.mjs +5 -0
  193. package/dist/{renderer-DD8napek.mjs → renderer-DMZ5aLU1.mjs} +2 -2
  194. package/dist/{renderer-DD8napek.mjs.map → renderer-DMZ5aLU1.mjs.map} +1 -1
  195. package/dist/renderer-DMftVSfX.mjs +5 -0
  196. package/dist/renderer-DNpovOd8.mjs +5 -0
  197. package/dist/renderer-DO5r7ZV-.mjs +658 -0
  198. package/dist/renderer-DO5r7ZV-.mjs.map +1 -0
  199. package/dist/{renderer-DZXbgVMK.mjs → renderer-DOWekunR.mjs} +3 -3
  200. package/dist/{renderer-DZXbgVMK.mjs.map → renderer-DOWekunR.mjs.map} +1 -1
  201. package/dist/{renderer-Cce2fgpX.mjs → renderer-DPWeKe_x.mjs} +3 -3
  202. package/dist/{renderer-Cce2fgpX.mjs.map → renderer-DPWeKe_x.mjs.map} +1 -1
  203. package/dist/{renderer-CE7fwGgw.mjs → renderer-DQtk282o.mjs} +29 -8
  204. package/dist/renderer-DQtk282o.mjs.map +1 -0
  205. package/dist/renderer-DSHlvKQk.mjs +5 -0
  206. package/dist/renderer-DUBb7D17.mjs +219 -0
  207. package/dist/renderer-DUBb7D17.mjs.map +1 -0
  208. package/dist/renderer-DYtrdR2p.mjs +5 -0
  209. package/dist/{renderer-Bn2eQE-t.mjs → renderer-DaCsT-XU.mjs} +3 -3
  210. package/dist/{renderer-Bn2eQE-t.mjs.map → renderer-DaCsT-XU.mjs.map} +1 -1
  211. package/dist/{renderer-D1Cm21eq.mjs → renderer-DcAfp1Er.mjs} +2 -2
  212. package/dist/{renderer-D1Cm21eq.mjs.map → renderer-DcAfp1Er.mjs.map} +1 -1
  213. package/dist/{renderer-C8uKdelk.mjs → renderer-DdlaBsk_.mjs} +2 -2
  214. package/dist/{renderer-C8uKdelk.mjs.map → renderer-DdlaBsk_.mjs.map} +1 -1
  215. package/dist/renderer-DerDxKK3.mjs +220 -0
  216. package/dist/renderer-DerDxKK3.mjs.map +1 -0
  217. package/dist/{renderer-CeyAgJnw.mjs → renderer-DfkWYUTX.mjs} +2 -2
  218. package/dist/{renderer-DHGTzype.mjs → renderer-Dh-OF6aH.mjs} +2 -2
  219. package/dist/{renderer-DHGTzype.mjs.map → renderer-Dh-OF6aH.mjs.map} +1 -1
  220. package/dist/renderer-Dk-THZHp.mjs +222 -0
  221. package/dist/renderer-Dk-THZHp.mjs.map +1 -0
  222. package/dist/{renderer-BT-_EoXw.d.mts → renderer-DlESyfg7.d.mts} +2 -2
  223. package/dist/{renderer-BT-_EoXw.d.mts.map → renderer-DlESyfg7.d.mts.map} +1 -1
  224. package/dist/renderer-DpWRj6zF.mjs +203 -0
  225. package/dist/renderer-DpWRj6zF.mjs.map +1 -0
  226. package/dist/renderer-DpwlN4LH.mjs +233 -0
  227. package/dist/renderer-DpwlN4LH.mjs.map +1 -0
  228. package/dist/{renderer-DvFaC_-7.mjs → renderer-Dq4aO7az.mjs} +2 -2
  229. package/dist/{renderer-DvFaC_-7.mjs.map → renderer-Dq4aO7az.mjs.map} +1 -1
  230. package/dist/renderer-DuSImLUz.mjs +5 -0
  231. package/dist/{renderer-BeIUgp1r.mjs → renderer-DukD7S3w.mjs} +2 -2
  232. package/dist/{renderer-BeIUgp1r.mjs.map → renderer-DukD7S3w.mjs.map} +1 -1
  233. package/dist/{renderer-EemDpvv3.mjs → renderer-FXUCKps6.mjs} +3 -3
  234. package/dist/{renderer-EemDpvv3.mjs.map → renderer-FXUCKps6.mjs.map} +1 -1
  235. package/dist/renderer-FbyMYKXe.mjs +5 -0
  236. package/dist/renderer-HMl2V4iM.mjs +541 -0
  237. package/dist/renderer-HMl2V4iM.mjs.map +1 -0
  238. package/dist/renderer-LM_XIKl1.mjs +203 -0
  239. package/dist/renderer-LM_XIKl1.mjs.map +1 -0
  240. package/dist/renderer-NMFv7Auz.mjs +5 -0
  241. package/dist/{renderer-YbaCzPcG.mjs → renderer-O1b-oYJE.mjs} +2 -2
  242. package/dist/renderer-P3vpdUnb.mjs +5 -0
  243. package/dist/renderer-PknbdJyL.mjs +208 -0
  244. package/dist/renderer-PknbdJyL.mjs.map +1 -0
  245. package/dist/renderer-QTOm26Lg.mjs +5 -0
  246. package/dist/renderer-YJ3Yukou.mjs +215 -0
  247. package/dist/renderer-YJ3Yukou.mjs.map +1 -0
  248. package/dist/{renderer-p_C_T9Kn.mjs → renderer-YdLL2o6d.mjs} +2 -2
  249. package/dist/{renderer-p_C_T9Kn.mjs.map → renderer-YdLL2o6d.mjs.map} +1 -1
  250. package/dist/renderer-ahzhMa5q.mjs +5 -0
  251. package/dist/{renderer-D-vRKssW.mjs → renderer-c-bwxMde.mjs} +2 -2
  252. package/dist/{renderer-D-vRKssW.mjs.map → renderer-c-bwxMde.mjs.map} +1 -1
  253. package/dist/renderer-dThfTNge.mjs +5 -0
  254. package/dist/renderer-dUkOBfGB.mjs +308 -0
  255. package/dist/renderer-dUkOBfGB.mjs.map +1 -0
  256. package/dist/renderer-dgAS_k7B.mjs +5 -0
  257. package/dist/renderer-g-ui08Lh.mjs +204 -0
  258. package/dist/renderer-g-ui08Lh.mjs.map +1 -0
  259. package/dist/renderer-kSs8VtY7.mjs +223 -0
  260. package/dist/renderer-kSs8VtY7.mjs.map +1 -0
  261. package/dist/{renderer-KnCcN_Nz.mjs → renderer-pPiQwFYh.mjs} +2 -2
  262. package/dist/{renderer-KnCcN_Nz.mjs.map → renderer-pPiQwFYh.mjs.map} +1 -1
  263. package/dist/{renderer-D8thCpS7.mjs → renderer-wL-ly4fT.mjs} +3 -3
  264. package/dist/{renderer-D8thCpS7.mjs.map → renderer-wL-ly4fT.mjs.map} +1 -1
  265. package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs → renderers-CP8CFWDs-CVHwMTiz.mjs} +2 -2
  266. package/dist/{renderers-CP8CFWDs-BA-4l6By.mjs.map → renderers-CP8CFWDs-CVHwMTiz.mjs.map} +1 -1
  267. package/dist/signals/index.d.mts +5 -5
  268. package/dist/signals/index.mjs +4 -4
  269. package/package.json +58 -55
  270. package/dist/dist-CT___nEU.mjs.map +0 -1
  271. package/dist/effects-C06-AOge.mjs.map +0 -1
  272. package/dist/index-B-oUlLoO.d.mts.map +0 -1
  273. package/dist/index-CwbszPDG.d.mts.map +0 -1
  274. package/dist/preview-engine/chunk-G4K6TLNA.mjs +0 -1
  275. package/dist/preview-engine/chunk-HVCAOHNI.mjs +0 -1
  276. package/dist/preview-engine/chunk-KBO6EX3M.mjs +0 -1448
  277. package/dist/preview-engine/chunk-N4LHIPHZ.mjs +0 -340
  278. package/dist/preview-engine/chunk-NECOKNHA.mjs +0 -174
  279. package/dist/preview-engine/renderers-T4JMJXWL.mjs +0 -1
  280. package/dist/preview-engine/renderers-VFV5QWO3.mjs +0 -1
  281. package/dist/preview-engine/renderers-VUL4HBX3.mjs +0 -228
  282. package/dist/program-DzknMiY0.mjs.map +0 -1
  283. package/dist/renderer--IDyGdqT.mjs +0 -5
  284. package/dist/renderer-17K4tjid.mjs +0 -5
  285. package/dist/renderer-1vhaKMeg.mjs.map +0 -1
  286. package/dist/renderer-Ab9Ttn_m.mjs +0 -5
  287. package/dist/renderer-B-roDBBo.mjs +0 -5
  288. package/dist/renderer-B03uwoUX.mjs +0 -5
  289. package/dist/renderer-B3BI_7YJ.mjs +0 -5
  290. package/dist/renderer-BGD4lQ74.mjs +0 -5
  291. package/dist/renderer-BHXhYfeC.mjs +0 -5
  292. package/dist/renderer-BRsTIMFa.mjs +0 -5
  293. package/dist/renderer-Beg7FLt2.mjs.map +0 -1
  294. package/dist/renderer-BjMTtYZw.mjs +0 -5
  295. package/dist/renderer-BoCh3Yts.mjs +0 -5
  296. package/dist/renderer-BqPbR8c4.mjs +0 -5
  297. package/dist/renderer-Bxa4SDm9.mjs +0 -3
  298. package/dist/renderer-C4Da2I1-.mjs +0 -5
  299. package/dist/renderer-C93X6dgl.mjs +0 -5
  300. package/dist/renderer-CE7fwGgw.mjs.map +0 -1
  301. package/dist/renderer-CMAwFfGx.mjs +0 -6
  302. package/dist/renderer-CRXeSuX2.mjs +0 -5
  303. package/dist/renderer-CSp6WYBN.mjs +0 -5
  304. package/dist/renderer-CUXX7HTL.mjs +0 -5
  305. package/dist/renderer-CUgThpka.mjs +0 -5
  306. package/dist/renderer-CeVtufiT.mjs +0 -5
  307. package/dist/renderer-CespkZUk.mjs +0 -5
  308. package/dist/renderer-D1l47xhL.mjs +0 -5
  309. package/dist/renderer-DDuG18J8.mjs +0 -5
  310. package/dist/renderer-DFhrFSMn.mjs +0 -5
  311. package/dist/renderer-DO48vQ7Y.mjs +0 -5
  312. package/dist/renderer-DTC39B_n.mjs +0 -5
  313. package/dist/renderer-DbyU3hNF.mjs +0 -5
  314. package/dist/renderer-DftVpmfu.mjs +0 -5
  315. package/dist/renderer-Dj5jm63K.mjs +0 -5
  316. package/dist/renderer-Dju57ZaF.mjs +0 -5
  317. package/dist/renderer-Dn8TQCw7.mjs +0 -5
  318. package/dist/renderer-ETF46K0D.mjs +0 -5
  319. package/dist/renderer-azYzWGC3.mjs +0 -5
  320. package/dist/renderer-dxNoRW59.mjs +0 -5
  321. package/dist/renderer-fdfelx_I.mjs +0 -5
  322. package/dist/renderer-snwEKwMw.mjs +0 -5
@@ -0,0 +1,96 @@
1
+ import{a as k,d as U,f as R,h as S,j as G,m as w}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as P}from"./chunk-63SFBHEH.mjs";import{e as f}from"./chunk-BVF64D6H.mjs";f();f();var p="Painterly",_=12,W=[`struct U { v : array<vec4<f32>, 3> };
2
+ @group(0) @binding(0) var<uniform> u : U;
3
+ @group(0) @binding(1) var src : texture_2d<f32>;
4
+ @group(0) @binding(2) var prev : texture_2d<f32>;
5
+ @group(0) @binding(3) var samp : sampler;
6
+ ${k}
7
+
8
+ fn straight(c : vec4<f32>) -> vec4<f32> {
9
+ if (c.a <= 0.0001) { return vec4<f32>(0.0); }
10
+ return vec4<f32>(c.rgb / c.a, c.a);
11
+ }
12
+ fn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }
13
+ fn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }
14
+ /** Straight-alpha color of the layer at a uv (filtered). */
15
+ fn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }
16
+ /** Premultiplied color of the layer at a uv (filtered). */
17
+ fn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }
18
+ /** Straight-alpha color of the layer's texel at a pixel position (nearest). */
19
+ fn texelS(p : vec2<f32>) -> vec4<f32> {
20
+ let d = vec2<i32>(textureDimensions(src));
21
+ let q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));
22
+ return straight(textureLoad(src, q, 0));
23
+ }
24
+ fn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }
25
+ fn hash12(p : vec2<f32>) -> f32 {
26
+ var p3 = fract(vec3<f32>(p.xyx) * 0.1031);
27
+ p3 += dot(p3, p3.yzx + 33.33);
28
+ return fract((p3.x + p3.y) * p3.z);
29
+ }
30
+ fn vnoise(p : vec2<f32>) -> f32 {
31
+ let i = floor(p);
32
+ let f = fract(p);
33
+ let u = f * f * (3.0 - 2.0 * f);
34
+ return mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),
35
+ mix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);
36
+ }
37
+ /** 8x8 ordered-dither threshold, 0..1. */
38
+ fn bayer8(p : vec2<f32>) -> f32 {
39
+ let x = u32(p.x) & 7u;
40
+ let y = u32(p.y) & 7u;
41
+ var v = 0u;
42
+ for (var k = 0u; k < 3u; k++) {
43
+ let bx = (x >> k) & 1u;
44
+ let by = (y >> k) & 1u;
45
+ let m = ((bx ^ by) << 1u) | by;
46
+ v += m * (1u << (2u * (2u - k)));
47
+ }
48
+ return (f32(v) + 0.5) / 64.0;
49
+ }
50
+ fn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }
51
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
52
+ let time = u.v[0].x;
53
+ let frame = u.v[0].y;
54
+ let style = u32(u.v[1].x + 0.5);
55
+ let radius = u.v[1].y;
56
+ let edgeDarkening = u.v[1].z;
57
+ let paper = u.v[1].w;
58
+ let saturation = u.v[2].x;
59
+
60
+ let R = res();
61
+ let r = i32(radius);
62
+ var mean = array<vec3<f32>, 4>(vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0));
63
+ var sq = array<vec3<f32>, 4>(vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0), vec3<f32>(0.0));
64
+ var a = 0.0;
65
+ for (var j = -r; j <= r; j++) {
66
+ for (var i = -r; i <= r; i++) {
67
+ let c = sampleS(in.uv + vec2<f32>(f32(i), f32(j)) / R);
68
+ a += c.a;
69
+ let q = select(select(3, 2, i <= 0), select(1, 0, i <= 0), j <= 0);
70
+ mean[q] += c.rgb;
71
+ sq[q] += c.rgb * c.rgb;
72
+ }
73
+ }
74
+ let n = f32((r + 1) * (r + 1));
75
+ var best = vec3<f32>(0.0);
76
+ var bestV = 1e9;
77
+ for (var k = 0; k < 4; k++) {
78
+ let m = mean[k] / n;
79
+ let v = sq[k] / n - m * m;
80
+ let vs = v.r + v.g + v.b;
81
+ if (vs < bestV) { bestV = vs; best = m; }
82
+ }
83
+ var rgb = best;
84
+ let grain = vnoise(in.uv * R / 3.0) * 0.6 + vnoise(in.uv * R / 11.0) * 0.4;
85
+ if (style == 1u) {
86
+ rgb = mix(rgb, vec3<f32>(1.0), 0.06);
87
+ rgb *= 1.0 - edgeDarkening * 0.45 * smoothstep(0.004, 0.05, sqrt(max(bestV, 0.0)));
88
+ rgb *= 1.0 - paper * 0.18 * (grain - 0.5);
89
+ } else {
90
+ rgb *= 1.0 - paper * 0.1 * (grain - 0.5);
91
+ }
92
+ rgb = clamp(mix(vec3<f32>(luma(rgb)), rgb, saturation), vec3<f32>(0.0), vec3<f32>(1.0));
93
+ let alpha = a / f32((2 * r + 1) * (2 * r + 1));
94
+ return premul(vec4<f32>(rgb, alpha));
95
+ }
96
+ `],T=R(e=>({layout:U(e,["uniform","texture","texture","sampler"],`${p}_layout`),pipelines:new Map,sampler:e.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"})}));function N(e,r){let t=T(e),n=t.pipelines.get(r);return n||(n=W.map((v,a)=>{let o=e.createShaderModule({code:v,label:`${p}_${a}.wgsl`});return e.createRenderPipeline({label:`${p}_${a}`,layout:e.createPipelineLayout({bindGroupLayouts:[t.layout]}),vertex:{module:o,entryPoint:"vs"},fragment:{module:o,entryPoint:"fs",targets:[{format:r}]},primitive:{topology:"triangle-strip"}})}),t.pipelines.set(r,n)),n}function l(e,r){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:r}function $(e,r,t,n){r.fill(0),r[0]=t,r[1]=n,r[4]=Math.max(0,["oil","watercolor"].indexOf(String(e.style??"oil"))),r[5]=l(e.radius,5),r[6]=l(e.edgeDarkening,.5),r[7]=l(e.paper,.3),r[8]=l(e.saturation,1.05)}var F=async e=>{let{ctx:r,encoder:t,pass:n,targetTexture:v,targetWidth:a,targetHeight:o,props:i}=e,c=i.virtualMedia?.operation;if(c?.op!==p)return;let b=i.virtualMedia?.children?.[0];if(!b)return;n.end();let m=i.fps||30,s=Math.round(i.compositionFrame??i.frame??0),L=c.effect?.resolveUniforms?c.effect.resolveUniforms({frame:s,fps:m,time:s/m}):c,x=new Float32Array(_);$(L,x,s/m,s);let{texture:d}=await S(e,b),g=r.device,y=T(g),q=N(g,r.renderer.format),D=r.renderer.getTemporaryBuffer(x),u=d;for(let M of q){let h=r.renderer.getTemporaryTexture(a,o,[d,u,v,...i.excludeTextures||[]]);w(t,h.createView(),M,[g.createBindGroup({layout:y.layout,entries:[{binding:0,resource:{buffer:D}},{binding:1,resource:d.createView()},{binding:2,resource:u.createView()},{binding:3,resource:y.sampler}]})]),u=h}G(e,u)};var E=P({WebGPURenderer:F});export{F as PainterlyWebGPURenderer,E as default};
@@ -0,0 +1,94 @@
1
+ import{a as P,d as R,f as U,h as S,j as T,m as G}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as k}from"./chunk-63SFBHEH.mjs";import{e as f}from"./chunk-BVF64D6H.mjs";f();f();var v="CRT",D=16,N=[`struct U { v : array<vec4<f32>, 4> };
2
+ @group(0) @binding(0) var<uniform> u : U;
3
+ @group(0) @binding(1) var src : texture_2d<f32>;
4
+ @group(0) @binding(2) var prev : texture_2d<f32>;
5
+ @group(0) @binding(3) var samp : sampler;
6
+ ${P}
7
+
8
+ fn straight(c : vec4<f32>) -> vec4<f32> {
9
+ if (c.a <= 0.0001) { return vec4<f32>(0.0); }
10
+ return vec4<f32>(c.rgb / c.a, c.a);
11
+ }
12
+ fn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }
13
+ fn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }
14
+ /** Straight-alpha color of the layer at a uv (filtered). */
15
+ fn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }
16
+ /** Premultiplied color of the layer at a uv (filtered). */
17
+ fn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }
18
+ /** Straight-alpha color of the layer's texel at a pixel position (nearest). */
19
+ fn texelS(p : vec2<f32>) -> vec4<f32> {
20
+ let d = vec2<i32>(textureDimensions(src));
21
+ let q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));
22
+ return straight(textureLoad(src, q, 0));
23
+ }
24
+ fn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }
25
+ fn hash12(p : vec2<f32>) -> f32 {
26
+ var p3 = fract(vec3<f32>(p.xyx) * 0.1031);
27
+ p3 += dot(p3, p3.yzx + 33.33);
28
+ return fract((p3.x + p3.y) * p3.z);
29
+ }
30
+ fn vnoise(p : vec2<f32>) -> f32 {
31
+ let i = floor(p);
32
+ let f = fract(p);
33
+ let u = f * f * (3.0 - 2.0 * f);
34
+ return mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),
35
+ mix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);
36
+ }
37
+ /** 8x8 ordered-dither threshold, 0..1. */
38
+ fn bayer8(p : vec2<f32>) -> f32 {
39
+ let x = u32(p.x) & 7u;
40
+ let y = u32(p.y) & 7u;
41
+ var v = 0u;
42
+ for (var k = 0u; k < 3u; k++) {
43
+ let bx = (x >> k) & 1u;
44
+ let by = (y >> k) & 1u;
45
+ let m = ((bx ^ by) << 1u) | by;
46
+ v += m * (1u << (2u * (2u - k)));
47
+ }
48
+ return (f32(v) + 0.5) / 64.0;
49
+ }
50
+ fn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }
51
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
52
+ let time = u.v[0].x;
53
+ let frame = u.v[0].y;
54
+ let scanlines = u.v[1].x;
55
+ let lineCount = u.v[1].y;
56
+ let curvature = u.v[1].z;
57
+ let mask = u.v[1].w;
58
+ let vignette = u.v[2].x;
59
+ let noise = u.v[2].y;
60
+ let flicker = u.v[2].z;
61
+ let tracking = u.v[2].w;
62
+ let chroma = u.v[3].x;
63
+
64
+ let R = res();
65
+ let t = time;
66
+ let cc = in.uv * 2.0 - 1.0;
67
+ var uv = (cc * (1.0 + curvature * 0.25 * dot(cc, cc))) * 0.5 + 0.5;
68
+ if (uv.x < 0.0 || uv.y < 0.0 || uv.x > 1.0 || uv.y > 1.0) { return vec4<f32>(0.0, 0.0, 0.0, 1.0); }
69
+ let line = floor(uv.y * lineCount);
70
+ let jitter = (hash12(vec2<f32>(line, floor(t * 30.0))) - 0.5) * tracking * 0.006;
71
+ let bandY = fract(t * 0.13);
72
+ let band = smoothstep(0.07, 0.0, abs(uv.y - bandY)) * tracking;
73
+ uv.x += jitter + band * 0.015 * sin(uv.y * 400.0 + t * 20.0);
74
+ let base = sampleS(uv);
75
+ var rgb = base.rgb;
76
+ if (chroma > 0.0) {
77
+ let off = chroma / R.x;
78
+ let avg = (sampleS(uv - vec2<f32>(off, 0.0)).rgb + base.rgb + sampleS(uv + vec2<f32>(off * 2.0, 0.0)).rgb) / 3.0;
79
+ let y = luma(base.rgb);
80
+ rgb = vec3<f32>(y) + (avg - vec3<f32>(luma(avg)));
81
+ }
82
+ let sl = 0.5 + 0.5 * cos(uv.y * lineCount * 6.2831853);
83
+ rgb *= 1.0 - scanlines * (1.0 - sl) * 0.7;
84
+ let tri = u32(floor(in.uv.x * R.x)) % 3u;
85
+ var m = vec3<f32>(0.75);
86
+ if (tri == 0u) { m.r = 1.25; } else if (tri == 1u) { m.g = 1.25; } else { m.b = 1.25; }
87
+ rgb *= mix(vec3<f32>(1.0), m, mask);
88
+ rgb += (hash12(in.uv * R + vec2<f32>(t * 61.0, t * 17.0)) - 0.5) * noise * 0.3;
89
+ rgb *= 1.0 - flicker * hash12(vec2<f32>(floor(t * 24.0), 3.0));
90
+ rgb *= 1.0 - vignette * dot(cc, cc) * 0.35;
91
+ rgb += band * 0.12;
92
+ return vec4<f32>(clamp(rgb, vec3<f32>(0.0), vec3<f32>(1.0)), 1.0);
93
+ }
94
+ `],F=U(e=>({layout:R(e,["uniform","texture","texture","sampler"],`${v}_layout`),pipelines:new Map,sampler:e.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"})}));function $(e,r){let t=F(e),i=t.pipelines.get(r);return i||(i=N.map((p,c)=>{let u=e.createShaderModule({code:p,label:`${v}_${c}.wgsl`});return e.createRenderPipeline({label:`${v}_${c}`,layout:e.createPipelineLayout({bindGroupLayouts:[t.layout]}),vertex:{module:u,entryPoint:"vs"},fragment:{module:u,entryPoint:"fs",targets:[{format:r}]},primitive:{topology:"triangle-strip"}})}),t.pipelines.set(r,i)),i}function n(e,r){let t=typeof e=="number"?e:Number(e);return Number.isFinite(t)?t:r}function A(e,r,t,i){r.fill(0),r[0]=t,r[1]=i,r[4]=n(e.scanlines,.45),r[5]=n(e.lineCount,540),r[6]=n(e.curvature,.12),r[7]=n(e.mask,.25),r[8]=n(e.vignette,.35),r[9]=n(e.noise,.08),r[10]=n(e.flicker,.03),r[11]=n(e.tracking,0),r[12]=n(e.chroma,0)}var w=async e=>{let{ctx:r,encoder:t,pass:i,targetTexture:p,targetWidth:c,targetHeight:u,props:o}=e,l=o.virtualMedia?.operation;if(l?.op!==v)return;let b=o.virtualMedia?.children?.[0];if(!b)return;i.end();let m=o.fps||30,a=Math.round(o.compositionFrame??o.frame??0),L=l.effect?.resolveUniforms?l.effect.resolveUniforms({frame:a,fps:m,time:a/m}):l,x=new Float32Array(D);A(L,x,a/m,a);let{texture:d}=await S(e,b),g=r.device,y=F(g),C=$(g,r.renderer.format),M=r.renderer.getTemporaryBuffer(x),s=d;for(let _ of C){let h=r.renderer.getTemporaryTexture(c,u,[d,s,p,...o.excludeTextures||[]]);G(t,h.createView(),_,[g.createBindGroup({layout:y.layout,entries:[{binding:0,resource:{buffer:M}},{binding:1,resource:d.createView()},{binding:2,resource:s.createView()},{binding:3,resource:y.sampler}]})]),s=h}T(e,s)};var j=k({WebGPURenderer:w});export{w as CRTWebGPURenderer,j as default};
@@ -0,0 +1,363 @@
1
+ import{a as k,d as F,e as V,f as T,g as D,k as L}from"./chunk-ENKKLU7B.mjs";import{d as b}from"./chunk-6YJP57MZ.mjs";import{x as o,z as A}from"./chunk-63SFBHEH.mjs";import{e as u}from"./chunk-BVF64D6H.mjs";u();u();var z=`
2
+ struct VFXUniforms {
3
+ effectType : f32,
4
+ outputType : f32,
5
+ time : f32,
6
+ _pad0 : f32,
7
+
8
+ density : f32,
9
+ scale : f32,
10
+ speed : f32,
11
+ intensity : f32,
12
+
13
+ seed : f32,
14
+ hasSigDensity : f32,
15
+ hasSigScale : f32,
16
+ hasSigSpeed : f32,
17
+
18
+ hasSigIntensity : f32,
19
+ hasSigSeed : f32,
20
+ _pad1 : f32,
21
+ _pad2 : f32,
22
+
23
+ colorStart : vec4<f32>,
24
+ colorEnd : vec4<f32>,
25
+ };
26
+
27
+ @group(0) @binding(0) var<uniform> u : VFXUniforms;
28
+
29
+ @group(1) @binding(0) var densityTex : texture_2d<f32>;
30
+ @group(1) @binding(1) var scaleTex : texture_2d<f32>;
31
+ @group(1) @binding(2) var speedTex : texture_2d<f32>;
32
+ @group(1) @binding(3) var intensityTex : texture_2d<f32>;
33
+ @group(1) @binding(4) var seedTex : texture_2d<f32>;
34
+ @group(1) @binding(5) var signalSamp : sampler;
35
+ ${k}
36
+
37
+ // ---- hashing & noise primitives -------------------------------------------
38
+ fn hash21(p: vec2<f32>) -> vec2<f32> {
39
+ let p3 = fract(vec3<f32>(p.xyx) * vec3<f32>(0.1031, 0.1030, 0.0973));
40
+ let p4 = p3 + dot(p3, p3.yzx + 33.33);
41
+ return fract((p4.xx + p4.yz) * p4.zy);
42
+ }
43
+
44
+ fn hash1(n: f32) -> f32 {
45
+ return fract(sin(n) * 43758.5453);
46
+ }
47
+
48
+ fn valueNoise(p: vec2<f32>) -> f32 {
49
+ let i = floor(p);
50
+ let f = fract(p);
51
+ let u = f * f * (3.0 - 2.0 * f);
52
+ let a = hash1(dot(i, vec2<f32>(127.1, 311.7)));
53
+ let b = hash1(dot(i + vec2<f32>(1.0, 0.0), vec2<f32>(127.1, 311.7)));
54
+ let c = hash1(dot(i + vec2<f32>(0.0, 1.0), vec2<f32>(127.1, 311.7)));
55
+ let d = hash1(dot(i + vec2<f32>(1.0, 1.0), vec2<f32>(127.1, 311.7)));
56
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
57
+ }
58
+
59
+ fn fbm(p: vec2<f32>, octaves: i32) -> f32 {
60
+ var value = 0.0;
61
+ var amp = 0.5;
62
+ var freq = 1.0;
63
+ for (var i = 0; i < 8; i++) {
64
+ if (i >= octaves) { break; }
65
+ value += amp * valueNoise(p * freq);
66
+ freq *= 2.0;
67
+ amp *= 0.5;
68
+ }
69
+ return value;
70
+ }
71
+
72
+ fn get_field(val: f32, hasSig: f32, tex: texture_2d<f32>, samp: sampler) -> f32 {
73
+ if (hasSig > 0.5) {
74
+ return textureSampleLevel(tex, samp, vec2<f32>(0.5, 0.5), 0.0).r;
75
+ }
76
+ return val;
77
+ }
78
+
79
+ // ---- effect synthesizers (return straight-alpha RGBA) ----------------------
80
+ fn fxSmoke(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
81
+ let sp = p * scl;
82
+ // Domain-warped FBM gives structured puffs instead of a solid fill.
83
+ let q = vec2<f32>(fbm(sp + time * 0.10, 4), fbm(sp + vec2<f32>(5.2, 1.3) + time * 0.08, 4));
84
+ let f = fbm(sp + 4.0 * q + vec2<f32>(1.7, 9.2) + time * 0.05, 4); // ~[0, 0.94]
85
+ // Billowing plume: denser at the base (bottom, p.y=0), dissipating toward the top.
86
+ let vgrad = 1.0 - smoothstep(0.45, 0.9, p.y);
87
+ let n = f * 2.0 - 1.0; // remap to [-1, 1]
88
+ // Thresholded so only bright fbm patches are opaque -> reads as puffs, not solid.
89
+ let cov = smoothstep(0.28, 0.6, n) * dens * (0.25 + 0.75 * vgrad);
90
+ let alpha = cov * inten;
91
+ let col = mix(cB * 0.35, cA, clamp(f + vgrad * 0.5, 0.0, 1.0));
92
+ return vec4<f32>(col, clamp(alpha, 0.0, 1.0));
93
+ }
94
+
95
+ fn fxFire(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
96
+ let pn = vec2<f32>(p.x * 1.5, p.y) * scl;
97
+ let n = fbm(pn * 6.0 + vec2<f32>(time * 2.0, time * 3.0), 4);
98
+ // Heat concentrated near base, flickering upward
99
+ let heat = n * smoothstep(1.0, 0.0 + (1.0 - dens) * 0.3, p.y);
100
+ // Channeled vertical columns
101
+ let columns = smoothstep(0.45, 0.9, n + 0.4 * sin(p.x * (20.0 + 40.0 * dens) * scl + time * 8.0));
102
+ let d = clamp(heat * inten + columns * 0.3 * inten, 0.0, 1.0);
103
+ // Fire color ramp mapped dynamically to cA and cB
104
+ let dark = cB * 0.15;
105
+ let orange = cB;
106
+ let yellow = mix(cB, cA, 0.5);
107
+ let white = cA;
108
+ var col = mix(dark, orange, smoothstep(0.0, 0.4, d));
109
+ col = mix(col, yellow, smoothstep(0.4, 0.75, d));
110
+ col = mix(col, white, smoothstep(0.75, 1.0, d));
111
+ let alpha = smoothstep(0.0, 0.3, d) * inten;
112
+ return vec4<f32>(col, clamp(alpha, 0.0, 1.0));
113
+ }
114
+
115
+ fn fxRain(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
116
+ let n = (60.0 * dens + 4.0) * scl;
117
+ let gx = floor(p.x * n);
118
+ let h = hash1(gx);
119
+ let speed = 0.8 + h;
120
+ let yFrac = fract(p.y * 8.0 - time * speed);
121
+ let dropY = abs(yFrac - 0.5);
122
+ let reveal = step(0.35, yFrac);
123
+ let st = smoothstep(0.18, 0.02, dropY);
124
+ let d = st * reveal;
125
+ let g = smoothstep(0.18, 0.02, abs(fract(p.x * n) + h * 0.2 - 0.5));
126
+ let a = d * g * inten;
127
+ let col = mix(cA, cB, h);
128
+ return vec4<f32>(col, clamp(a, 0.0, 1.0));
129
+ }
130
+
131
+ fn fxSnow(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
132
+ let n = (50.0 * dens + 6.0) * scl;
133
+ let cell = floor(p * n);
134
+ let f = fract(p * n);
135
+ let h = hash21(cell);
136
+ let center = vec2<f32>(0.5, 0.5) + 0.3 * hash21(cell + 7.0);
137
+ let sway = 0.1 * sin(time * 1.2 + cell.y * 3.0);
138
+ // Fall downward (toward p.y=0, the bottom): subtract an advancing phase.
139
+ let fall = fract(time * (0.25 + 0.45 * h.y) + h.x);
140
+ let pos = vec2<f32>(f.x - center.x - sway, f.y - center.y) - vec2<f32>(0.0, fall);
141
+ let d = length(pos);
142
+ let size = 0.05 + 0.07 * h.x;
143
+ let a = smoothstep(size, size * 0.4, d) * inten;
144
+ let col = mix(cA, cB, h.x);
145
+ return vec4<f32>(col, clamp(a, 0.0, 1.0));
146
+ }
147
+
148
+ fn fxDust(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
149
+ let n = (90.0 * dens + 6.0) * scl;
150
+ let cell = floor(p * n);
151
+ let f = fract(p * n);
152
+ let h = hash21(cell);
153
+ let center = h;
154
+ let drift = fract(time * 0.05 * (0.5 + h.y) + cell.x * 0.01);
155
+ let pos = vec2<f32>(f.x - center.x, f.y - center.y) + vec2<f32>((drift - 0.5) * 0.03, 0.0);
156
+ let d = length(pos);
157
+ let a = smoothstep(0.12, 0.0, d) * smoothstep(0.0, 0.3, dens) * inten * 0.6;
158
+ let col = mix(cA, cB, h.y);
159
+ return vec4<f32>(col, clamp(a, 0.0, 1.0));
160
+ }
161
+
162
+ fn fxEmbers(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
163
+ let n = (50.0 * dens + 4.0) * scl;
164
+ let cell = floor(p * n);
165
+ let f = fract(p * n);
166
+ let h = hash21(cell);
167
+ let sway = 0.12 * sin(time * 2.0 + cell.y * 2.0);
168
+ let rise = fract(time * 0.18 * (0.7 + h.y) + cell.y * 0.12);
169
+ // Rising: as rise grows, move toward p.y=1 (top).
170
+ let pos = vec2<f32>(f.x - 0.5 - sway, f.y + rise * 1.2);
171
+ let d = length(pos);
172
+ let a = smoothstep(0.12, 0.0, d) * (1.0 - rise) * inten;
173
+ let col = mix(cA, cB, clamp(rise, 0.0, 1.0));
174
+ return vec4<f32>(col, clamp(a, 0.0, 1.0));
175
+ }
176
+
177
+ fn fxSparks(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
178
+ // Burst radiating from a low-center source; travel grows over time so it expands outward.
179
+ let src = vec2<f32>(0.5, 0.15);
180
+ let dir = p - src;
181
+ let dist = length(dir);
182
+ let ang = atan2(dir.y, dir.x);
183
+ let n = (20.0 * dens + 5.0) * scl;
184
+ let seg = floor(ang * n);
185
+ let tFrame = floor(time * 3.0);
186
+ let timeVal = tFrame - 10000.0 * floor(tFrame / 10000.0);
187
+ let h = hash1(seg + timeVal * 97.0);
188
+ let launch = fract(0.5 + h + time * 0.5);
189
+ let travel = launch * 0.8;
190
+ let trail = smoothstep(0.9, 0.4, dist - travel);
191
+ let w = 0.02 + 0.02 * h;
192
+ let blast = smoothstep(0.0, w * 2.0, dist - travel) * trail;
193
+ let streak = smoothstep(w, 0.0, abs(dist - travel)) * trail;
194
+ let a = clamp(max(streak, blast * 0.4), 0.0, 1.0) * inten;
195
+ let col = mix(cA, cB, clamp(h, 0.0, 1.0));
196
+ return vec4<f32>(col, clamp(a, 0.0, 1.0));
197
+ }
198
+
199
+ fn fxMagic(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
200
+ let center = vec2<f32>(0.5, 0.5);
201
+ let dv = p - center;
202
+ let r = length(dv);
203
+ let ang = atan2(dv.y, dv.x);
204
+ let swirl = fbm(vec2<f32>(r * 8.0 * scl + time * 0.5, ang * 3.0 + time * 0.8), 4);
205
+ let halo = smoothstep(0.5, 0.1, r) * 0.4 * dens;
206
+ let wisp = smoothstep(1.0 - dens * 0.8, 1.5 - dens * 0.8, swirl) * (0.5 + 0.5 * sin(r * 20.0 * scl - time * 3.0));
207
+ let a = clamp((halo + wisp * 0.8) * inten, 0.0, 1.0);
208
+ let col = mix(cA, cB, clamp(swirl, 0.0, 1.0));
209
+ return vec4<f32>(col * 0.8 + vec3<f32>(1.0) * halo * 0.4, a);
210
+ }
211
+
212
+ fn fxLensFlare(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
213
+ let center = vec2<f32>(0.5, 0.5);
214
+ let dv = p - center;
215
+ let r = length(dv) * scl;
216
+ let ang = atan2(dv.y, dv.x);
217
+ // Radial streak
218
+ let streakCount = 2.0 * floor(1.0 + dens * 3.0);
219
+ let streak = smoothstep(0.35, 0.6, fract(ang / 3.14159 * streakCount + 0.5)) * pow(1.0 - r, 3.0);
220
+ // Concentric halos / chromatic rings
221
+ let rings = (0.5 + 0.5 * sin(r * 40.0 - time * 2.0)) * dens;
222
+ let core = smoothstep(0.25, 0.0, r);
223
+ let chroma = mix(cA, cB, 0.5 + 0.5 * cos(ang * 3.0 + r * 30.0));
224
+ let a = clamp((core * 0.9 + streak * 0.5 * dens + rings * 0.15 * (1.0 - r)) * inten, 0.0, 1.0);
225
+ return vec4<f32>(chroma, a);
226
+ }
227
+
228
+ fn fxLightning(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
229
+ // Periodic bolt striking vertically, flickering briefly
230
+ let period = mix(4.0, 0.6, clamp(dens, 0.0, 1.0));
231
+ let cycle = fract(time / period);
232
+ let flashWindow = mix(0.05, 0.35, clamp(dens, 0.0, 1.0));
233
+ let flash = smoothstep(flashWindow, 0.0, cycle);
234
+
235
+ let tFlicker = floor(time * 60.0);
236
+ let flickerVal = tFlicker - 10000.0 * floor(tFlicker / 10000.0);
237
+ let flicker = step(hash1(flickerVal * 1.7), 0.8); // rapid on/off shimmer
238
+
239
+ // Jitter a vertical bolt with per-row hashes and interpolate between rows
240
+ let rows = 18.0 * scl;
241
+ let rg = p.y * rows;
242
+ let row = floor(rg);
243
+ let fr = fract(rg);
244
+
245
+ let tLightning = floor(time * 24.0);
246
+ let lightningVal = tLightning - 10000.0 * floor(tLightning / 10000.0);
247
+ let x0 = 0.3 + 0.4 * hash1(row * 13.7 + lightningVal * 3.1);
248
+ let x1 = 0.3 + 0.4 * hash1((row + 1.0) * 13.7 + lightningVal * 3.1);
249
+ let boltX = mix(x0, x1, fr);
250
+
251
+ // Secondary tiny forks
252
+ let forkDrift = (hash1(row * 7.3) - 0.5) * 0.12 * smoothstep(0.0, 0.6, 1.0 - p.y);
253
+ let boltDist = abs(p.x - (boltX + forkDrift)) * scl;
254
+ let core = smoothstep(0.012, 0.0, boltDist);
255
+ let glow = smoothstep(0.07, 0.0, boltDist) * 0.5;
256
+ let a = clamp((core + glow) * flash * flicker * inten, 0.0, 1.0);
257
+ let col = mix(cA, cB, clamp(boltDist * 8.0, 0.0, 1.0) + 0.3 * flash);
258
+ // Soft ambient flash behind the bolt
259
+ let amb = smoothstep(0.35, 0.0, length(p - vec2<f32>(boltX, p.y)) * scl) * flash * 0.15;
260
+ return vec4<f32>(col * (1.0 + amb), clamp(a + amb, 0.0, 1.0));
261
+ }
262
+
263
+ fn fxEnergyBeam(p: vec2<f32>, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
264
+ let src = vec2<f32>(0.15, 0.5);
265
+ let dirv = vec2<f32>(1.0, 0.0);
266
+ let w = p - src;
267
+ let along = dot(w, dirv) * scl;
268
+ let perp = dot(w, vec2<f32>(-dirv.y, dirv.x)) * scl;
269
+ let beamWidth = 0.01 + 0.03 * dens;
270
+ let glowWidth = 0.05 + 0.1 * dens;
271
+ let core = smoothstep(beamWidth, 0.0, abs(perp));
272
+ let glow = smoothstep(glowWidth, 0.0, abs(perp)) * 0.4 * dens;
273
+ let falloff = smoothstep(0.0, 1.0, along);
274
+ let pulse = 0.7 + 0.3 * sin(along * 30.0 - time * 10.0);
275
+ let a = clamp((core + glow) * falloff * pulse * inten, 0.0, 1.0);
276
+ let col = mix(cA, cB, clamp(along, 0.0, 1.0));
277
+ return vec4<f32>(col * (1.0 + glow * 2.0), a);
278
+ }
279
+
280
+ fn fxAurora(p: vec2<f32>, seedOff: f32, time: f32, scl: f32, dens: f32, inten: f32, cA: vec3<f32>, cB: vec3<f32>) -> vec4<f32> {
281
+ // Northern lights: curtains hanging from a wavy band across the upper sky,
282
+ // rippling sideways, with fine vertical rays. cA at the base, cB at the top.
283
+ var acc = vec3<f32>(0.0);
284
+ var keep = 1.0;
285
+ for (var k = 0; k < 3; k++) {
286
+ let fk = f32(k);
287
+ let x = p.x * (1.0 + fk * 0.35) * scl * 1.5 + seedOff * 13.0 + fk * 3.1;
288
+ // Curtain base line, a slow wave across the frame.
289
+ let base = 0.42 + fk * 0.06 + 0.12 * (fbm(vec2<f32>(x * 1.3, time * 0.05 + fk), 3) - 0.5)
290
+ + 0.05 * sin(x * 4.0 + time * 0.3 + fk);
291
+ let h = 0.38 + 0.2 * fbm(vec2<f32>(x * 2.0 + 7.0, time * 0.04), 3);
292
+ let d = base - p.y; // 0 at the base, rising upward
293
+ let body = smoothstep(-0.06, 0.035, d) * pow(1.0 - smoothstep(0.0, h, d), 1.5);
294
+ // Vertical rays drifting sideways.
295
+ let rn = fbm(vec2<f32>(x * 40.0 + time * 0.3, d * 2.0 - time * 0.1), 3);
296
+ let rays = 0.25 + 1.2 * rn * rn;
297
+ let fold = 0.6 + 0.4 * sin(x * 9.0 + time * 0.5 + fbm(vec2<f32>(x * 3.0, time * 0.1), 2) * 6.0);
298
+ let a = body * rays * fold * (1.0 - fk * 0.25);
299
+ let col = mix(cA, cB, clamp(d / max(h, 1e-3), 0.0, 1.0));
300
+ acc += col * a;
301
+ keep *= 1.0 - clamp(a, 0.0, 1.0);
302
+ }
303
+ let alpha = 1.0 - keep;
304
+ let a = clamp(alpha * (0.35 + 0.65 * dens) * inten * 1.4, 0.0, 1.0);
305
+ return vec4<f32>(acc / max(alpha, 1e-3) * min(alpha * 2.0, 1.0), a);
306
+ }
307
+
308
+ // ---- main dispatch ---------------------------------------------------------
309
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
310
+ let density = get_field(u.density, u.hasSigDensity, densityTex, signalSamp);
311
+ let scale = get_field(u.scale, u.hasSigScale, scaleTex, signalSamp);
312
+ let speed = get_field(u.speed, u.hasSigSpeed, speedTex, signalSamp);
313
+ let intensity = get_field(u.intensity, u.hasSigIntensity, intensityTex, signalSamp);
314
+ let seed = get_field(u.seed, u.hasSigSeed, seedTex, signalSamp);
315
+
316
+ let isVideo = u.outputType > 0.5;
317
+ let time = select(0.0, u.time * max(speed, 1e-4), isVideo);
318
+ let seedOff = fract(seed * 1.618033);
319
+
320
+ // Aspect correction
321
+ let uv = in.uv;
322
+ let p = vec2<f32>(uv.x, uv.y);
323
+
324
+ // Move to a seed-scrambled space so different seeds look different
325
+ let sp = p + vec2<f32>(seedOff * 17.0, seedOff * 31.0);
326
+
327
+ var eff = vec4<f32>(0.0, 0.0, 0.0, 0.0);
328
+ let cA = u.colorStart.rgb;
329
+ let cB = u.colorEnd.rgb;
330
+ let scl = max(scale, 1e-4);
331
+ let factor = scl * 100.0;
332
+
333
+ if (u.effectType < 0.5) {
334
+ eff = fxSmoke(sp, time, factor, density, intensity, cA, cB);
335
+ } else if (u.effectType < 1.5) {
336
+ eff = fxFire(sp, time, factor, density, intensity, cA, cB);
337
+ } else if (u.effectType < 2.5) {
338
+ eff = fxRain(sp, time, factor, density, intensity, cA, cB);
339
+ } else if (u.effectType < 3.5) {
340
+ eff = fxSparks(sp, time, factor, density, intensity, cA, cB);
341
+ } else if (u.effectType < 4.5) {
342
+ eff = fxSnow(sp, time, factor, density, intensity, cA, cB);
343
+ } else if (u.effectType < 5.5) {
344
+ eff = fxDust(sp, time, factor, density, intensity, cA, cB);
345
+ } else if (u.effectType < 6.5) {
346
+ eff = fxLightning(sp, time, factor, density, intensity, cA, cB);
347
+ } else if (u.effectType < 7.5) {
348
+ eff = fxMagic(sp, time, factor, density, intensity, cA, cB);
349
+ } else if (u.effectType < 8.5) {
350
+ eff = fxLensFlare(sp, time, factor, density, intensity, cA, cB);
351
+ } else if (u.effectType < 9.5) {
352
+ eff = fxEmbers(sp, time, factor, density, intensity, cA, cB);
353
+ } else if (u.effectType < 10.5) {
354
+ eff = fxEnergyBeam(sp, time, factor, density, intensity, cA, cB);
355
+ } else {
356
+ eff = fxAurora(p, seedOff, time, factor, density, intensity, cA, cB);
357
+ }
358
+
359
+ // Straight alpha is fine for compositing onto a transparent canvas.
360
+ let a = clamp(eff.a, 0.0, 1.0);
361
+ return vec4<f32>(clamp(eff.rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * a, a);
362
+ }
363
+ `,e=new Float32Array(24),N=T(l=>({uniformLayout:F(l,["uniform"]),signalsLayout:V(l,5),pipelineCache:new Map}));function q(l,t){let s=N(l),i=`procedural_vfx_${t}`,a=s.pipelineCache.get(i);if(!a){let c=l.createShaderModule({label:`procedural_vfx_${t}.wgsl`,code:z});a=D(l,{label:`ProceduralVFXPipeline_${t}`,module:c,layouts:[s.uniformLayout,s.signalsLayout],format:t}),s.pipelineCache.set(i,a)}return{vfxPipeline:a,uniformLayout:s.uniformLayout,signalsLayout:s.signalsLayout}}function _(l){let t=l.replace("#","");(t.length===3||t.length===4)&&(t=t.split("").map(r=>r+r).join(""));let s=parseInt(t.substring(0,2),16)/255,i=parseInt(t.substring(2,4),16)/255,a=parseInt(t.substring(4,6),16)/255,c=1;return t.length===8&&(c=parseInt(t.substring(6,8),16)/255),[s,i,a,c]}var $={Smoke:0,Fire:1,Rain:2,Sparks:3,Snow:4,Dust:5,Lightning:6,Magic:7,LensFlare:8,Embers:9,EnergyBeam:10,Aurora:11},I=async l=>{let{ctx:t,encoder:s,pass:i,targetWidth:a,targetHeight:c,props:r}=l,n=r.virtualMedia?.operation;if(n?.op!=="ProceduralVFX"||!n)return;let{vfxPipeline:P,uniformLayout:X,signalsLayout:R}=q(t.device,t.renderer.format),w=r.frame??0,S=r.fps||30,g=o(n,"density",.6),h=o(n,"scale",.01),v=o(n,"speed",1),y=o(n,"intensity",.8),x=o(n,"seed",1234),G=$[n.effectType??"Smoke"]??0,E=n.outputType==="Video"?1:0,{elapsedSeconds:B,durationSeconds:U}=L(r,w,S),d=_(n.colorStart??"#ffffff"),m=_(n.colorEnd??"#ff5500");e[0]=G,e[1]=E,e[2]=B,e[3]=0,e[4]=g.value,e[5]=h.value,e[6]=v.value,e[7]=y.value,e[8]=x.value,e[9]=g.hasSignal?1:0,e[10]=h.hasSignal?1:0,e[11]=v.hasSignal?1:0,e[12]=y.hasSignal?1:0,e[13]=x.hasSignal?1:0,e[14]=0,e[15]=0,e[16]=d[0],e[17]=d[1],e[18]=d[2],e[19]=d[3],e[20]=m[0],e[21]=m[1],e[22]=m[2],e[23]=m[3];let W=t.renderer.getTemporaryBuffer(e),C=[{name:"density",info:g},{name:"scale",info:h},{name:"speed",info:v},{name:"intensity",info:y},{name:"seed",info:x}],f=[],M=t.renderer.samplerCache.getSampler(t.device);for(let p of C)if(!!(p.info.hasSignal&&p.info.sd)){let O=b.getOrCreate2DTextureView(t.device,s,p.info.sd?.nodeId??`procedural_vfx_${p.name}_sig`,B,U,p.info.sd,a,c,r.renderId,w,S);f.push(O)}else f.push(b.getDummy1x1TextureView(t.device));i.setPipeline(P),i.setBindGroup(0,t.device.createBindGroup({layout:X,entries:[{binding:0,resource:{buffer:W}}]})),i.setBindGroup(1,t.device.createBindGroup({layout:R,entries:[{binding:0,resource:f[0]},{binding:1,resource:f[1]},{binding:2,resource:f[2]},{binding:3,resource:f[3]},{binding:4,resource:f[4]},{binding:5,resource:M}]})),i.draw(4)};var ne=A({WebGPURenderer:I});export{I as ProceduralVFXWebGPURenderer,ne as default};
@@ -0,0 +1,82 @@
1
+ import{a as P,d as T,f as U,h as R,j as k,m as G}from"./chunk-ENKKLU7B.mjs";import"./chunk-6YJP57MZ.mjs";import{z as S}from"./chunk-63SFBHEH.mjs";import{e as s}from"./chunk-BVF64D6H.mjs";s();s();var p="Toon",D=12,$=[`struct U { v : array<vec4<f32>, 3> };
2
+ @group(0) @binding(0) var<uniform> u : U;
3
+ @group(0) @binding(1) var src : texture_2d<f32>;
4
+ @group(0) @binding(2) var prev : texture_2d<f32>;
5
+ @group(0) @binding(3) var samp : sampler;
6
+ ${P}
7
+
8
+ fn straight(c : vec4<f32>) -> vec4<f32> {
9
+ if (c.a <= 0.0001) { return vec4<f32>(0.0); }
10
+ return vec4<f32>(c.rgb / c.a, c.a);
11
+ }
12
+ fn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }
13
+ fn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }
14
+ /** Straight-alpha color of the layer at a uv (filtered). */
15
+ fn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }
16
+ /** Premultiplied color of the layer at a uv (filtered). */
17
+ fn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }
18
+ /** Straight-alpha color of the layer's texel at a pixel position (nearest). */
19
+ fn texelS(p : vec2<f32>) -> vec4<f32> {
20
+ let d = vec2<i32>(textureDimensions(src));
21
+ let q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));
22
+ return straight(textureLoad(src, q, 0));
23
+ }
24
+ fn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }
25
+ fn hash12(p : vec2<f32>) -> f32 {
26
+ var p3 = fract(vec3<f32>(p.xyx) * 0.1031);
27
+ p3 += dot(p3, p3.yzx + 33.33);
28
+ return fract((p3.x + p3.y) * p3.z);
29
+ }
30
+ fn vnoise(p : vec2<f32>) -> f32 {
31
+ let i = floor(p);
32
+ let f = fract(p);
33
+ let u = f * f * (3.0 - 2.0 * f);
34
+ return mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),
35
+ mix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);
36
+ }
37
+ /** 8x8 ordered-dither threshold, 0..1. */
38
+ fn bayer8(p : vec2<f32>) -> f32 {
39
+ let x = u32(p.x) & 7u;
40
+ let y = u32(p.y) & 7u;
41
+ var v = 0u;
42
+ for (var k = 0u; k < 3u; k++) {
43
+ let bx = (x >> k) & 1u;
44
+ let by = (y >> k) & 1u;
45
+ let m = ((bx ^ by) << 1u) | by;
46
+ v += m * (1u << (2u * (2u - k)));
47
+ }
48
+ return (f32(v) + 0.5) / 64.0;
49
+ }
50
+ fn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }
51
+ @fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {
52
+ let time = u.v[0].x;
53
+ let frame = u.v[0].y;
54
+ let levels = u.v[1].x;
55
+ let edgeThreshold = u.v[1].y;
56
+ let edgeWidth = u.v[1].z;
57
+ let edgeColor = u.v[2];
58
+ let saturation = u.v[1].w;
59
+
60
+ let R = res();
61
+ let o = edgeWidth / R;
62
+ let c = sampleS(in.uv);
63
+ let tl = luma(sampleS(in.uv + vec2<f32>(-o.x, -o.y)).rgb);
64
+ let t = luma(sampleS(in.uv + vec2<f32>(0.0, -o.y)).rgb);
65
+ let tr = luma(sampleS(in.uv + vec2<f32>(o.x, -o.y)).rgb);
66
+ let l = luma(sampleS(in.uv + vec2<f32>(-o.x, 0.0)).rgb);
67
+ let r = luma(sampleS(in.uv + vec2<f32>(o.x, 0.0)).rgb);
68
+ let bl = luma(sampleS(in.uv + vec2<f32>(-o.x, o.y)).rgb);
69
+ let b = luma(sampleS(in.uv + vec2<f32>(0.0, o.y)).rgb);
70
+ let br = luma(sampleS(in.uv + vec2<f32>(o.x, o.y)).rgb);
71
+ let gx = (tr + 2.0 * r + br) - (tl + 2.0 * l + bl);
72
+ let gy = (bl + 2.0 * b + br) - (tl + 2.0 * t + tr);
73
+ let edge = length(vec2<f32>(gx, gy));
74
+ let ink = smoothstep(edgeThreshold, edgeThreshold * 1.5 + 0.03, edge);
75
+ let lum = luma(c.rgb);
76
+ let band = (floor(lum * levels) + 0.5) / levels;
77
+ var rgb = c.rgb * (band / max(lum, 0.001));
78
+ rgb = clamp(mix(vec3<f32>(luma(rgb)), rgb, saturation), vec3<f32>(0.0), vec3<f32>(1.0));
79
+ rgb = mix(rgb, edgeColor.rgb, ink);
80
+ return premul(vec4<f32>(rgb, max(c.a, ink * c.a)));
81
+ }
82
+ `],w=U(r=>({layout:T(r,["uniform","texture","texture","sampler"],`${p}_layout`),pipelines:new Map,sampler:r.createSampler({magFilter:"linear",minFilter:"linear",addressModeU:"clamp-to-edge",addressModeV:"clamp-to-edge"})}));function A(r,e){let t=w(r),n=t.pipelines.get(e);return n||(n=$.map((m,l)=>{let i=r.createShaderModule({code:m,label:`${p}_${l}.wgsl`});return r.createRenderPipeline({label:`${p}_${l}`,layout:r.createPipelineLayout({bindGroupLayouts:[t.layout]}),vertex:{module:i,entryPoint:"vs"},fragment:{module:i,entryPoint:"fs",targets:[{format:e}]},primitive:{topology:"triangle-strip"}})}),t.pipelines.set(e,n)),n}function f(r,e){let t=typeof r=="number"?r:Number(r);return Number.isFinite(t)?t:e}function C(r){let e=r.trim().replace("#","");(e.length===3||e.length===4)&&(e=[...e].map(n=>n+n).join(""));let t=n=>Number.parseInt(e.slice(n,n+2),16)/255;return[t(0),t(2),t(4),e.length>=8?t(6):1]}function V(r,e,t,n){e.fill(0),e[0]=t,e[1]=n,e[4]=f(r.levels,4),e[5]=f(r.edgeThreshold,.2),e[6]=f(r.edgeWidth,1),e.set(C(String(r.edgeColor??"#111111")),8),e[7]=f(r.saturation,1.15)}var F=async r=>{let{ctx:e,encoder:t,pass:n,targetTexture:m,targetWidth:l,targetHeight:i,props:o}=r,u=o.virtualMedia?.operation;if(u?.op!==p)return;let b=o.virtualMedia?.children?.[0];if(!b)return;n.end();let v=o.fps||30,a=Math.round(o.compositionFrame??o.frame??0),L=u.effect?.resolveUniforms?u.effect.resolveUniforms({frame:a,fps:v,time:a/v}):u,x=new Float32Array(D);V(L,x,a/v,a);let{texture:d}=await R(r,b),g=e.device,h=w(g),W=A(g,e.renderer.format),M=e.renderer.getTemporaryBuffer(x),c=d;for(let _ of W){let y=e.renderer.getTemporaryTexture(l,i,[d,c,m,...o.excludeTextures||[]]);G(t,y.createView(),_,[g.createBindGroup({layout:h.layout,entries:[{binding:0,resource:{buffer:M}},{binding:1,resource:d.createView()},{binding:2,resource:c.createView()},{binding:3,resource:h.sampler}]})]),c=y}k(r,c)};var I=S({WebGPURenderer:F});export{F as ToonWebGPURenderer,I as default};