framefields 2.13.1 → 2.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (288) hide show
  1. package/dist/audio/index.d.mts +5 -5
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-C4B9p_yq.d.mts → audio-CdCuGK5d.d.mts} +3 -3
  4. package/dist/{audio-C4B9p_yq.d.mts.map → audio-CdCuGK5d.d.mts.map} +1 -1
  5. package/dist/{audio-DIvi6hTD.mjs → audio-DFwRbID_.mjs} +3 -3
  6. package/dist/{audio-DIvi6hTD.mjs.map → audio-DFwRbID_.mjs.map} +1 -1
  7. package/dist/cli/check-worker.mjs +43 -43
  8. package/dist/components/index.d.mts +13 -13
  9. package/dist/components/index.mjs +42 -42
  10. package/dist/{dist-DtPPPsZV.mjs → dist--Uu5bQ_6.mjs} +557 -212
  11. package/dist/dist--Uu5bQ_6.mjs.map +1 -0
  12. package/dist/{dist-CCrYOkcc.mjs → dist-B8Nby2CU.mjs} +2 -2
  13. package/dist/{dist-CCrYOkcc.mjs.map → dist-B8Nby2CU.mjs.map} +1 -1
  14. package/dist/effects/index.d.mts +5 -5
  15. package/dist/effects/index.mjs +34 -34
  16. package/dist/{effects-B-L3rLs6.mjs → effects-WMgv8ZaD.mjs} +2 -2
  17. package/dist/{effects-B-L3rLs6.mjs.map → effects-WMgv8ZaD.mjs.map} +1 -1
  18. package/dist/fonts/index.mjs +2 -2
  19. package/dist/{fonts-k5ll8NTE.mjs → fonts-OW3yAfO5.mjs} +2 -2
  20. package/dist/{fonts-k5ll8NTE.mjs.map → fonts-OW3yAfO5.mjs.map} +1 -1
  21. package/dist/{gpu-D2HT3KcE.mjs → gpu-R4T2Tndu.mjs} +2 -2
  22. package/dist/{gpu-D2HT3KcE.mjs.map → gpu-R4T2Tndu.mjs.map} +1 -1
  23. package/dist/{index-CtKUQ2VG.d.mts → index-9xte4JgL.d.mts} +109 -60
  24. package/dist/index-9xte4JgL.d.mts.map +1 -0
  25. package/dist/{index-BGlaws7-.d.mts → index-B0Vq8Bwf.d.mts} +3 -3
  26. package/dist/{index-BGlaws7-.d.mts.map → index-B0Vq8Bwf.d.mts.map} +1 -1
  27. package/dist/{index-BFTtXosj.d.mts → index-BVd6nXd5.d.mts} +2 -2
  28. package/dist/{index-BFTtXosj.d.mts.map → index-BVd6nXd5.d.mts.map} +1 -1
  29. package/dist/{index-CnZhBlob.d.mts → index-Bv7gxGK1.d.mts} +2 -2
  30. package/dist/{index-CnZhBlob.d.mts.map → index-Bv7gxGK1.d.mts.map} +1 -1
  31. package/dist/{index-a6JrbAK0.d.mts → index-C-V6CAhP.d.mts} +32 -2
  32. package/dist/index-C-V6CAhP.d.mts.map +1 -0
  33. package/dist/{index-DQ1U3HC3.d.mts → index-C7-p9zwU.d.mts} +3 -3
  34. package/dist/{index-DQ1U3HC3.d.mts.map → index-C7-p9zwU.d.mts.map} +1 -1
  35. package/dist/{index-rtCXNxGO.d.mts → index-CEKxvGY-.d.mts} +2 -2
  36. package/dist/{index-rtCXNxGO.d.mts.map → index-CEKxvGY-.d.mts.map} +1 -1
  37. package/dist/{index-C2yaponf.d.mts → index-CRaydvLi.d.mts} +28 -9
  38. package/dist/index-CRaydvLi.d.mts.map +1 -0
  39. package/dist/{index-DBh3WphX.d.mts → index-D1FqV1eu.d.mts} +2 -2
  40. package/dist/{index-DBh3WphX.d.mts.map → index-D1FqV1eu.d.mts.map} +1 -1
  41. package/dist/{index-ByhlTwxh.d.mts → index-DoP6EiHj.d.mts} +5 -5
  42. package/dist/{index-ByhlTwxh.d.mts.map → index-DoP6EiHj.d.mts.map} +1 -1
  43. package/dist/{index-B08eSpaI.d.mts → index-GA9_Z8Fn.d.mts} +2 -2
  44. package/dist/{index-B08eSpaI.d.mts.map → index-GA9_Z8Fn.d.mts.map} +1 -1
  45. package/dist/index.d.mts +14 -14
  46. package/dist/index.mjs +50 -50
  47. package/dist/preview/index.d.mts +5 -5
  48. package/dist/preview/index.mjs +10 -10
  49. package/dist/{preview-lHH8Tv4j.mjs → preview-D7BGmE1E.mjs} +3 -3
  50. package/dist/{preview-lHH8Tv4j.mjs.map → preview-D7BGmE1E.mjs.map} +1 -1
  51. package/dist/preview-engine/{chunk-XCPRRMMW.mjs → chunk-5DZTPUMH.mjs} +195 -89
  52. package/dist/preview-engine/chunk-GNDE3OXQ.mjs +5 -0
  53. package/dist/preview-engine/{chunk-N3XTDAL6.mjs → chunk-UPZURPJY.mjs} +31 -31
  54. package/dist/preview-engine/components.mjs +1 -1
  55. package/dist/preview-engine/framefields.mjs +1 -1
  56. package/dist/preview-engine/player.mjs +1 -1
  57. package/dist/preview-engine/renderers-DLJOA3BM.mjs +228 -0
  58. package/dist/{program-BfiB9ttP.mjs → program-tFKCWU2j.mjs} +96 -12
  59. package/dist/program-tFKCWU2j.mjs.map +1 -0
  60. package/dist/renderer/index.d.mts +4 -4
  61. package/dist/renderer/index.mjs +2 -2
  62. package/dist/{renderer-CU6WT5jW.mjs → renderer-03mYJLgX.mjs} +3 -3
  63. package/dist/{renderer-CU6WT5jW.mjs.map → renderer-03mYJLgX.mjs.map} +1 -1
  64. package/dist/{renderer-BmyFfvVA.mjs → renderer-0rveCDm-.mjs} +3 -3
  65. package/dist/{renderer-BmyFfvVA.mjs.map → renderer-0rveCDm-.mjs.map} +1 -1
  66. package/dist/{renderer-QbSrnPZU.mjs → renderer-2PjR3w-q.mjs} +3 -3
  67. package/dist/{renderer-QbSrnPZU.mjs.map → renderer-2PjR3w-q.mjs.map} +1 -1
  68. package/dist/{renderer-BZMh2io2.mjs → renderer-47y12Z37.mjs} +2 -2
  69. package/dist/{renderer-BZMh2io2.mjs.map → renderer-47y12Z37.mjs.map} +1 -1
  70. package/dist/renderer-6_bzbbXt.mjs +5 -0
  71. package/dist/renderer-8M-9G6F_.mjs +5 -0
  72. package/dist/{renderer-CHCRcCKw.mjs → renderer-B0yVUOPP.mjs} +2 -2
  73. package/dist/{renderer-CHCRcCKw.mjs.map → renderer-B0yVUOPP.mjs.map} +1 -1
  74. package/dist/renderer-B5OzKvF8.mjs +5 -0
  75. package/dist/{renderer-CldjJmRR.mjs → renderer-B7G1KohJ.mjs} +2 -2
  76. package/dist/renderer-BBCZ2qbE.mjs +5 -0
  77. package/dist/{renderer-Y1kjtOto.mjs → renderer-BBMtmxks.mjs} +3 -3
  78. package/dist/{renderer-Y1kjtOto.mjs.map → renderer-BBMtmxks.mjs.map} +1 -1
  79. package/dist/renderer-BChbxCux.mjs +5 -0
  80. package/dist/{renderer-CdXBRdFf.mjs → renderer-BDzn1AKF.mjs} +2 -2
  81. package/dist/{renderer-CdXBRdFf.mjs.map → renderer-BDzn1AKF.mjs.map} +1 -1
  82. package/dist/renderer-BGeMPr8C.mjs +5 -0
  83. package/dist/{renderer-CSu_vYPn.mjs → renderer-BGp0An5A.mjs} +3 -3
  84. package/dist/{renderer-CSu_vYPn.mjs.map → renderer-BGp0An5A.mjs.map} +1 -1
  85. package/dist/{renderer-BZX932Lj.mjs → renderer-BH7UCMPQ.mjs} +2 -2
  86. package/dist/{renderer-BZX932Lj.mjs.map → renderer-BH7UCMPQ.mjs.map} +1 -1
  87. package/dist/{renderer-fG8Jy8Rx.d.mts → renderer-BHYJlK6H.d.mts} +2 -2
  88. package/dist/{renderer-fG8Jy8Rx.d.mts.map → renderer-BHYJlK6H.d.mts.map} +1 -1
  89. package/dist/{renderer-D-mX1EVA.mjs → renderer-BJ8ea92W.mjs} +3 -3
  90. package/dist/{renderer-D-mX1EVA.mjs.map → renderer-BJ8ea92W.mjs.map} +1 -1
  91. package/dist/{renderer-B6bK9rXm.mjs → renderer-BOSZAdgF.mjs} +2 -2
  92. package/dist/{renderer-B6bK9rXm.mjs.map → renderer-BOSZAdgF.mjs.map} +1 -1
  93. package/dist/renderer-BPQ8Pkjb.mjs +5 -0
  94. package/dist/renderer-BTRpA3HD.mjs +5 -0
  95. package/dist/{renderer-Dv_iRIyx.mjs → renderer-BVIXKfbC.mjs} +121 -105
  96. package/dist/renderer-BVIXKfbC.mjs.map +1 -0
  97. package/dist/{renderer-D0xM67cK.mjs → renderer-BVU22lBS.mjs} +2 -2
  98. package/dist/{renderer-D0xM67cK.mjs.map → renderer-BVU22lBS.mjs.map} +1 -1
  99. package/dist/renderer-BVsECSn-.mjs +5 -0
  100. package/dist/{renderer-HKv5cBdp.mjs → renderer-BWSRryIA.mjs} +2 -2
  101. package/dist/{renderer-HKv5cBdp.mjs.map → renderer-BWSRryIA.mjs.map} +1 -1
  102. package/dist/{renderer-D0h1hTOo.mjs → renderer-BacY4nh8.mjs} +2 -2
  103. package/dist/{renderer-D0h1hTOo.mjs.map → renderer-BacY4nh8.mjs.map} +1 -1
  104. package/dist/{renderer-D_m6Qbsi.mjs → renderer-Baw6Utxi.mjs} +2 -2
  105. package/dist/{renderer-D_m6Qbsi.mjs.map → renderer-Baw6Utxi.mjs.map} +1 -1
  106. package/dist/{renderer-CQ4h8n7p.mjs → renderer-Bcu3UrI-.mjs} +3 -3
  107. package/dist/{renderer-CQ4h8n7p.mjs.map → renderer-Bcu3UrI-.mjs.map} +1 -1
  108. package/dist/{renderer-yNWYqvvq.mjs → renderer-BeNl_6EG.mjs} +2 -2
  109. package/dist/{renderer-yNWYqvvq.mjs.map → renderer-BeNl_6EG.mjs.map} +1 -1
  110. package/dist/{renderer-pn52dzZz.mjs → renderer-BfZNIiSv.mjs} +2 -2
  111. package/dist/{renderer-pn52dzZz.mjs.map → renderer-BfZNIiSv.mjs.map} +1 -1
  112. package/dist/renderer-Bgos68gc.mjs +6 -0
  113. package/dist/{renderer-C64_B8It.mjs → renderer-BjDddtw9.mjs} +2 -2
  114. package/dist/renderer-BjHOvoqO.mjs +5 -0
  115. package/dist/renderer-BjXMPPlV.mjs +5 -0
  116. package/dist/{renderer-C98XwEIr.mjs → renderer-BpVOk9ux.mjs} +2 -2
  117. package/dist/{renderer-C98XwEIr.mjs.map → renderer-BpVOk9ux.mjs.map} +1 -1
  118. package/dist/{renderer-7xQmXXMH.mjs → renderer-Bpm145BW.mjs} +3 -3
  119. package/dist/{renderer-7xQmXXMH.mjs.map → renderer-Bpm145BW.mjs.map} +1 -1
  120. package/dist/{renderer-_J9JcCMR.mjs → renderer-Brmbl12Y.mjs} +3 -3
  121. package/dist/{renderer-_J9JcCMR.mjs.map → renderer-Brmbl12Y.mjs.map} +1 -1
  122. package/dist/renderer-Byobxqkv.mjs +5 -0
  123. package/dist/{renderer-B3un4Pdi.mjs → renderer-C20efMI0.mjs} +3 -3
  124. package/dist/{renderer-B3un4Pdi.mjs.map → renderer-C20efMI0.mjs.map} +1 -1
  125. package/dist/{renderer-Cfx_FCSf.mjs → renderer-C5AoaymD.mjs} +3 -3
  126. package/dist/{renderer-Cfx_FCSf.mjs.map → renderer-C5AoaymD.mjs.map} +1 -1
  127. package/dist/{renderer-DWYmJSrl.mjs → renderer-CCxk-RJR.mjs} +2 -2
  128. package/dist/{renderer-DWYmJSrl.mjs.map → renderer-CCxk-RJR.mjs.map} +1 -1
  129. package/dist/{renderer-DhGZ41hQ.mjs → renderer-CKo7VR8x.mjs} +3 -3
  130. package/dist/{renderer-DhGZ41hQ.mjs.map → renderer-CKo7VR8x.mjs.map} +1 -1
  131. package/dist/renderer-CKrsg3EG.mjs +5 -0
  132. package/dist/{renderer-BIKkxw_Z.mjs → renderer-COgwYqev.mjs} +3 -3
  133. package/dist/{renderer-BIKkxw_Z.mjs.map → renderer-COgwYqev.mjs.map} +1 -1
  134. package/dist/{renderer-uzU6dsdR.mjs → renderer-CP108ABB.mjs} +2 -2
  135. package/dist/{renderer-uzU6dsdR.mjs.map → renderer-CP108ABB.mjs.map} +1 -1
  136. package/dist/{renderer-Cv9CKKWG.mjs → renderer-CP8wLzTU.mjs} +2 -2
  137. package/dist/{renderer-Cv9CKKWG.mjs.map → renderer-CP8wLzTU.mjs.map} +1 -1
  138. package/dist/{renderer-uER8kn7f.mjs → renderer-CT3zkfbf.mjs} +2 -2
  139. package/dist/{renderer-uER8kn7f.mjs.map → renderer-CT3zkfbf.mjs.map} +1 -1
  140. package/dist/{renderer-DNynPM6X.mjs → renderer-Ca1KjNCO.mjs} +2 -2
  141. package/dist/{renderer-DNynPM6X.mjs.map → renderer-Ca1KjNCO.mjs.map} +1 -1
  142. package/dist/renderer-Cj875NuH.mjs +5 -0
  143. package/dist/{renderer-BsrKj6Td.mjs → renderer-Cm0tsbQH.mjs} +2 -2
  144. package/dist/{renderer-BsrKj6Td.mjs.map → renderer-Cm0tsbQH.mjs.map} +1 -1
  145. package/dist/renderer-CnmzJoMv.mjs +5 -0
  146. package/dist/{renderer-Dm57W73p.mjs → renderer-Cqb7PGrI.mjs} +2 -2
  147. package/dist/{renderer-BTwuM9u-.mjs → renderer-CrxwW6VQ.mjs} +3 -3
  148. package/dist/{renderer-BTwuM9u-.mjs.map → renderer-CrxwW6VQ.mjs.map} +1 -1
  149. package/dist/renderer-CtklDaMg.mjs +5 -0
  150. package/dist/{renderer-TfeohPxt.mjs → renderer-Cw6_NL2i.mjs} +3 -3
  151. package/dist/{renderer-TfeohPxt.mjs.map → renderer-Cw6_NL2i.mjs.map} +1 -1
  152. package/dist/{renderer-B10HDC13.mjs → renderer-D-KHHWQD.mjs} +3 -3
  153. package/dist/{renderer-B10HDC13.mjs.map → renderer-D-KHHWQD.mjs.map} +1 -1
  154. package/dist/{renderer-CO9vE3sd.mjs → renderer-D-RhYvVl.mjs} +2 -2
  155. package/dist/{renderer-CO9vE3sd.mjs.map → renderer-D-RhYvVl.mjs.map} +1 -1
  156. package/dist/renderer-D1tK3in_.mjs +5 -0
  157. package/dist/{renderer-BEhZiOT4.mjs → renderer-D2wNFNRf.mjs} +2 -2
  158. package/dist/{renderer-BEhZiOT4.mjs.map → renderer-D2wNFNRf.mjs.map} +1 -1
  159. package/dist/renderer-D2yc9P61.mjs +5 -0
  160. package/dist/renderer-D4v-JvSr.mjs +5 -0
  161. package/dist/renderer-D7WRWDwB.mjs +5 -0
  162. package/dist/{renderer-DzON3wDZ.mjs → renderer-DA8YEo_d.mjs} +3 -3
  163. package/dist/{renderer-DzON3wDZ.mjs.map → renderer-DA8YEo_d.mjs.map} +1 -1
  164. package/dist/{renderer-DYlx7VHo.mjs → renderer-DEjo6dw_.mjs} +2 -2
  165. package/dist/{renderer-DYlx7VHo.mjs.map → renderer-DEjo6dw_.mjs.map} +1 -1
  166. package/dist/renderer-DGvA0tdB.mjs +5 -0
  167. package/dist/{renderer-B3_GddgJ.mjs → renderer-DIEeHiQA.mjs} +2 -2
  168. package/dist/{renderer-B3_GddgJ.mjs.map → renderer-DIEeHiQA.mjs.map} +1 -1
  169. package/dist/{renderer-C4hd6Cqi.mjs → renderer-DNxWOz8Q.mjs} +2 -2
  170. package/dist/{renderer-C4hd6Cqi.mjs.map → renderer-DNxWOz8Q.mjs.map} +1 -1
  171. package/dist/renderer-DO7v5Sdm.mjs +5 -0
  172. package/dist/renderer-DRVvt7-V.mjs +5 -0
  173. package/dist/{renderer-CkTehyRX.mjs → renderer-DVPgWHZw.mjs} +3 -3
  174. package/dist/{renderer-CkTehyRX.mjs.map → renderer-DVPgWHZw.mjs.map} +1 -1
  175. package/dist/{renderer-4nsuReW2.mjs → renderer-DWq9gYRw.mjs} +3 -3
  176. package/dist/{renderer-4nsuReW2.mjs.map → renderer-DWq9gYRw.mjs.map} +1 -1
  177. package/dist/renderer-DYMCd3jL.mjs +5 -0
  178. package/dist/{renderer-DvHi_wXE.mjs → renderer-D_j1WKMD.mjs} +3 -3
  179. package/dist/{renderer-DvHi_wXE.mjs.map → renderer-D_j1WKMD.mjs.map} +1 -1
  180. package/dist/{renderer-CRhEGqW4.mjs → renderer-DcAKDAnS.mjs} +3 -3
  181. package/dist/{renderer-CRhEGqW4.mjs.map → renderer-DcAKDAnS.mjs.map} +1 -1
  182. package/dist/{renderer-DtFZbE1j.mjs → renderer-Dgj46uEU.mjs} +2 -2
  183. package/dist/{renderer-B2IUPjhw.mjs → renderer-DhyMfG1v.mjs} +3 -3
  184. package/dist/{renderer-B2IUPjhw.mjs.map → renderer-DhyMfG1v.mjs.map} +1 -1
  185. package/dist/{renderer-BvBqTAtk.mjs → renderer-Dj2H5JPR.mjs} +3 -3
  186. package/dist/{renderer-BvBqTAtk.mjs.map → renderer-Dj2H5JPR.mjs.map} +1 -1
  187. package/dist/{renderer-CoC64eam.mjs → renderer-DkOuQi84.mjs} +3 -3
  188. package/dist/{renderer-CoC64eam.mjs.map → renderer-DkOuQi84.mjs.map} +1 -1
  189. package/dist/renderer-DmHKw-MM.mjs +5 -0
  190. package/dist/renderer-DoDsuZ6G.mjs +5 -0
  191. package/dist/{renderer-BhcTYhaP.mjs → renderer-Dr0tXA4k.mjs} +3 -3
  192. package/dist/{renderer-BhcTYhaP.mjs.map → renderer-Dr0tXA4k.mjs.map} +1 -1
  193. package/dist/{renderer-BrEeUw7T.mjs → renderer-DtMVitEF.mjs} +2 -2
  194. package/dist/{renderer-BrEeUw7T.mjs.map → renderer-DtMVitEF.mjs.map} +1 -1
  195. package/dist/{renderer-BGchUBW_.mjs → renderer-Dwwnx7Dk.mjs} +2 -2
  196. package/dist/{renderer-BGchUBW_.mjs.map → renderer-Dwwnx7Dk.mjs.map} +1 -1
  197. package/dist/{renderer-zLi2qFGT.mjs → renderer-DzLrvCB2.mjs} +2 -2
  198. package/dist/{renderer-zLi2qFGT.mjs.map → renderer-DzLrvCB2.mjs.map} +1 -1
  199. package/dist/renderer-EpgclS70.mjs +5 -0
  200. package/dist/{renderer-DCrKEVjb.mjs → renderer-FYOL5Za6.mjs} +3 -3
  201. package/dist/{renderer-DCrKEVjb.mjs.map → renderer-FYOL5Za6.mjs.map} +1 -1
  202. package/dist/renderer-GroKiYyK.mjs +5 -0
  203. package/dist/{renderer-DYeNNc_G.mjs → renderer-I0Hh9cLK.mjs} +3 -3
  204. package/dist/{renderer-DYeNNc_G.mjs.map → renderer-I0Hh9cLK.mjs.map} +1 -1
  205. package/dist/renderer-MQ5K_xIS.mjs +5 -0
  206. package/dist/{renderer-BEuXJY-C.mjs → renderer-NRMlYkX6.mjs} +3 -3
  207. package/dist/{renderer-BEuXJY-C.mjs.map → renderer-NRMlYkX6.mjs.map} +1 -1
  208. package/dist/{renderer-YONlI6W-.mjs → renderer-Nnmi8Gt6.mjs} +3 -3
  209. package/dist/{renderer-YONlI6W-.mjs.map → renderer-Nnmi8Gt6.mjs.map} +1 -1
  210. package/dist/renderer-U43SflML.mjs +5 -0
  211. package/dist/renderer-UqOmBgCv.mjs +5 -0
  212. package/dist/{renderer-DiZkZ0Pr.mjs → renderer-W1bVNVR6.mjs} +3 -3
  213. package/dist/{renderer-DiZkZ0Pr.mjs.map → renderer-W1bVNVR6.mjs.map} +1 -1
  214. package/dist/renderer-XLULgJM0.mjs +5 -0
  215. package/dist/{renderer-BOlHW3Mi.mjs → renderer-ZnrEfkYh.mjs} +2 -2
  216. package/dist/{renderer-BOlHW3Mi.mjs.map → renderer-ZnrEfkYh.mjs.map} +1 -1
  217. package/dist/{renderer-GIlQ9lZq.mjs → renderer-_pC-jB9O.mjs} +2 -2
  218. package/dist/{renderer-GIlQ9lZq.mjs.map → renderer-_pC-jB9O.mjs.map} +1 -1
  219. package/dist/{renderer-BM19iK8v.mjs → renderer-iMiYStcW.mjs} +2 -2
  220. package/dist/{renderer-BM19iK8v.mjs.map → renderer-iMiYStcW.mjs.map} +1 -1
  221. package/dist/{renderer-CO4NGvAh.mjs → renderer-jUKdkmG5.mjs} +69 -69
  222. package/dist/{renderer-CO4NGvAh.mjs.map → renderer-jUKdkmG5.mjs.map} +1 -1
  223. package/dist/{renderer-mDBoz0zT.mjs → renderer-k5d7JSbs.mjs} +3 -3
  224. package/dist/{renderer-mDBoz0zT.mjs.map → renderer-k5d7JSbs.mjs.map} +1 -1
  225. package/dist/renderer-lNjxY1GG.mjs +5 -0
  226. package/dist/{renderer-CC22Djgi.mjs → renderer-nHS3Sius.mjs} +3 -3
  227. package/dist/{renderer-CC22Djgi.mjs.map → renderer-nHS3Sius.mjs.map} +1 -1
  228. package/dist/{renderer-CXrnzihz.mjs → renderer-ngmYIIob.mjs} +3 -3
  229. package/dist/{renderer-CXrnzihz.mjs.map → renderer-ngmYIIob.mjs.map} +1 -1
  230. package/dist/{renderer-Bw0O--gW.mjs → renderer-raxwsiGI.mjs} +3 -3
  231. package/dist/{renderer-Bw0O--gW.mjs.map → renderer-raxwsiGI.mjs.map} +1 -1
  232. package/dist/renderer-ukufL7pl.mjs +5 -0
  233. package/dist/renderer-wb0NCKdF.mjs +5 -0
  234. package/dist/{renderer-Bw-_GZVw.mjs → renderer-zRq0j6Xy.mjs} +3 -3
  235. package/dist/{renderer-Bw-_GZVw.mjs.map → renderer-zRq0j6Xy.mjs.map} +1 -1
  236. package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs → renderers-CP8CFWDs-CshljORp.mjs} +2 -2
  237. package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs.map → renderers-CP8CFWDs-CshljORp.mjs.map} +1 -1
  238. package/dist/sam/index.d.mts +3 -3
  239. package/dist/signals/index.d.mts +5 -5
  240. package/dist/signals/index.mjs +4 -4
  241. package/dist/{src-DrP7fGJX.mjs → src-Dy4gnc6w.mjs} +13 -8
  242. package/dist/src-Dy4gnc6w.mjs.map +1 -0
  243. package/package.json +60 -60
  244. package/dist/dist-DtPPPsZV.mjs.map +0 -1
  245. package/dist/index-C2yaponf.d.mts.map +0 -1
  246. package/dist/index-CtKUQ2VG.d.mts.map +0 -1
  247. package/dist/index-a6JrbAK0.d.mts.map +0 -1
  248. package/dist/preview-engine/chunk-5ZS46EFB.mjs +0 -5
  249. package/dist/preview-engine/renderers-ZMMQ7S2A.mjs +0 -228
  250. package/dist/program-BfiB9ttP.mjs.map +0 -1
  251. package/dist/renderer-0rLmztAv.mjs +0 -5
  252. package/dist/renderer-B0pjOXFY.mjs +0 -5
  253. package/dist/renderer-B7J13reL.mjs +0 -5
  254. package/dist/renderer-BPGIKGgl.mjs +0 -5
  255. package/dist/renderer-Bv-Artj1.mjs +0 -5
  256. package/dist/renderer-BvLjbhcL.mjs +0 -5
  257. package/dist/renderer-By6awWaf.mjs +0 -5
  258. package/dist/renderer-C0rvsz7m.mjs +0 -5
  259. package/dist/renderer-CDgud_HB.mjs +0 -5
  260. package/dist/renderer-CDiRF3bG.mjs +0 -6
  261. package/dist/renderer-CIIEQd4B.mjs +0 -5
  262. package/dist/renderer-CJblwOA9.mjs +0 -5
  263. package/dist/renderer-CNMOXtXE.mjs +0 -5
  264. package/dist/renderer-COeSeNGg.mjs +0 -5
  265. package/dist/renderer-CUfElmtZ.mjs +0 -5
  266. package/dist/renderer-CYh2lFoJ.mjs +0 -5
  267. package/dist/renderer-CYtVZYMH.mjs +0 -5
  268. package/dist/renderer-CjxZlkjb.mjs +0 -5
  269. package/dist/renderer-Cpd6TvTC.mjs +0 -5
  270. package/dist/renderer-D3ziOPhX.mjs +0 -5
  271. package/dist/renderer-DL-phtL5.mjs +0 -5
  272. package/dist/renderer-DSnmYnHg.mjs +0 -5
  273. package/dist/renderer-DUGfsT-E.mjs +0 -5
  274. package/dist/renderer-DW5af9x1.mjs +0 -5
  275. package/dist/renderer-DYMrol1t.mjs +0 -5
  276. package/dist/renderer-DekeUHaz.mjs +0 -5
  277. package/dist/renderer-Dt5uyJdZ.mjs +0 -5
  278. package/dist/renderer-Dv_iRIyx.mjs.map +0 -1
  279. package/dist/renderer-DwLQAnaK.mjs +0 -5
  280. package/dist/renderer-IXQP2CWM.mjs +0 -5
  281. package/dist/renderer-K-Pkw63O.mjs +0 -5
  282. package/dist/renderer-MPw2KH9P.mjs +0 -5
  283. package/dist/renderer-RPu8RMav.mjs +0 -5
  284. package/dist/renderer-dCqxd5N2.mjs +0 -5
  285. package/dist/renderer-lhjmE-Fp.mjs +0 -5
  286. package/dist/renderer-u9cmBuvM.mjs +0 -5
  287. package/dist/renderer-vH12jcpz.mjs +0 -5
  288. package/dist/src-DrP7fGJX.mjs.map +0 -1
@@ -16151,9 +16151,9 @@ var ShaderStore = class {
16151
16151
  getCacheKey(nodeId, renderId) {
16152
16152
  return `${renderId ?? "global"}:${nodeId}`;
16153
16153
  }
16154
- register(nodeId, shader, renderId) {
16155
- this.store.set(this.getCacheKey(nodeId, renderId), shader);
16156
- if (renderId) this.store.set(this.getCacheKey(nodeId, void 0), shader);
16154
+ register(nodeId, shader$1, renderId) {
16155
+ this.store.set(this.getCacheKey(nodeId, renderId), shader$1);
16156
+ if (renderId) this.store.set(this.getCacheKey(nodeId, void 0), shader$1);
16157
16157
  }
16158
16158
  get(nodeId, renderId) {
16159
16159
  const res = this.store.get(this.getCacheKey(nodeId, renderId));
@@ -24530,9 +24530,11 @@ function drawParagraphNode(ctx, pass, props) {
24530
24530
  scale = effect.scale;
24531
24531
  if (blurOverride === void 0) blurAmount = effect.blurAmount;
24532
24532
  }
24533
+ const isHighlighted = props.highlightWordIndex !== void 0 && glyph.wordIndex === props.highlightWordIndex;
24534
+ const spanColor = glyph.fill ? parseColor(glyph.fill) : void 0;
24535
+ let fillColor = isHighlighted ? highlightColor : spanColor ?? baseColor;
24533
24536
  let customScaleX = 1;
24534
24537
  let customScaleY = 1;
24535
- let animatorColor;
24536
24538
  let transZ = 0;
24537
24539
  let chromaticShift = 0;
24538
24540
  let dissolveProgress = 0;
@@ -24551,7 +24553,7 @@ function drawParagraphNode(ctx, pass, props) {
24551
24553
  scaleY: customScaleY,
24552
24554
  opacity,
24553
24555
  blurAmount,
24554
- color: baseColor
24556
+ color: fillColor
24555
24557
  }, false, props.frame ?? 0, props.fps ?? 24, props.signals);
24556
24558
  transX = kResult.transX;
24557
24559
  transY = kResult.transY;
@@ -24561,7 +24563,7 @@ function drawParagraphNode(ctx, pass, props) {
24561
24563
  customScaleY = kResult.scaleY;
24562
24564
  opacity = kResult.opacity;
24563
24565
  if (blurOverride === void 0) blurAmount = kResult.blurAmount;
24564
- if (kResult.color) animatorColor = kResult.color;
24566
+ if (kResult.color) fillColor = kResult.color;
24565
24567
  if (kResult.lineSpacing !== void 0) transY += computeLineLeadingDisplacement(glyph.lineIndex, layout.linesCount, kResult.lineSpacing, kResult.lineAnchor ?? 0);
24566
24568
  transZ = kResult.transZ ?? 0;
24567
24569
  chromaticShift = kResult.chromaticShift ?? 0;
@@ -24579,9 +24581,7 @@ function drawParagraphNode(ctx, pass, props) {
24579
24581
  const contentWidth = layout.glyphs.length > 0 ? layout.glyphs[layout.glyphs.length - 1].x + fontSize : props.dstRect.width;
24580
24582
  glyphX = evaluateMarqueeOffset(glyph.x, props.dstRect.width, contentWidth, props.marquee, elapsedSec);
24581
24583
  }
24582
- const isHighlighted = props.highlightWordIndex !== void 0 && glyph.wordIndex === props.highlightWordIndex;
24583
- const spanColor = glyph.fill ? parseColor(glyph.fill) : void 0;
24584
- const col = animatorColor ?? colorOverride ?? (isHighlighted ? highlightColor : spanColor ?? baseColor);
24584
+ const col = colorOverride ?? fillColor;
24585
24585
  const writeInstance = (boldShift) => {
24586
24586
  const offset = visibleCount * 24;
24587
24587
  const fontScale = glyph.fontScale ?? fontSize / targetFont.unitsPerEm;
@@ -30983,8 +30983,13 @@ var BloomPipeline = class {
30983
30983
  module;
30984
30984
  pipelineLayout;
30985
30985
  sampler;
30986
- mips = [];
30987
- mipKey = "";
30986
+ /**
30987
+ * Mip chains by size and depth. Scenes with different bloom share a frame
30988
+ * (one command buffer), so a chain stays alive until the frame is done:
30989
+ * chains not used in a frame are destroyed at the next `resetPools`.
30990
+ */
30991
+ chains = /* @__PURE__ */ new Map();
30992
+ usedThisFrame = /* @__PURE__ */ new Set();
30988
30993
  placeholder;
30989
30994
  uniformPool = new BufferPool(48, GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST);
30990
30995
  constructor(device) {
@@ -31087,17 +31092,18 @@ var BloomPipeline = class {
31087
31092
  }
31088
31093
  return pipe$1;
31089
31094
  }
31090
- ensureMips(width, height, levels) {
31095
+ mipChain(width, height, levels) {
31091
31096
  const key = `${width}x${height}x${levels}`;
31092
- if (key === this.mipKey) return;
31093
- for (const t of this.mips) t.destroy();
31094
- this.mips = [];
31097
+ this.usedThisFrame.add(key);
31098
+ const cached$1 = this.chains.get(key);
31099
+ if (cached$1) return cached$1;
31100
+ const chain = [];
31095
31101
  let w = width;
31096
31102
  let h = height;
31097
31103
  for (let i = 0; i < levels; i++) {
31098
31104
  w = Math.max(1, Math.floor(w / 2));
31099
31105
  h = Math.max(1, Math.floor(h / 2));
31100
- this.mips.push(this.device.createTexture({
31106
+ chain.push(this.device.createTexture({
31101
31107
  label: `BloomMip${i}`,
31102
31108
  size: {
31103
31109
  width: w,
@@ -31108,7 +31114,8 @@ var BloomPipeline = class {
31108
31114
  }));
31109
31115
  if (w === 1 && h === 1) break;
31110
31116
  }
31111
- this.mipKey = key;
31117
+ this.chains.set(key, chain);
31118
+ return chain;
31112
31119
  }
31113
31120
  uniforms(texelW, texelH, opts) {
31114
31121
  const data = new Float32Array([
@@ -31186,8 +31193,7 @@ var BloomPipeline = class {
31186
31193
  mode: display ? 1 : 0
31187
31194
  };
31188
31195
  const levels = Math.max(1, Math.min(8, Math.round(options.radius ?? 6)));
31189
- this.ensureMips(source.width, source.height, levels);
31190
- const mips = this.mips;
31196
+ const mips = this.mipChain(source.width, source.height, levels);
31191
31197
  const u = (w, h) => this.uniforms(1 / w, 1 / h, opts);
31192
31198
  const glowSource = hdrSource ?? source;
31193
31199
  this.pass(encoder, this.prefilterPipe, mips[0].createView(), glowSource, this.placeholder, u(glowSource.width, glowSource.height), "clear");
@@ -31201,12 +31207,22 @@ var BloomPipeline = class {
31201
31207
  }
31202
31208
  this.pass(encoder, this.compositePipe(dest.format), dest.createView(), mips[0], source, u(mips[0].width, mips[0].height), "clear");
31203
31209
  }
31204
- /** Call once per frame before `apply`: recycles the per-pass uniforms. */
31210
+ /**
31211
+ * Call once per frame before `apply`: recycles the per-pass uniforms and
31212
+ * frees the mip chains the last frame did not use.
31213
+ */
31205
31214
  resetPools() {
31206
31215
  this.uniformPool.reset();
31216
+ for (const [key, chain] of this.chains) {
31217
+ if (this.usedThisFrame.has(key)) continue;
31218
+ for (const t of chain) t.destroy();
31219
+ this.chains.delete(key);
31220
+ }
31221
+ this.usedThisFrame.clear();
31207
31222
  }
31208
31223
  destroy() {
31209
- for (const t of this.mips) t.destroy();
31224
+ for (const chain of this.chains.values()) for (const t of chain) t.destroy();
31225
+ this.chains.clear();
31210
31226
  this.placeholder.destroy();
31211
31227
  this.uniformPool.destroy();
31212
31228
  }
@@ -31595,15 +31611,56 @@ struct Shaded {
31595
31611
  hdr : vec3<f32>,
31596
31612
  };
31597
31613
 
31614
+ // Two-sided, art-directed diffuse lighting. Shares the full direct-light
31615
+ // storage, range/spot attenuation and PCF shadows with the physical renderer.
31616
+ fn shadeToon(worldPos: vec3<f32>, worldNormal: vec3<f32>, base: vec3<f32>, ambient: f32, shade: vec4<f32>, lightTint: vec4<f32>, params: vec4<f32>) -> vec3<f32> {
31617
+ if (lights.params.y < 0.5) { return base; }
31618
+ var N = normalize(worldNormal);
31619
+ let V = normalize(cam.cameraPos.xyz - worldPos);
31620
+ if (dot(N, V) < 0.0) { N = -N; }
31621
+ var illumination = lights.ambientColor.rgb * ambient * lightTint.rgb;
31622
+ var visibility = clamp(max(illumination.r, max(illumination.g, illumination.b)), 0.0, 1.0);
31623
+ for (var i = 0; i < i32(lights.params.x); i++) {
31624
+ let ls = sampleLight(i, worldPos);
31625
+ if (!ls.valid) { continue; }
31626
+ let cosine = dot(N, ls.L);
31627
+ let softness = max(params.x, 0.0001);
31628
+ let band = smoothstep(lightTint.w - softness * 0.5, lightTint.w + softness * 0.5, cosine);
31629
+ let light = directLights[i];
31630
+ let strength = band * ls.attenuation * light.colorIntensity.w * shadowFactor(worldPos, N, i);
31631
+ let contribution = light.colorIntensity.rgb * lightTint.rgb * strength * mix(1.0, max(cosine, 0.0), shade.w);
31632
+ // Remove the shadow floor only as actual modeled light arrives.
31633
+ // Using the pre-diffuse band here creates a dark ring between the
31634
+ // shadow floor and the lit region, which slides as a surface turns.
31635
+ let energy = max(contribution.r, max(contribution.g, contribution.b));
31636
+ visibility = max(visibility, clamp(energy, 0.0, 1.0));
31637
+ illumination += contribution;
31638
+ }
31639
+ return base * (shade.rgb * (1.0 - visibility) + illumination);
31640
+ }
31641
+
31642
+ // The existing linear-depth attachment doubles as a geometry buffer:
31643
+ // r = optical depth, gb = octahedral world normal, a = outline participation.
31644
+ // Geometric normals deliberately ignore normal maps and texture seams.
31645
+ fn geometryPixel(depth: f32, normal: vec3<f32>, outlined: f32) -> vec4<f32> {
31646
+ let n = normalize(normal);
31647
+ let p = n.xy / max(abs(n.x) + abs(n.y) + abs(n.z), 1e-6);
31648
+ let signs = select(vec2<f32>(-1.0), vec2<f32>(1.0), p >= vec2<f32>(0.0));
31649
+ let oct = select((1.0 - abs(p.yx)) * signs, p, n.z >= 0.0);
31650
+ return vec4<f32>(depth, oct * 0.5 + 0.5, outlined);
31651
+ }
31652
+
31598
31653
  /// Shades a surface for the scene's mode.
31599
31654
  /// material: x shininess, y specularIntensity, z ambientIntensity, w mode (0 unlit).
31600
31655
  /// pbr: x roughness (<0 = default), y metallic, z/w unused.
31601
31656
  /// emissive: rgb sRGB color, w strength.
31602
- fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> Shaded {
31657
+ fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>, toonShadow: vec4<f32>, toonLight: vec4<f32>, toonParams: vec4<f32>) -> Shaded {
31603
31658
  var out: Shaded;
31604
31659
  if (lights.params.z < 0.5) {
31605
31660
  var c = baseColor;
31606
- if (material.w >= 0.5) {
31661
+ if (material.w > 1.5) {
31662
+ c = shadeToon(worldPos, worldNormal, baseColor, material.z, toonShadow, toonLight, toonParams);
31663
+ } else if (material.w >= 0.5) {
31607
31664
  c = applyLighting3D(worldPos, worldNormal, baseColor, material);
31608
31665
  }
31609
31666
  c += emissive.rgb * emissive.w;
@@ -31614,6 +31671,8 @@ fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3
31614
31671
  var radiance: vec3<f32>;
31615
31672
  if (material.w < 0.5) {
31616
31673
  radiance = srgbToLinear(baseColor);
31674
+ } else if (material.w > 1.5) {
31675
+ radiance = srgbToLinear(shadeToon(worldPos, worldNormal, baseColor, material.z, toonShadow, toonLight, toonParams));
31617
31676
  } else {
31618
31677
  let rough = select(pbr.x, 0.5, pbr.x < 0.0);
31619
31678
  radiance = shadePhysical(worldPos, worldNormal, srgbToLinear(baseColor), rough, clamp(pbr.y, 0.0, 1.0), material.z);
@@ -31649,9 +31708,6 @@ fn shadeSurfaceFull(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3
31649
31708
  return out;
31650
31709
  }
31651
31710
 
31652
- fn shadeSurface(worldPos: vec3<f32>, worldNormal: vec3<f32>, baseColor: vec3<f32>, material: vec4<f32>, pbr: vec4<f32>, emissive: vec4<f32>) -> vec3<f32> {
31653
- return shadeSurfaceFull(worldPos, worldNormal, baseColor, material, pbr, emissive).display;
31654
- }
31655
31711
  `;
31656
31712
  /** Group-3 bindings every lit 3D shader declares. */
31657
31713
  const lightsBindingsWgsl = `
@@ -31962,7 +32018,7 @@ fn fs_mrt(in: VsOut) -> FsOutputMrt {
31962
32018
  var out: FsOutputMrt;
31963
32019
  let s = shadeFloor(in);
31964
32020
  out.color = vec4<f32>(s.display * s.alpha, s.alpha);
31965
- out.linearDepth = vec4<f32>(s.linearDepth, 0.0, 0.0, 1.0);
32021
+ out.linearDepth = geometryPixel(s.linearDepth, vec3<f32>(0.0, -1.0, 0.0), 1.0);
31966
32022
  out.depth = s.depth;
31967
32023
  return out;
31968
32024
  }
@@ -31982,7 +32038,7 @@ fn fs_mrt_bloom(in: VsOut) -> FsOutputMrtBloom {
31982
32038
  var out: FsOutputMrtBloom;
31983
32039
  let s = shadeFloor(in);
31984
32040
  out.color = vec4<f32>(s.display * s.alpha, s.alpha);
31985
- out.linearDepth = vec4<f32>(s.linearDepth, 0.0, 0.0, 1.0);
32041
+ out.linearDepth = geometryPixel(s.linearDepth, vec3<f32>(0.0, -1.0, 0.0), 1.0);
31986
32042
  out.hdr = vec4<f32>(s.hdr * s.alpha, 1.0);
31987
32043
  out.depth = s.depth;
31988
32044
  return out;
@@ -32702,6 +32758,9 @@ struct ModelUniforms {
32702
32758
  shade : vec4<f32>, // rgb = toon shadow-side color multiplier, a = alpha cutoff (0 = none)
32703
32759
  pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
32704
32760
  emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
32761
+ toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
32762
+ toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
32763
+ toonParams : vec4<f32>, // x terminator softness, y outline participation
32705
32764
  maps : vec4<f32>, // x = normal scale (0 = no map), y = occlusion strength, z = has metallic-roughness map, w = has emissive map
32706
32765
  };
32707
32766
 
@@ -32842,37 +32901,6 @@ fn vs_main(
32842
32901
  return out;
32843
32902
  }
32844
32903
 
32845
- // Toon (MToon-style): the base color as authored where the light reaches,
32846
- // the shade color past a soft terminator. Highlights stay out: the texture
32847
- // already paints them.
32848
- fn toonLighting(in: VertexOutput, baseColor: vec3<f32>) -> vec3<f32> {
32849
- var N = normalize(in.worldNormal);
32850
- let V = normalize(cam.cameraPos.xyz - in.worldPos);
32851
- if (dot(N, V) < 0.0) {
32852
- N = -N;
32853
- }
32854
- var lit = 0.0;
32855
- let numLights = i32(lights.params.x);
32856
- for (var i = 0; i < 8; i++) {
32857
- if (i >= numLights) {
32858
- break;
32859
- }
32860
- let light = lights.lights[i];
32861
- let lightType = light.posType.w;
32862
- var L = vec3<f32>(0.0, 0.0, 1.0);
32863
- if (lightType > 0.5 && lightType < 1.5) {
32864
- L = normalize(-light.dirRadius.xyz);
32865
- } else if (lightType >= 1.5) {
32866
- L = normalize(light.posType.xyz - in.worldPos);
32867
- } else {
32868
- continue;
32869
- }
32870
- let terminator = smoothstep(-0.05, 0.2, dot(N, L));
32871
- lit = max(lit, terminator * min(light.colorIntensity.w, 1.0));
32872
- }
32873
- return baseColor * mix(model.shade.rgb, vec3<f32>(1.0), lit);
32874
- }
32875
-
32876
32904
  struct MeshFragment {
32877
32905
  color : vec4<f32>, // premultiplied display color
32878
32906
  hdr : vec4<f32>, // premultiplied scene radiance (bloom source)
@@ -32940,7 +32968,7 @@ fn shadeGlass(in: VertexOutput, Nin: vec3<f32>, tint: vec3<f32>, alpha: f32, rim
32940
32968
  let transmitted = col * depthTint * (1.0 - 0.45 * rim * rim);
32941
32969
  let f0 = pow((ior - 1.0) / (ior + 1.0), 2.0);
32942
32970
  let F = f0 + (1.0 - f0) * pow(rim, 5.0);
32943
- let lit = shadeSurfaceFull(in.worldPos, N, vec3<f32>(0.0), model.materialParams, vec4<f32>(model.pbr.x, 0.0, 0.0, 0.0), vec4<f32>(0.0));
32971
+ let lit = shadeSurfaceFull(in.worldPos, N, vec3<f32>(0.0), model.materialParams, vec4<f32>(model.pbr.x, 0.0, 0.0, 0.0), vec4<f32>(0.0), model.toonShadow, model.toonLight, model.toonParams);
32944
32972
  // Grazing faces mirror the room; keep that faint so dark scenes stay dark
32945
32973
  // and the studio highlights below carry the shape.
32946
32974
  let sheen = vec3<f32>(0.9, 0.94, 1.0) * F * 0.22 + tint * 0.05 * (0.4 + rim);
@@ -32988,19 +33016,6 @@ fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
32988
33016
 
32989
33017
  let baseRgb = texColor.rgb * in.color.rgb * model.colorTint.rgb;
32990
33018
  var out: MeshFragment;
32991
- if (model.materialParams.w > 1.5) {
32992
- var toon = baseRgb;
32993
- if (lights.params.y >= 0.5) {
32994
- toon = toonLighting(in, baseRgb);
32995
- }
32996
- if (model.params.w > 0.5 && (in.emissive.w > 0.0 || dot(in.emissive.rgb, in.emissive.rgb) > 0.0)) {
32997
- toon += in.emissive.rgb * in.emissive.w;
32998
- }
32999
- out.color = vec4<f32>(toon * alpha, alpha);
33000
- out.hdr = vec4<f32>(srgbToLinear(toon) * alpha, alpha);
33001
- return out;
33002
- }
33003
-
33004
33019
  var N = normalize(in.worldNormal);
33005
33020
  if (model.maps.x > 0.0) {
33006
33021
  var tn = normalSample * 2.0 - 1.0;
@@ -33030,7 +33045,7 @@ fn shadeMesh(in: VertexOutput, isFront: bool) -> MeshFragment {
33030
33045
  if (model.params.w > 0.5 && (in.emissive.w > 0.0 || dot(in.emissive.rgb, in.emissive.rgb) > 0.0)) {
33031
33046
  emissive = in.emissive;
33032
33047
  }
33033
- let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive);
33048
+ let shaded = shadeSurfaceFull(in.worldPos, N, baseRgb, material, pbr, emissive, model.toonShadow, model.toonLight, model.toonParams);
33034
33049
  out.color = vec4<f32>(shaded.display * alpha, alpha);
33035
33050
  out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
33036
33051
  return out;
@@ -33061,7 +33076,7 @@ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @locatio
33061
33076
  fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
33062
33077
  var out: MrtOutput;
33063
33078
  out.color = shadeMesh(in, isFront).color;
33064
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
33079
+ out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
33065
33080
  return out;
33066
33081
  }
33067
33082
 
@@ -33079,7 +33094,7 @@ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBl
33079
33094
  let f = shadeMesh(in, isFront);
33080
33095
  var out: MrtBloomOutput;
33081
33096
  out.color = f.color;
33082
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
33097
+ out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
33083
33098
  out.hdr = f.hdr;
33084
33099
  return out;
33085
33100
  }
@@ -33104,6 +33119,9 @@ struct ModelUniforms {
33104
33119
  materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
33105
33120
  pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
33106
33121
  emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
33122
+ toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
33123
+ toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
33124
+ toonParams : vec4<f32>, // x terminator softness, y outline participation
33107
33125
  relief : vec4<f32>, // x = amount (px), y = on, w = grid cells per side
33108
33126
  reliefRect : vec4<f32>, // xy = where the layer's box starts in reliefTex (0..1), zw = its size
33109
33127
  reliefEye : vec4<f32>, // xyz = the eye the surface keeps its look from (the default camera)
@@ -33298,7 +33316,7 @@ fn shadeQuad(in: VertexOutput, isFront: bool) -> QuadFragment {
33298
33316
  discard;
33299
33317
  }
33300
33318
 
33301
- let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive);
33319
+ let shaded = shadeSurfaceFull(in.worldPos, in.worldNormal, baseRgb, model.materialParams, model.pbr, model.emissive, model.toonShadow, model.toonLight, model.toonParams);
33302
33320
  var out: QuadFragment;
33303
33321
  out.color = vec4<f32>(shaded.display * alpha, alpha);
33304
33322
  out.hdr = vec4<f32>(shaded.hdr * alpha, alpha);
@@ -33330,7 +33348,7 @@ fn fs_single(in: VertexOutput, @builtin(front_facing) isFront: bool) -> @locatio
33330
33348
  fn fs_mrt(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtOutput {
33331
33349
  var out: MrtOutput;
33332
33350
  out.color = shadeQuad(in, isFront).color;
33333
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
33351
+ out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
33334
33352
  return out;
33335
33353
  }
33336
33354
 
@@ -33348,7 +33366,7 @@ fn fs_mrt_bloom(in: VertexOutput, @builtin(front_facing) isFront: bool) -> MrtBl
33348
33366
  let f = shadeQuad(in, isFront);
33349
33367
  var out: MrtBloomOutput;
33350
33368
  out.color = f.color;
33351
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
33369
+ out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
33352
33370
  out.hdr = f.hdr;
33353
33371
  return out;
33354
33372
  }
@@ -33374,13 +33392,37 @@ const SHADOW_DEPTH_STENCIL = {
33374
33392
  depthBiasSlopeScale: 2.5,
33375
33393
  depthBiasClamp: .01
33376
33394
  };
33377
- /** Floats appended to each 3D model uniform block: pbr vec4 + emissive vec4. */
33378
- const SURFACE_PARAMS_FLOATS = 8;
33379
- function packSurfaceParams(data, out, offset) {
33395
+ /** Shared model uniforms: PBR, emissive, and three art-direction vec4s. */
33396
+ const SURFACE_PARAMS_FLOATS = 20;
33397
+ function packSurfaceParams(data, out, offset, modelShade) {
33380
33398
  out[offset] = data.roughness ?? -1;
33381
33399
  out[offset + 1] = data.metallic ?? 0;
33382
33400
  out[offset + 2] = 0;
33383
33401
  out[offset + 3] = 0;
33402
+ const shadow = data.toon?.shadowColor ? parseColor(data.toon.shadowColor) : null;
33403
+ out.set(shadow ? [
33404
+ shadow.r,
33405
+ shadow.g,
33406
+ shadow.b
33407
+ ] : modelShade ?? [
33408
+ .5,
33409
+ .5,
33410
+ .55
33411
+ ], offset + 8);
33412
+ out[offset + 11] = data.toon?.diffuse ?? 0;
33413
+ const light = parseColor(data.toon?.lightColor ?? "#ffffff");
33414
+ out.set([
33415
+ light.r,
33416
+ light.g,
33417
+ light.b,
33418
+ data.toon?.threshold ?? .075
33419
+ ], offset + 12);
33420
+ out.set([
33421
+ data.toon?.softness ?? .25,
33422
+ data.outline === false ? 0 : 1,
33423
+ 0,
33424
+ 0
33425
+ ], offset + 16);
33384
33426
  const e = data.emissive;
33385
33427
  if (e === void 0 || e === null) {
33386
33428
  out.fill(0, offset + 4, offset + 8);
@@ -33449,7 +33491,7 @@ function packMaterialParams(data) {
33449
33491
  data.roughness !== void 0 ? Math.max(1, (1 - data.roughness) * 128) : data.shininess ?? 32,
33450
33492
  data.metallic !== void 0 ? data.metallic : data.specularIntensity ?? .5,
33451
33493
  data.ambientIntensity ?? 1,
33452
- data.material === "unlit" ? 0 : 1
33494
+ data.material === "unlit" ? 0 : data.material === "toon" ? 2 : 1
33453
33495
  ];
33454
33496
  }
33455
33497
  var Quad3DPipeline = class {
@@ -34179,12 +34221,13 @@ var Mesh3DPipeline = class {
34179
34221
  this.modelData[45] = shade[1];
34180
34222
  this.modelData[46] = shade[2];
34181
34223
  this.modelData[47] = data.alphaCutoff ?? 0;
34182
- packSurfaceParams(data, this.modelData, 48);
34224
+ packSurfaceParams(data, this.modelData, 48, data.shadeColor);
34183
34225
  const maps = data.maps;
34184
- this.modelData[56] = maps?.normal ? maps.normalScale ?? 1 : 0;
34185
- this.modelData[57] = maps?.occlusion ? maps.occlusionStrength ?? 1 : 0;
34186
- this.modelData[58] = maps?.metallicRoughness ? 1 : 0;
34187
- this.modelData[59] = maps?.emissive ? 1 : 0;
34226
+ const mapsOffset = 48 + SURFACE_PARAMS_FLOATS;
34227
+ this.modelData[mapsOffset] = maps?.normal ? maps.normalScale ?? 1 : 0;
34228
+ this.modelData[mapsOffset + 1] = maps?.occlusion ? maps.occlusionStrength ?? 1 : 0;
34229
+ this.modelData[mapsOffset + 2] = maps?.metallicRoughness ? 1 : 0;
34230
+ this.modelData[mapsOffset + 3] = maps?.emissive ? 1 : 0;
34188
34231
  const glass = data.glass;
34189
34232
  if (glass) {
34190
34233
  this.modelData[44] = glass.dispersion;
@@ -37963,6 +38006,309 @@ fn fs_dof(in: VSOut) -> @location(0) vec4<f32> {
37963
38006
  return accumColor / totalWeight;
37964
38007
  }
37965
38008
  `;
38009
+ function outlineShader(sampleCount) {
38010
+ const multisampled = sampleCount > 1;
38011
+ const textureType = multisampled ? "texture_multisampled_2d<f32>" : "texture_2d<f32>";
38012
+ return `
38013
+ struct Uniforms {
38014
+ params : vec4<f32>, // width, cosine(crease angle), relative depth threshold, opacity
38015
+ ink : vec4<f32>,
38016
+ fog : vec4<f32>,
38017
+ fogRange : vec4<f32>,
38018
+ projection : vec4<f32>, // inverse projection x/y scale, far depth
38019
+ };
38020
+ @group(0) @binding(0) var<uniform> u : Uniforms;
38021
+ @group(0) @binding(1) var colorTex : ${textureType};
38022
+ @group(0) @binding(2) var geometryTex : ${textureType};
38023
+
38024
+ @vertex fn vs(@builtin(vertex_index) i : u32) -> @builtin(position) vec4<f32> {
38025
+ let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
38026
+ return vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
38027
+ }
38028
+
38029
+ fn geometry(p : vec2<i32>, sample : i32) -> vec4<f32> {
38030
+ let size = vec2<i32>(textureDimensions(geometryTex));
38031
+ // Beyond the viewport is the same surface: never ink the canvas border.
38032
+ return textureLoad(geometryTex, clamp(p, vec2<i32>(0), size - 1), sample);
38033
+ }
38034
+
38035
+ fn normal(oct : vec2<f32>) -> vec3<f32> {
38036
+ let p = oct * 2.0 - 1.0;
38037
+ var n = vec3<f32>(p, 1.0 - abs(p.x) - abs(p.y));
38038
+ let t = max(-n.z, 0.0);
38039
+ n = vec3<f32>(n.xy + select(vec2<f32>(t), vec2<f32>(-t), n.xy >= vec2<f32>(0.0)), n.z);
38040
+ return normalize(n);
38041
+ }
38042
+
38043
+ fn srgbToLinear(c : vec3<f32>) -> vec3<f32> {
38044
+ return select(pow((max(c, vec3<f32>(0.0)) + 0.055) / 1.055, vec3<f32>(2.4)), c / 12.92, c <= vec3<f32>(0.04045));
38045
+ }
38046
+ fn linearToSrgb(c : vec3<f32>) -> vec3<f32> {
38047
+ let x = max(c, vec3<f32>(0.0));
38048
+ return select(1.055 * pow(x, vec3<f32>(1.0 / 2.4)) - 0.055, x * 12.92, x <= vec3<f32>(0.0031308));
38049
+ }
38050
+
38051
+ fn edge(center : vec4<f32>, next : vec4<f32>, previous : vec4<f32>) -> f32 {
38052
+ let z = 1.0 / max(center.r, 0.0001);
38053
+ let a = 1.0 / max(next.r, 0.0001);
38054
+ let b = 1.0 / max(previous.r, 0.0001);
38055
+ // Inverse depth is affine on a perspective-projected plane. Its signed
38056
+ // second difference suppresses grazing surfaces and inks only the near
38057
+ // side of an occlusion, including thin geometry with background both sides.
38058
+ let curvature = (2.0 * z - a - b) / z;
38059
+ let depthEdge = smoothstep(u.params.z, u.params.z * 2.0, curvature);
38060
+ let sameDepth = abs(center.r - next.r) / max(center.r, 0.0001) < 0.03;
38061
+ let crease = select(0.0, 1.0, next.a > 0.5 && sameDepth && dot(normal(center.gb), normal(next.gb)) < u.params.y);
38062
+ return max(depthEdge, crease);
38063
+ }
38064
+
38065
+ @fragment fn fs(@builtin(position) pos : vec4<f32>${multisampled ? ", @builtin(sample_index) sampleIndex : u32" : ""}) -> @location(0) vec4<f32> {
38066
+ let sample = ${multisampled ? "i32(sampleIndex)" : "0"};
38067
+ let pixel = vec2<i32>(pos.xy);
38068
+ let source = textureLoad(colorTex, pixel, sample);
38069
+ let c = geometry(pixel, sample);
38070
+ if (c.a <= 0.0 || u.params.x <= 0.0 || u.params.w <= 0.0) { return source; }
38071
+ var coverage = 0.0;
38072
+ let directions = array<vec2<f32>, 8>(
38073
+ vec2<f32>(1.0, 0.0), vec2<f32>(-1.0, 0.0), vec2<f32>(0.0, 1.0), vec2<f32>(0.0, -1.0),
38074
+ vec2<f32>(0.707107, 0.707107), vec2<f32>(-0.707107, 0.707107), vec2<f32>(0.707107, -0.707107), vec2<f32>(-0.707107, -0.707107));
38075
+ for (var r = 1; r <= i32(ceil(u.params.x)); r++) {
38076
+ let weight = clamp(u.params.x - f32(r) + 1.0, 0.0, 1.0);
38077
+ for (var d = 0; d < 8; d++) {
38078
+ let offset = vec2<i32>(round(directions[d] * f32(r)));
38079
+ coverage = max(coverage, edge(c, geometry(pixel + offset, sample), geometry(pixel - offset, sample)) * weight);
38080
+ }
38081
+ }
38082
+ var ink = u.ink.rgb;
38083
+ if (u.fog.w > 0.5) {
38084
+ let uv = pos.xy / vec2<f32>(textureDimensions(colorTex));
38085
+ let ray = vec3<f32>((uv * 2.0 - 1.0) * u.projection.xy, 1.0);
38086
+ let distance = c.r * length(ray);
38087
+ let fog = smoothstep(u.fogRange.x, max(u.fogRange.y, u.fogRange.x + 1.0), distance) * u.fogRange.z;
38088
+ // Match surface fog's linear-light blend; display-space interpolation
38089
+ // would darken outlines halfway into a light-colored atmosphere.
38090
+ ink = linearToSrgb(mix(srgbToLinear(ink), srgbToLinear(u.fog.rgb), fog));
38091
+ }
38092
+ let visibleCoverage = min(c.a / max(source.a, 0.0001), 1.0);
38093
+ return vec4<f32>(mix(source.rgb, ink * source.a, coverage * visibleCoverage * u.params.w * u.ink.a), source.a);
38094
+ }
38095
+ `;
38096
+ }
38097
+ /** Ink shades original color/depth/normal samples, then resolves color with MSAA. */
38098
+ var GeometryOutlinePipeline = class {
38099
+ layout;
38100
+ pipeline;
38101
+ multisampledOutput = null;
38102
+ pool = new BufferPool(80, GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST);
38103
+ constructor(device, format, sampleCount = 1) {
38104
+ this.device = device;
38105
+ this.format = format;
38106
+ this.sampleCount = sampleCount;
38107
+ this.layout = device.createBindGroupLayout({
38108
+ label: "GeometryOutlineLayout",
38109
+ entries: [{
38110
+ binding: 0,
38111
+ visibility: GPUShaderStage.FRAGMENT,
38112
+ buffer: { type: "uniform" }
38113
+ }, ...[1, 2].map((binding) => ({
38114
+ binding,
38115
+ visibility: GPUShaderStage.FRAGMENT,
38116
+ texture: {
38117
+ sampleType: "unfilterable-float",
38118
+ multisampled: sampleCount > 1
38119
+ }
38120
+ }))]
38121
+ });
38122
+ const module$1 = device.createShaderModule({
38123
+ label: "geometry-outlines.wgsl",
38124
+ code: outlineShader(sampleCount)
38125
+ });
38126
+ this.pipeline = device.createRenderPipeline({
38127
+ label: "GeometryOutlines",
38128
+ layout: device.createPipelineLayout({ bindGroupLayouts: [this.layout] }),
38129
+ vertex: {
38130
+ module: module$1,
38131
+ entryPoint: "vs"
38132
+ },
38133
+ fragment: {
38134
+ module: module$1,
38135
+ entryPoint: "fs",
38136
+ targets: [{ format }]
38137
+ },
38138
+ primitive: { topology: "triangle-list" },
38139
+ multisample: { count: sampleCount }
38140
+ });
38141
+ }
38142
+ reset() {
38143
+ this.pool.reset();
38144
+ }
38145
+ destroy() {
38146
+ this.pool.destroy();
38147
+ this.multisampledOutput?.destroy();
38148
+ }
38149
+ attachment(source, dest) {
38150
+ if (this.sampleCount <= 1) return {
38151
+ view: dest,
38152
+ loadOp: "clear",
38153
+ storeOp: "store"
38154
+ };
38155
+ if (!this.multisampledOutput || this.multisampledOutput.width !== source.width || this.multisampledOutput.height !== source.height) {
38156
+ this.multisampledOutput?.destroy();
38157
+ this.multisampledOutput = this.device.createTexture({
38158
+ label: "GeometryOutlineMsaaOutput",
38159
+ size: {
38160
+ width: source.width,
38161
+ height: source.height
38162
+ },
38163
+ format: this.format,
38164
+ sampleCount: this.sampleCount,
38165
+ usage: GPUTextureUsage.RENDER_ATTACHMENT
38166
+ });
38167
+ }
38168
+ return {
38169
+ view: this.multisampledOutput.createView(),
38170
+ resolveTarget: dest,
38171
+ loadOp: "clear",
38172
+ storeOp: "discard"
38173
+ };
38174
+ }
38175
+ render(encoder, source, geometry, dest, camera, options, fog) {
38176
+ const data = new Float32Array(20);
38177
+ data.set([
38178
+ (options.width ?? 1.5) * source.height / (options.referenceHeight ?? 1080),
38179
+ Math.cos((options.creaseAngle ?? 45) * Math.PI / 180),
38180
+ options.depthThreshold ?? .01,
38181
+ options.opacity ?? 1
38182
+ ]);
38183
+ const color = parseColor(options.color ?? "#16131c");
38184
+ data.set([
38185
+ color.r,
38186
+ color.g,
38187
+ color.b,
38188
+ color.a
38189
+ ], 4);
38190
+ if (fog) {
38191
+ const tint = parseColor(fog.color);
38192
+ data.set([
38193
+ tint.r,
38194
+ tint.g,
38195
+ tint.b,
38196
+ 1
38197
+ ], 8);
38198
+ data.set([
38199
+ fog.start,
38200
+ fog.end,
38201
+ fog.opacity ?? 1,
38202
+ 0
38203
+ ], 12);
38204
+ }
38205
+ const projection = Camera3D.computeProjectionMatrix(camera);
38206
+ data.set([
38207
+ 1 / projection[0],
38208
+ 1 / projection[5],
38209
+ camera.far,
38210
+ 0
38211
+ ], 16);
38212
+ const bindGroup = this.device.createBindGroup({
38213
+ layout: this.layout,
38214
+ entries: [
38215
+ {
38216
+ binding: 0,
38217
+ resource: { buffer: this.pool.getBuffer(this.device, data) }
38218
+ },
38219
+ {
38220
+ binding: 1,
38221
+ resource: source.createView()
38222
+ },
38223
+ {
38224
+ binding: 2,
38225
+ resource: geometry.createView()
38226
+ }
38227
+ ]
38228
+ });
38229
+ const pass = encoder.beginRenderPass({ colorAttachments: [this.attachment(source, dest)] });
38230
+ pass.setPipeline(this.pipeline);
38231
+ pass.setBindGroup(0, bindGroup);
38232
+ pass.draw(3);
38233
+ pass.end();
38234
+ }
38235
+ };
38236
+ /**
38237
+ * Color MSAA resolves average samples. Depth and octahedral normals cannot
38238
+ * be averaged across silhouettes: that invents a distant surface and a
38239
+ * normal that belongs to neither object. Keep the nearest visible sample
38240
+ * and carry outline coverage separately, without re-rendering geometry.
38241
+ */
38242
+ const shader = `
38243
+ @group(0) @binding(0) var geometry : texture_multisampled_2d<f32>;
38244
+ @vertex fn vs(@builtin(vertex_index) i : u32) -> @builtin(position) vec4<f32> {
38245
+ let p = vec2<f32>(f32((i << 1u) & 2u), f32(i & 2u));
38246
+ return vec4<f32>(p * 2.0 - 1.0, 0.0, 1.0);
38247
+ }
38248
+ @fragment fn fs(@builtin(position) pos : vec4<f32>) -> @location(0) vec4<f32> {
38249
+ let pixel = vec2<i32>(pos.xy);
38250
+ let samples = i32(textureNumSamples(geometry));
38251
+ var nearest = textureLoad(geometry, pixel, 0);
38252
+ var coverage = 0.0;
38253
+ for (var i = 0; i < samples; i++) {
38254
+ let s = textureLoad(geometry, pixel, i);
38255
+ if (s.r < nearest.r) { nearest = s; }
38256
+ coverage += s.a;
38257
+ }
38258
+ return vec4<f32>(nearest.rgb, nearest.a * coverage / f32(samples));
38259
+ }
38260
+ `;
38261
+ var GeometryResolvePipeline = class {
38262
+ layout;
38263
+ pipeline;
38264
+ constructor(device) {
38265
+ this.device = device;
38266
+ this.layout = device.createBindGroupLayout({ entries: [{
38267
+ binding: 0,
38268
+ visibility: GPUShaderStage.FRAGMENT,
38269
+ texture: {
38270
+ sampleType: "unfilterable-float",
38271
+ multisampled: true
38272
+ }
38273
+ }] });
38274
+ const module$1 = device.createShaderModule({
38275
+ label: "geometry-resolve.wgsl",
38276
+ code: shader
38277
+ });
38278
+ this.pipeline = device.createRenderPipeline({
38279
+ label: "GeometryResolve",
38280
+ layout: device.createPipelineLayout({ bindGroupLayouts: [this.layout] }),
38281
+ vertex: {
38282
+ module: module$1,
38283
+ entryPoint: "vs"
38284
+ },
38285
+ fragment: {
38286
+ module: module$1,
38287
+ entryPoint: "fs",
38288
+ targets: [{ format: "rgba16float" }]
38289
+ },
38290
+ primitive: { topology: "triangle-list" }
38291
+ });
38292
+ }
38293
+ render(encoder, source, dest) {
38294
+ const bindGroup = this.device.createBindGroup({
38295
+ layout: this.layout,
38296
+ entries: [{
38297
+ binding: 0,
38298
+ resource: source.createView()
38299
+ }]
38300
+ });
38301
+ const pass = encoder.beginRenderPass({ colorAttachments: [{
38302
+ view: dest,
38303
+ loadOp: "clear",
38304
+ storeOp: "store"
38305
+ }] });
38306
+ pass.setPipeline(this.pipeline);
38307
+ pass.setBindGroup(0, bindGroup);
38308
+ pass.draw(3);
38309
+ pass.end();
38310
+ }
38311
+ };
37966
38312
  function isKtx2(bytes) {
37967
38313
  return bytes.length >= KTX2_IDENTIFIER.length && KTX2_IDENTIFIER.every((byte, i) => bytes[i] === byte);
37968
38314
  }
@@ -38327,6 +38673,9 @@ struct TextModelUniforms {
38327
38673
  materialParams : vec4<f32>, // x = shininess, y = specularIntensity, z = ambientIntensity, w = materialMode (0=unlit, 1=lit)
38328
38674
  pbr : vec4<f32>, // x = roughness (<0 = default), y = metallic
38329
38675
  emissive : vec4<f32>, // rgb = sRGB emissive color, w = strength
38676
+ toonShadow : vec4<f32>, // rgb shadow-side multiplier, w diffuse modelling
38677
+ toonLight : vec4<f32>, // rgb lit-side multiplier, w terminator threshold
38678
+ toonParams : vec4<f32>, // x terminator softness, y outline participation
38330
38679
  };
38331
38680
 
38332
38681
  @group(0) @binding(0) var<uniform> cam : CameraUniforms;
@@ -38459,7 +38808,7 @@ fn shadeText(in : VSOut, fw : vec2<f32>) -> TextFragment {
38459
38808
  if (shaded.a < 0.0001) {
38460
38809
  return out;
38461
38810
  }
38462
- let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive);
38811
+ let lit = shadeSurfaceFull(in.worldPos, in.worldNormal, shaded.rgb / shaded.a, model.materialParams, model.pbr, model.emissive, model.toonShadow, model.toonLight, model.toonParams);
38463
38812
  out.color = vec4<f32>(lit.display * shaded.a, shaded.a);
38464
38813
  out.hdr = vec4<f32>(lit.hdr * shaded.a, shaded.a);
38465
38814
  return out;
@@ -38500,7 +38849,7 @@ struct MrtBloomOutput {
38500
38849
  @fragment fn fs_mrt(in : VSOut) -> MrtOutput {
38501
38850
  var out : MrtOutput;
38502
38851
  out.color = textFragment(in).color;
38503
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
38852
+ out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
38504
38853
  return out;
38505
38854
  }
38506
38855
 
@@ -38516,7 +38865,7 @@ struct MrtBloomOutput {
38516
38865
  let f = textFragment(in);
38517
38866
  var out : MrtBloomOutput;
38518
38867
  out.color = f.color;
38519
- out.depth = vec4<f32>(in.linearDepth, 0.0, 0.0, 1.0);
38868
+ out.depth = geometryPixel(in.linearDepth, in.worldNormal, model.toonParams.y);
38520
38869
  out.hdr = f.hdr;
38521
38870
  return out;
38522
38871
  }
@@ -39580,6 +39929,8 @@ var Renderer3D = class {
39580
39929
  shadowSampler = null;
39581
39930
  meshBounds = /* @__PURE__ */ new WeakMap();
39582
39931
  bloomPipeline = null;
39932
+ outlinePipeline = null;
39933
+ geometryResolvePipeline = null;
39583
39934
  lastCameraBuffer = null;
39584
39935
  /**
39585
39936
  * Samples per pixel in the 3D pass. Mesh silhouettes (extruded text,
@@ -39646,7 +39997,39 @@ var Renderer3D = class {
39646
39997
  primitive: { topology: "triangle-list" }
39647
39998
  });
39648
39999
  }
40000
+ /**
40001
+ * Size-dependent render targets, by label, size, samples and usage. One
40002
+ * frame (one command buffer) can render 3D scenes of different sizes, so
40003
+ * a target is never destroyed while the frame may use it: targets the last
40004
+ * frame did not use are destroyed at the next `resetPools`.
40005
+ */
40006
+ attachments = /* @__PURE__ */ new Map();
40007
+ attachmentsUsed = /* @__PURE__ */ new Set();
40008
+ attachment(label, width, height, desc) {
40009
+ const key = `${label}:${width}x${height}:${desc.sampleCount ?? 1}:${desc.usage}`;
40010
+ this.attachmentsUsed.add(key);
40011
+ let texture = this.attachments.get(key);
40012
+ if (!texture) {
40013
+ texture = this.device.createTexture({
40014
+ label,
40015
+ size: {
40016
+ width,
40017
+ height
40018
+ },
40019
+ ...desc
40020
+ });
40021
+ this.attachments.set(key, texture);
40022
+ }
40023
+ return texture;
40024
+ }
39649
40025
  resetPools() {
40026
+ for (const [key, texture] of this.attachments) {
40027
+ if (this.attachmentsUsed.has(key)) continue;
40028
+ texture.destroy();
40029
+ this.attachments.delete(key);
40030
+ }
40031
+ this.attachmentsUsed.clear();
40032
+ this.outlinePipeline?.reset();
39650
40033
  this.bloomPipeline?.resetPools();
39651
40034
  this.cameraPool.reset();
39652
40035
  this.lastCameraPose = null;
@@ -39661,33 +40044,18 @@ var Renderer3D = class {
39661
40044
  this.morphPipeline.resetPools();
39662
40045
  }
39663
40046
  getOrCreateDepthTexture(width, height) {
39664
- if (!this.depthTexture || this.depthTexture.width !== width || this.depthTexture.height !== height) {
39665
- this.depthTexture?.destroy();
39666
- this.depthTexture = this.device.createTexture({
39667
- label: "Renderer3DDepthTexture",
39668
- size: {
39669
- width,
39670
- height
39671
- },
39672
- format: "depth24plus",
39673
- sampleCount: this.sampleCount,
39674
- usage: GPUTextureUsage.RENDER_ATTACHMENT
39675
- });
39676
- }
40047
+ this.depthTexture = this.attachment("Renderer3DDepthTexture", width, height, {
40048
+ format: "depth24plus",
40049
+ sampleCount: this.sampleCount,
40050
+ usage: GPUTextureUsage.RENDER_ATTACHMENT
40051
+ });
39677
40052
  return this.depthTexture;
39678
40053
  }
39679
- getOrCreateMsaaTexture(current, label, format, width, height) {
39680
- if (current && current.width === width && current.height === height) return current;
39681
- current?.destroy();
39682
- return this.device.createTexture({
39683
- label,
39684
- size: {
39685
- width,
39686
- height
39687
- },
40054
+ getOrCreateMsaaTexture(_current, label, format, width, height, sampled = false) {
40055
+ return this.attachment(label, width, height, {
39688
40056
  format,
39689
40057
  sampleCount: this.sampleCount,
39690
- usage: GPUTextureUsage.RENDER_ATTACHMENT
40058
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | (sampled ? GPUTextureUsage.TEXTURE_BINDING : 0)
39691
40059
  });
39692
40060
  }
39693
40061
  /** The HDR radiance target the last `beginPass(…, writeHdr)` drew into. */
@@ -39695,110 +40063,54 @@ var Renderer3D = class {
39695
40063
  return this.hdrTexture;
39696
40064
  }
39697
40065
  getOrCreateHdrTexture(width, height) {
39698
- if (!this.hdrTexture || this.hdrTexture.width !== width || this.hdrTexture.height !== height) {
39699
- this.hdrTexture?.destroy();
39700
- this.hdrTexture = this.device.createTexture({
39701
- label: "Renderer3DHdrRadiance",
39702
- size: {
39703
- width,
39704
- height
39705
- },
39706
- format: "rgba16float",
39707
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
39708
- });
39709
- }
40066
+ this.hdrTexture = this.attachment("Renderer3DHdrRadiance", width, height, {
40067
+ format: "rgba16float",
40068
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
40069
+ });
39710
40070
  return this.hdrTexture;
39711
40071
  }
39712
40072
  getOrCreateLinearDepthTexture(width, height) {
39713
- if (!this.linearDepthTexture || this.linearDepthTexture.width !== width || this.linearDepthTexture.height !== height) {
39714
- this.linearDepthTexture?.destroy();
39715
- this.linearDepthTexture = this.device.createTexture({
39716
- label: "Renderer3DLinearDepthTexture",
39717
- size: {
39718
- width,
39719
- height
39720
- },
39721
- format: "rgba16float",
39722
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
39723
- });
39724
- }
40073
+ this.linearDepthTexture = this.attachment("Renderer3DLinearDepthTexture", width, height, {
40074
+ format: "rgba16float",
40075
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
40076
+ });
39725
40077
  return this.linearDepthTexture;
39726
40078
  }
39727
40079
  getOrCreateReflectionTexture(width, height) {
39728
- if (!this.reflectionColorTexture || this.reflectionColorTexture.width !== width || this.reflectionColorTexture.height !== height) {
39729
- this.reflectionColorTexture?.destroy();
39730
- this.reflectionColorTexture = this.device.createTexture({
39731
- label: "Renderer3DReflectionColor",
39732
- size: {
39733
- width,
39734
- height
39735
- },
39736
- format: this.format,
39737
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
39738
- });
39739
- }
40080
+ this.reflectionColorTexture = this.attachment("Renderer3DReflectionColor", width, height, {
40081
+ format: this.format,
40082
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
40083
+ });
39740
40084
  return this.reflectionColorTexture;
39741
40085
  }
39742
40086
  getOrCreateReflectionMsaaTexture(width, height) {
39743
- if (!this.reflectionMsaaColorTexture || this.reflectionMsaaColorTexture.width !== width || this.reflectionMsaaColorTexture.height !== height) {
39744
- this.reflectionMsaaColorTexture?.destroy();
39745
- this.reflectionMsaaColorTexture = this.device.createTexture({
39746
- label: "Renderer3DReflectionMsaaColor",
39747
- size: {
39748
- width,
39749
- height
39750
- },
39751
- format: this.format,
39752
- sampleCount: this.sampleCount,
39753
- usage: GPUTextureUsage.RENDER_ATTACHMENT
39754
- });
39755
- }
40087
+ this.reflectionMsaaColorTexture = this.attachment("Renderer3DReflectionMsaaColor", width, height, {
40088
+ format: this.format,
40089
+ sampleCount: this.sampleCount,
40090
+ usage: GPUTextureUsage.RENDER_ATTACHMENT
40091
+ });
39756
40092
  return this.reflectionMsaaColorTexture;
39757
40093
  }
39758
40094
  getOrCreateReflectionDepthTexture(width, height) {
39759
- if (!this.reflectionDepthTexture || this.reflectionDepthTexture.width !== width || this.reflectionDepthTexture.height !== height) {
39760
- this.reflectionDepthTexture?.destroy();
39761
- this.reflectionDepthTexture = this.device.createTexture({
39762
- label: "Renderer3DReflectionDepth",
39763
- size: {
39764
- width,
39765
- height
39766
- },
39767
- format: "depth24plus",
39768
- sampleCount: this.sampleCount,
39769
- usage: GPUTextureUsage.RENDER_ATTACHMENT
39770
- });
39771
- }
40095
+ this.reflectionDepthTexture = this.attachment("Renderer3DReflectionDepth", width, height, {
40096
+ format: "depth24plus",
40097
+ sampleCount: this.sampleCount,
40098
+ usage: GPUTextureUsage.RENDER_ATTACHMENT
40099
+ });
39772
40100
  return this.reflectionDepthTexture;
39773
40101
  }
39774
40102
  getOrCreateReflectionTempTexture(width, height) {
39775
- if (!this.reflectionTempTexture || this.reflectionTempTexture.width !== width || this.reflectionTempTexture.height !== height) {
39776
- this.reflectionTempTexture?.destroy();
39777
- this.reflectionTempTexture = this.device.createTexture({
39778
- label: "Renderer3DReflectionTemp",
39779
- size: {
39780
- width,
39781
- height
39782
- },
39783
- format: this.format,
39784
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
39785
- });
39786
- }
40103
+ this.reflectionTempTexture = this.attachment("Renderer3DReflectionTemp", width, height, {
40104
+ format: this.format,
40105
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
40106
+ });
39787
40107
  return this.reflectionTempTexture;
39788
40108
  }
39789
40109
  getOrCreateReflectionBlurredTexture(width, height) {
39790
- if (!this.reflectionBlurredTexture || this.reflectionBlurredTexture.width !== width || this.reflectionBlurredTexture.height !== height) {
39791
- this.reflectionBlurredTexture?.destroy();
39792
- this.reflectionBlurredTexture = this.device.createTexture({
39793
- label: "Renderer3DReflectionBlurred",
39794
- size: {
39795
- width,
39796
- height
39797
- },
39798
- format: this.format,
39799
- usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
39800
- });
39801
- }
40110
+ this.reflectionBlurredTexture = this.attachment("Renderer3DReflectionBlurred", width, height, {
40111
+ format: this.format,
40112
+ usage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING
40113
+ });
39802
40114
  return this.reflectionBlurredTexture;
39803
40115
  }
39804
40116
  packCameraUniforms(camera, surfaceWidth, surfaceHeight, time$2 = 0) {
@@ -40080,16 +40392,22 @@ var Renderer3D = class {
40080
40392
  storeOp: "store",
40081
40393
  clearValue
40082
40394
  };
40083
- if (msaa) this.msaaColorTexture = this.getOrCreateMsaaTexture(this.msaaColorTexture, "Renderer3DMsaaColor", this.format, surfaceWidth, surfaceHeight);
40395
+ if (msaa) this.msaaColorTexture = this.getOrCreateMsaaTexture(this.msaaColorTexture, "Renderer3DMsaaColor", this.format, surfaceWidth, surfaceHeight, Boolean(world?.environment?.outlines));
40084
40396
  const colorAttachments = [attach(colorTargetView, msaa ? this.msaaColorTexture : null, clearColor, loadOp)];
40397
+ if (msaa && world?.environment?.outlines) colorAttachments[0].storeOp = "store";
40085
40398
  if (linearDepthTargetView) {
40086
- if (msaa) this.msaaLinearDepthTexture = this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture, "Renderer3DMsaaLinearDepth", "rgba16float", surfaceWidth, surfaceHeight);
40087
- colorAttachments.push(attach(linearDepthTargetView, msaa ? this.msaaLinearDepthTexture : null, {
40088
- r: camera.far,
40089
- g: 0,
40090
- b: 0,
40091
- a: 1
40092
- }, "clear"));
40399
+ if (msaa) this.msaaLinearDepthTexture = this.getOrCreateMsaaTexture(this.msaaLinearDepthTexture, "Renderer3DMsaaLinearDepth", "rgba16float", surfaceWidth, surfaceHeight, true);
40400
+ const geometryAttachment = attach(linearDepthTargetView, msaa ? this.msaaLinearDepthTexture : null, {
40401
+ r: Math.min(camera.far, 65504),
40402
+ g: .5,
40403
+ b: .5,
40404
+ a: 0
40405
+ }, "clear");
40406
+ if (msaa && world?.environment?.outlines) {
40407
+ geometryAttachment.resolveTarget = void 0;
40408
+ geometryAttachment.storeOp = "store";
40409
+ }
40410
+ colorAttachments.push(geometryAttachment);
40093
40411
  }
40094
40412
  this.passWritesHdr = writeHdr;
40095
40413
  if (writeHdr) {
@@ -40180,8 +40498,9 @@ var Renderer3D = class {
40180
40498
  this.floorReflectionPipeline.draw(pass, cameraBindGroup, lightsBindGroup, reflectionTexture, floor, useMrt, useBloom);
40181
40499
  }
40182
40500
  /**
40183
- * A layer's unit quad ([-0.5, 0.5] square) in world space:
40184
- * T(pos) * Rz * Ry * Rx * S(w * sx, h * sy, sz) * T(0.5 - ax, 0.5 - ay, 0).
40501
+ * A centered unit quad in world space. Translate to the authored pivot,
40502
+ * rotate and scale, then offset the unit quad back from that pivot.
40503
+ * Shared with children in preserve-3d containers.
40185
40504
  */
40186
40505
  quadModelMatrix(opts) {
40187
40506
  if (opts.modelMatrix) return opts.modelMatrix;
@@ -40195,7 +40514,7 @@ var Renderer3D = class {
40195
40514
  1
40196
40515
  ], anchor = [.5, .5] } = opts;
40197
40516
  let m = Matrix4Math.identity();
40198
- m = Matrix4Math.multiply(m, Matrix4Math.translate(position[0], position[1], position[2]));
40517
+ m = Matrix4Math.multiply(m, Matrix4Math.translate(position[0] + (anchor[0] - .5) * width, position[1] + (anchor[1] - .5) * height, position[2]));
40199
40518
  const rxRad = rotation[0] * Math.PI / 180;
40200
40519
  const ryRad = rotation[1] * Math.PI / 180;
40201
40520
  const rzRad = rotation[2] * Math.PI / 180;
@@ -40260,6 +40579,8 @@ var Renderer3D = class {
40260
40579
  metallic: opts.metallic,
40261
40580
  emissive: opts.emissive,
40262
40581
  emissiveIntensity: opts.emissiveIntensity,
40582
+ toon: opts.toon,
40583
+ outline: opts.outline,
40263
40584
  matte: opts.matte
40264
40585
  }, useMrt, this.passWritesHdr);
40265
40586
  }
@@ -40305,6 +40626,8 @@ var Renderer3D = class {
40305
40626
  metallic,
40306
40627
  emissive: opts.emissive,
40307
40628
  emissiveIntensity: opts.emissiveIntensity,
40629
+ toon: opts.toon,
40630
+ outline: opts.outline,
40308
40631
  matte: opts.matte,
40309
40632
  relief: opts.relief
40310
40633
  }, useMrt, this.passWritesHdr);
@@ -40548,6 +40871,8 @@ var Renderer3D = class {
40548
40871
  metallic,
40549
40872
  emissive: opts.emissive,
40550
40873
  emissiveIntensity: opts.emissiveIntensity,
40874
+ toon: opts.toon,
40875
+ outline: opts.outline,
40551
40876
  matte: opts.matte,
40552
40877
  maps: opts.maps,
40553
40878
  isInstanced: Boolean(opts.instanceBuffer || opts.instanceCount && opts.instanceCount > 1),
@@ -40702,6 +41027,23 @@ var Renderer3D = class {
40702
41027
  this.bloomPipeline ??= new BloomPipeline(this.device);
40703
41028
  this.bloomPipeline.apply(encoder, source, dest, options, hdrSource ?? void 0);
40704
41029
  }
41030
+ /** Geometry ink is applied before lens blur, independently of material shading. */
41031
+ resolveGeometry(encoder, geometry) {
41032
+ if (this.sampleCount <= 1 || !this.msaaLinearDepthTexture) return;
41033
+ this.geometryResolvePipeline ??= new GeometryResolvePipeline(this.device);
41034
+ this.geometryResolvePipeline.render(encoder, this.msaaLinearDepthTexture, geometry.createView());
41035
+ }
41036
+ applyOutlines(encoder, source, geometry, dest, camera, options, fog) {
41037
+ let colorSource = source;
41038
+ let geometrySource = geometry;
41039
+ if (this.sampleCount > 1) {
41040
+ if (!this.msaaColorTexture || !this.msaaLinearDepthTexture) throw new Error("Geometry outlines require the scene's retained MSAA color and geometry samples");
41041
+ colorSource = this.msaaColorTexture;
41042
+ geometrySource = this.msaaLinearDepthTexture;
41043
+ }
41044
+ this.outlinePipeline ??= new GeometryOutlinePipeline(this.device, this.format, this.sampleCount);
41045
+ this.outlinePipeline.render(encoder, colorSource, geometrySource, dest, camera, options, fog);
41046
+ }
40705
41047
  applyDepthOfField(encoder, sourceColorTex, depthTex, destView, cameraBuffer) {
40706
41048
  const sampler = this.samplerCache.getSampler(this.device);
40707
41049
  const bindGroup = this.device.createBindGroup({
@@ -40754,7 +41096,10 @@ var Renderer3D = class {
40754
41096
  }, useMrt);
40755
41097
  }
40756
41098
  destroy() {
41099
+ for (const texture of this.attachments.values()) texture.destroy();
41100
+ this.attachments.clear();
40757
41101
  this.bloomPipeline?.destroy();
41102
+ this.outlinePipeline?.destroy();
40758
41103
  this.depthTexture?.destroy();
40759
41104
  for (const texture of this.shadowTextures.values()) texture.destroy();
40760
41105
  this.shadowTextures.clear();
@@ -41786,4 +42131,4 @@ if (typeof globalThis !== "undefined") globalThis.__GATEWAI_DELAYS__ = globalThi
41786
42131
 
41787
42132
  //#endregion
41788
42133
  export { poseNodes as $, TextAnchorConfigSchema as $t, emojiGraphemes as A, evaluateSkewMatrix as An, AnimatableGlyphPropsSchema as At, jointMatrices as B, sampleCurveGeometry as Bn, GlyphAnchorPointSchema as Bt, drawGifNode as C, distanceToCurveParameter as Cn, parseColorToRgb as Ct, drawSignalNode as D, evaluateExpressionSelector as Dn, AdvancedTextAnimatorSchema as Dt, drawParagraphNode as E, evaluateCubicBezierDerivative as En, AdvancedTextAnimatorBuilder as Et, getPrimitiveGeometry as F, generatePathSegments as Fn, DynamicStrokePropertiesSchema as Ft, measureMaxCaptionHeight as G, SelectorBasedOnSchema as Gt, loadModel3D as H, signalRegistry as Hn, LineSpacingDynamicsSchema as Ht, getRegisteredFontSource as I, getScramblePool as In, EnhancedTextNodeSchema as It, parseDashArray as J, SelectorUnitsSchema as Jt, mediaDecoderCache as K, SelectorModeSchema as Kt, getRenderer2D as L, getShuffledOrder as Ln, ExpressionSelectorSchema as Lt, fitSpansToText as M, evaluateTypewriterState as Mn, AudioSpectrumTypographySchema as Mt, generateExtrudedTextGeometry as N, evaluateVolumetricFormation as Nn, ChromaticGlitchConfigSchema as Nt, drawSvgNode as O, evaluateMarqueeOffset as On, AnchorGroupingSchema as Ot, getHeadlessFontPath as P, generateArcLengthLUT as Pn, CubicBezierSegmentSchema as Pt, parseSvgPathToSegments as Q, SpringPhysicsSchema as Qt, initHeadlessWebGPU as R, parseSvgPathToCubicBeziers as Rn, ExtendedGlyphPropertiesSchema as Rt, drawCaptionNode as S, deterministicWigglyNoise as Sn, linearRgb as St, drawLottieNode as T, evaluateCubicBezier as Tn, AETextAnimatorSchema as Tt, loadOBJ as U, waveToCubicBeziers as Un, LongShadowConfigSchema as Ut, loadFBX as V, samplePathChainGeometry as Vn, KineticMarqueeConfigSchema as Vt, lutStore as W, ParticleDissolveConfigSchema as Wt, parseMTL as X, SkewPropertiesSchema as Xt, parseFBX as Y, SignalRegistry as Yt, parseOBJ as Z, Spatial3DPropertiesSchema as Zt, buildShapeSvgPath as _, buildPathLUT as _n, Light3D as _t, GlassPipeline as a, TextPathSourceSchema as an, setRegisteredFontSource as at, colorMatrixWgsl as b, computeLineLeadingDisplacement as bn, Path3D as bt, Renderer2D as c, TextSelectorSchema as cn, srtLoader as ct, ScreenSpaceRelightPipeline as d, TypewriterAnimatorSchema as dn, transformScale as dt, TextAnimatorBuilder as en, probeVideoSize as et, ShadowPipeline as f, TypingCadenceSchema as fn, GetFontAssetUrl as ft, WebGPUAudioProcessor as g, VolumetricFormationModeSchema as gn, LIGHT_UNIFORM_SIZE_BYTES as gt, SlugPipeline as h, VolumetricFormationConfigSchema as hn, ENVIRONMENT_PRESETS as ht, EffectPipeline as i, TextPathOptionsSchema as in, sampleMorphWeights as it, ensureDevice as j, evaluateSpringProgress as jn, AudioSignalComputePipeline as jt, drawVideoNode as k, evaluateSelectorCombination as kn, AnchorPresetSchema as kt, Renderer3D as l, TextSignalSelectorSchema as ln, textureCache as lt, SlugGeometry as m, Vec2Schema as mn, Camera3D as mt, AudioLatentTrackCache as n, TextCursorStyleSchema as nn, resolveInputUrl as nt, MotionBlurPipeline as o, TextRangeSelectorSchema as on, shaderStore as ot, SlugFontCache as p, VariableFontAxesSchema as pn, resolveMediaSourceUrl as pt, parseColor as q, SelectorShapeSchema as qt, AudioMeshDeformPipeline as r, TextPathBuilder as rn, resolveTextSpans as rt, NodeSurfaceProvider as s, TextScrambleConfigSchema as sn, spansText as st, AudioLatentEngine as t, TextCursorConfigSchema as tn, registerHeadlessFont as tt, SSAOPipeline as u, TextWigglySelectorSchema as un, trackAudioPitch as ut, clearAllVideoCache as v, buildWGSLSignalFn as vn, MAX_LIGHTS as vt, drawImageNode as w, ellipseToCubicBeziers as wn, resolveEnvironment as wt, describeGpu as x, computeRangeSelectorWeight as xn, Vector3Math as xt, clearHeadlessFonts as y, computeAnchorPivotOffset as yn, Matrix4Math as yt, inputStore as z, sampleAudioSpectrumScale as zn, GlyphAnchorGroupingSchema as zt };
41789
- //# sourceMappingURL=dist-DtPPPsZV.mjs.map
42134
+ //# sourceMappingURL=dist--Uu5bQ_6.mjs.map