shaders 2.2.24 → 2.2.25

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 (193) hide show
  1. package/dist/core/AngularBlur-Dl2gwk68.js +64 -0
  2. package/dist/core/Ascii-Dha_QpT3.js +286 -0
  3. package/dist/core/Beam-CTN9Ni43.js +139 -0
  4. package/dist/core/Blob-CxFDZovO.js +218 -0
  5. package/dist/core/Blur-Y2FsmFk_.js +77 -0
  6. package/dist/core/Bulge-Cb-t0xqI.js +132 -0
  7. package/dist/core/CRTScreen-CtERsenz.js +112 -0
  8. package/dist/core/ChannelBlur-CvM6GJgZ.js +118 -0
  9. package/dist/core/Checkerboard-CgB-egNY.js +83 -0
  10. package/dist/core/ChromaFlow-vRCwhQpN.js +222 -0
  11. package/dist/core/ChromaticAberration-FTquTQIL.js +88 -0
  12. package/dist/core/Circle-Daziv5d7.js +67 -0
  13. package/dist/core/CursorTrail-Bsz9e6Fn.js +145 -0
  14. package/dist/core/DiffuseBlur-Cj2PtRNd.js +83 -0
  15. package/dist/core/Dither-D2Nf4p3w.js +66 -0
  16. package/dist/core/DotGrid-CzOwquo4.js +75 -0
  17. package/dist/core/Duotone-XuTN9tI7.js +65 -0
  18. package/dist/core/FilmGrain-D3-nbi12.js +28 -0
  19. package/dist/core/FloatingParticles-D9Nnu1qg.js +217 -0
  20. package/dist/core/GlassTiles-CnjCvajI.js +69 -0
  21. package/dist/core/Glow-BluFc9be.js +75 -0
  22. package/dist/core/Godrays-ChLh_vGl.js +144 -0
  23. package/dist/core/Grayscale-DRny75A9.js +20 -0
  24. package/dist/core/Grid-DgyDa4H1.js +58 -0
  25. package/dist/core/GridDistortion-BAspCYvp.js +188 -0
  26. package/dist/core/Group-Dul7PUBl.js +14 -0
  27. package/dist/core/Halftone-Ifv5F_FT.js +65 -0
  28. package/dist/core/HueShift-De8ukMWs.js +31 -0
  29. package/dist/core/ImageTexture-DvYcQgJB.js +143 -0
  30. package/dist/core/Invert-Fz0NtIJc.js +21 -0
  31. package/dist/core/LinearBlur-LmhnQoA4.js +62 -0
  32. package/dist/core/LinearGradient-xbloQjzt.js +133 -0
  33. package/dist/core/Liquify-DMe1V5-O.js +175 -0
  34. package/dist/core/Pixelate-Cv8537Pj.js +37 -0
  35. package/dist/core/PolarCoordinates-DDvDhBE-.js +112 -0
  36. package/dist/core/Posterize-3m3xkWOz.js +29 -0
  37. package/dist/core/ProgressiveBlur-EGkevObV.js +121 -0
  38. package/dist/core/RadialGradient-B7ZZB_VJ.js +71 -0
  39. package/dist/core/RectangularCoordinates-muWR8mZS.js +101 -0
  40. package/dist/core/Ripples-8XaZaXQF.js +117 -0
  41. package/dist/core/Saturation-CYFI1jzN.js +30 -0
  42. package/dist/core/SimplexNoise-DJUe0wz_.js +99 -0
  43. package/dist/core/SineWave-Dl3nFO1W.js +120 -0
  44. package/dist/core/SolidColor-CWGq_Bjq.js +21 -0
  45. package/dist/core/Spherize-C-jZEUsN.js +128 -0
  46. package/dist/core/Spiral-BSB_R39p.js +132 -0
  47. package/dist/core/Strands-0stO5BMy.js +161 -0
  48. package/dist/core/Stretch-B645paha.js +133 -0
  49. package/dist/core/Swirl-CVnbawit.js +173 -0
  50. package/dist/core/TiltShift-0CxNRI6L.js +134 -0
  51. package/dist/core/Tritone-Daa-I5UD.js +76 -0
  52. package/dist/core/Twirl-2CJVZEtk.js +96 -0
  53. package/dist/core/Vibrance-DRtecEvb.js +30 -0
  54. package/dist/core/WaveDistortion-BscXN2rs.js +173 -0
  55. package/dist/core/ZoomBlur-CAqK0Kju.js +62 -0
  56. package/dist/core/colorMixing-BXiTAqJU.js +69 -0
  57. package/dist/core/edges-Bn_OIa_h.js +26 -0
  58. package/dist/core/index.js +2257 -1606
  59. package/dist/core/shaders/AngularBlur/index.js +3 -7
  60. package/dist/core/shaders/Ascii/index.js +2 -6
  61. package/dist/core/shaders/Beam/index.js +4 -8
  62. package/dist/core/shaders/Blob/index.js +5 -9
  63. package/dist/core/shaders/Blur/index.js +2 -6
  64. package/dist/core/shaders/Bulge/index.js +4 -8
  65. package/dist/core/shaders/CRTScreen/index.js +2 -6
  66. package/dist/core/shaders/ChannelBlur/index.js +2 -6
  67. package/dist/core/shaders/Checkerboard/index.js +4 -8
  68. package/dist/core/shaders/ChromaFlow/index.js +3 -7
  69. package/dist/core/shaders/ChromaticAberration/index.js +3 -7
  70. package/dist/core/shaders/Circle/index.js +3 -7
  71. package/dist/core/shaders/CursorTrail/index.js +4 -8
  72. package/dist/core/shaders/DiffuseBlur/index.js +4 -8
  73. package/dist/core/shaders/Dither/index.js +3 -7
  74. package/dist/core/shaders/DotGrid/index.js +3 -7
  75. package/dist/core/shaders/Duotone/index.js +4 -8
  76. package/dist/core/shaders/FilmGrain/index.js +2 -6
  77. package/dist/core/shaders/FloatingParticles/index.js +3 -7
  78. package/dist/core/shaders/GlassTiles/index.js +2 -6
  79. package/dist/core/shaders/Glow/index.js +2 -6
  80. package/dist/core/shaders/Godrays/index.js +3 -7
  81. package/dist/core/shaders/Grayscale/index.js +2 -8
  82. package/dist/core/shaders/Grid/index.js +3 -7
  83. package/dist/core/shaders/GridDistortion/index.js +4 -8
  84. package/dist/core/shaders/Group/index.js +2 -6
  85. package/dist/core/shaders/Halftone/index.js +3 -7
  86. package/dist/core/shaders/HueShift/index.js +2 -8
  87. package/dist/core/shaders/ImageTexture/index.js +2 -6
  88. package/dist/core/shaders/Invert/index.js +2 -6
  89. package/dist/core/shaders/LinearBlur/index.js +3 -7
  90. package/dist/core/shaders/LinearGradient/index.js +4 -8
  91. package/dist/core/shaders/Liquify/index.js +4 -8
  92. package/dist/core/shaders/Pixelate/index.js +2 -6
  93. package/dist/core/shaders/PolarCoordinates/index.js +4 -8
  94. package/dist/core/shaders/Posterize/index.js +2 -7
  95. package/dist/core/shaders/ProgressiveBlur/index.js +3 -7
  96. package/dist/core/shaders/RadialGradient/index.js +4 -8
  97. package/dist/core/shaders/RectangularCoordinates/index.js +4 -8
  98. package/dist/core/shaders/Ripples/index.js +5 -9
  99. package/dist/core/shaders/Saturation/index.js +2 -8
  100. package/dist/core/shaders/SimplexNoise/index.js +5 -9
  101. package/dist/core/shaders/SineWave/index.js +3 -7
  102. package/dist/core/shaders/SolidColor/index.js +3 -7
  103. package/dist/core/shaders/Spherize/index.js +3 -7
  104. package/dist/core/shaders/Spiral/index.js +4 -8
  105. package/dist/core/shaders/Strands/index.js +4 -8
  106. package/dist/core/shaders/Stretch/index.js +4 -8
  107. package/dist/core/shaders/Swirl/index.js +5 -9
  108. package/dist/core/shaders/TiltShift/index.js +3 -7
  109. package/dist/core/shaders/Tritone/index.js +4 -8
  110. package/dist/core/shaders/Twirl/index.js +4 -8
  111. package/dist/core/shaders/Vibrance/index.js +2 -8
  112. package/dist/core/shaders/WaveDistortion/index.js +4 -8
  113. package/dist/core/shaders/ZoomBlur/index.js +3 -7
  114. package/dist/core/telemetry/index.js +189 -157
  115. package/dist/core/time-CTJvRUZ4.js +10 -0
  116. package/dist/core/transformations-DxfQXZWi.js +4715 -0
  117. package/dist/react/generatePresetCode-CCibXbtZ.js +645 -0
  118. package/dist/react/index.js +7645 -104827
  119. package/dist/react/utils/generatePresetCode.js +2 -5
  120. package/dist/solid/index.js +6670 -102727
  121. package/dist/solid/utils/generatePresetCode.js +583 -554
  122. package/dist/svelte/generatePresetCode-CymgoDq_.js +645 -0
  123. package/dist/svelte/index.js +6175 -102645
  124. package/dist/svelte/utils/generatePresetCode.js +2 -5
  125. package/dist/vue/generatePresetCode-CRJmU8iF.js +649 -0
  126. package/dist/vue/index.js +6929 -103706
  127. package/dist/vue/utils/generatePresetCode.js +2 -5
  128. package/package.json +4 -1
  129. package/dist/core/AngularBlur-ClvtyURQ.js +0 -56
  130. package/dist/core/Ascii-BT0-K_vw.js +0 -196
  131. package/dist/core/Beam-BAKql1AP.js +0 -116
  132. package/dist/core/Blob-CVSxhHJG.js +0 -169
  133. package/dist/core/Blur-C1TTBHCX.js +0 -64
  134. package/dist/core/Bulge-DV8tX-cw.js +0 -103
  135. package/dist/core/CRTScreen-VTJQoOeq.js +0 -91
  136. package/dist/core/ChannelBlur-BLZ9kBNA.js +0 -89
  137. package/dist/core/Checkerboard-DQ4Df3vm.js +0 -75
  138. package/dist/core/ChromaFlow-BggN1_Av.js +0 -134
  139. package/dist/core/ChromaticAberration-DlTaHNcp.js +0 -82
  140. package/dist/core/Circle-B9ObWlq5.js +0 -62
  141. package/dist/core/ColorAdjustment-FeXXpypd.js +0 -14
  142. package/dist/core/CursorTrail-C7QdUj8O.js +0 -105
  143. package/dist/core/DiffuseBlur-Mx6LBsqz.js +0 -69
  144. package/dist/core/Dither-CeIdV_9C.js +0 -61
  145. package/dist/core/DotGrid-D6xUvYrt.js +0 -61
  146. package/dist/core/Duotone-C2Pqt2gR.js +0 -66
  147. package/dist/core/FilmGrain-CJ9n_fgk.js +0 -28
  148. package/dist/core/FloatingParticles-iGtMs44K.js +0 -160
  149. package/dist/core/GlassTiles-D_lVyag2.js +0 -52
  150. package/dist/core/Glow-B0jj-6OC.js +0 -66
  151. package/dist/core/Godrays-DjLVuZa4.js +0 -105
  152. package/dist/core/Grayscale-BbsdDa_X.js +0 -21
  153. package/dist/core/Grid-ByjU-_ua.js +0 -50
  154. package/dist/core/GridDistortion-C_eIlhkW.js +0 -147
  155. package/dist/core/Group-CyaDLGpI.js +0 -17
  156. package/dist/core/Halftone-BvuAe_k-.js +0 -55
  157. package/dist/core/HueShift-B_qE9c08.js +0 -32
  158. package/dist/core/ImageTexture-h00TFC1l.js +0 -105
  159. package/dist/core/Invert-BEDDB0sm.js +0 -20
  160. package/dist/core/LinearBlur-CLKxuyeT.js +0 -56
  161. package/dist/core/LinearGradient-BPo8TX_M.js +0 -111
  162. package/dist/core/Liquify-DGkfeixZ.js +0 -139
  163. package/dist/core/Pixelate-Bzy_7LnJ.js +0 -38
  164. package/dist/core/PolarCoordinates-BUumPeTv.js +0 -103
  165. package/dist/core/Posterize-ggKIJlmm.js +0 -46
  166. package/dist/core/ProgressiveBlur-D6_6T7SS.js +0 -102
  167. package/dist/core/RadialGradient-DEY9fRqa.js +0 -71
  168. package/dist/core/RectangularCoordinates-CZ-cFrCh.js +0 -92
  169. package/dist/core/Ripples-BwNlcsnV.js +0 -106
  170. package/dist/core/Saturation-Dl3gCWuZ.js +0 -31
  171. package/dist/core/SimplexNoise-BhE_WyGt.js +0 -94
  172. package/dist/core/SineWave-Db_Y0Mcv.js +0 -107
  173. package/dist/core/SolidColor-CerOp4EQ.js +0 -22
  174. package/dist/core/Spherize-Dh8E5XwG.js +0 -103
  175. package/dist/core/Spiral-BvygQEfP.js +0 -115
  176. package/dist/core/Strands-maaPn4On.js +0 -125
  177. package/dist/core/Stretch-CnA0-nSz.js +0 -103
  178. package/dist/core/Swirl-CQBUahTB.js +0 -148
  179. package/dist/core/TSLBase-Bt7Z4hv_.js +0 -8053
  180. package/dist/core/TiltShift-qFj0oFzN.js +0 -114
  181. package/dist/core/Tritone-AiixmTg8.js +0 -75
  182. package/dist/core/Twirl-ooHQcV89.js +0 -82
  183. package/dist/core/Vibrance-C2FRlLkK.js +0 -31
  184. package/dist/core/WaveDistortion-CN8MjKlm.js +0 -132
  185. package/dist/core/ZoomBlur-CxWGx8PH.js +0 -56
  186. package/dist/core/colorMixing--dhzx0ch.js +0 -21
  187. package/dist/core/edges-CDzKsauJ.js +0 -15
  188. package/dist/core/three.tsl-Btj1hLsf.js +0 -43845
  189. package/dist/core/time-DbRMw6Jm.js +0 -10
  190. package/dist/core/transformations-CsrIJXh-.js +0 -3992
  191. package/dist/react/generatePresetCode-CVj6IV8Y.js +0 -646
  192. package/dist/svelte/generatePresetCode-CVj6IV8Y.js +0 -646
  193. package/dist/vue/generatePresetCode-DCaIsDhE.js +0 -652
@@ -1,1650 +1,2301 @@
1
- import { B as Nn, C as Vn, E as R, F as He, I as qn, L as Pn, M as S, N as ye, O as le, P as ln, R as Xn, T as Se, V as Yn, _ as l, b as W, c as In, d as j, g as Me, h as We, i as Hn, j as N, k as G, l as bn, m as je, n as y, o as Wn, s as jn, t as Qn, w as vn, x as de, z as Jn } from "./three.tsl-Btj1hLsf.js";
2
- import { n as re, t as he } from "./edges-CDzKsauJ.js";
3
- import { t as Jr } from "./time-DbRMw6Jm.js";
4
- import "./transformations-CsrIJXh-.js";
5
- import { n as Zn } from "./AngularBlur-ClvtyURQ.js";
6
- import { n as Kn } from "./Ascii-BT0-K_vw.js";
7
- import "./colorMixing--dhzx0ch.js";
8
- import { n as et } from "./Beam-BAKql1AP.js";
9
- import { n as nt } from "./Blob-CVSxhHJG.js";
10
- import { n as tt } from "./Blur-C1TTBHCX.js";
11
- import { n as rt } from "./Bulge-DV8tX-cw.js";
12
- import { n as ot } from "./ChannelBlur-BLZ9kBNA.js";
13
- import { n as it } from "./Checkerboard-DQ4Df3vm.js";
14
- import { n as at } from "./ChromaFlow-BggN1_Av.js";
15
- import { n as st } from "./ChromaticAberration-DlTaHNcp.js";
16
- import { n as lt } from "./Circle-B9ObWlq5.js";
17
- import { n as ct } from "./CRTScreen-VTJQoOeq.js";
18
- import { n as ft } from "./CursorTrail-C7QdUj8O.js";
19
- import { n as ut } from "./DiffuseBlur-Mx6LBsqz.js";
20
- import { n as mt } from "./Dither-CeIdV_9C.js";
21
- import { n as dt } from "./DotGrid-D6xUvYrt.js";
22
- import { n as ht } from "./Duotone-C2Pqt2gR.js";
23
- import { n as pt } from "./FilmGrain-CJ9n_fgk.js";
24
- import { n as gt } from "./FloatingParticles-iGtMs44K.js";
25
- import { n as bt } from "./GlassTiles-D_lVyag2.js";
26
- import { n as vt } from "./Glow-B0jj-6OC.js";
27
- import { n as Ct } from "./Godrays-DjLVuZa4.js";
28
- import "./TSLBase-Bt7Z4hv_.js";
29
- import "./ColorAdjustment-FeXXpypd.js";
30
- import { n as Rt } from "./Grayscale-BbsdDa_X.js";
31
- import { n as kt } from "./Grid-ByjU-_ua.js";
32
- import { n as Tt } from "./GridDistortion-C_eIlhkW.js";
33
- import { n as yt } from "./Group-CyaDLGpI.js";
34
- import { n as wt } from "./Halftone-BvuAe_k-.js";
35
- import { n as Ut } from "./HueShift-B_qE9c08.js";
36
- import { n as St } from "./ImageTexture-h00TFC1l.js";
37
- import { n as Mt } from "./Invert-BEDDB0sm.js";
38
- import { n as xt } from "./LinearBlur-CLKxuyeT.js";
39
- import { n as At } from "./LinearGradient-BPo8TX_M.js";
40
- import { n as Dt } from "./Liquify-DGkfeixZ.js";
41
- import { n as zt } from "./Pixelate-Bzy_7LnJ.js";
42
- import { n as Et } from "./PolarCoordinates-BUumPeTv.js";
43
- import { n as Ft } from "./Posterize-ggKIJlmm.js";
44
- import { n as $t } from "./ProgressiveBlur-D6_6T7SS.js";
45
- import { n as Ot } from "./RadialGradient-DEY9fRqa.js";
46
- import { n as Bt } from "./RectangularCoordinates-CZ-cFrCh.js";
47
- import { n as _t } from "./Ripples-BwNlcsnV.js";
48
- import { n as Lt } from "./Saturation-Dl3gCWuZ.js";
49
- import { n as Gt } from "./SimplexNoise-BhE_WyGt.js";
50
- import { n as Nt } from "./SineWave-Db_Y0Mcv.js";
51
- import { n as Vt } from "./SolidColor-CerOp4EQ.js";
52
- import { n as qt } from "./Spherize-Dh8E5XwG.js";
53
- import { n as Pt } from "./Spiral-BvygQEfP.js";
54
- import { n as Xt } from "./Strands-maaPn4On.js";
55
- import { n as Yt } from "./Stretch-CnA0-nSz.js";
56
- import { n as It } from "./Swirl-CQBUahTB.js";
57
- import { n as Ht } from "./TiltShift-qFj0oFzN.js";
58
- import { n as Wt } from "./Tritone-AiixmTg8.js";
59
- import { n as jt } from "./Twirl-ooHQcV89.js";
60
- import { n as Qt } from "./Vibrance-C2FRlLkK.js";
61
- import { n as Jt } from "./WaveDistortion-CN8MjKlm.js";
62
- import { n as Zt } from "./ZoomBlur-CxWGx8PH.js";
63
- import { WebGLRenderer as Kt } from "three";
64
- function er(e, n, s = 1) {
65
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
66
- return S(y(l(n.rgb, t), l(e.rgb, l(e.a, R(1, t)))), u);
1
+ import { n as applyEdgeToUV, t as applyEdgeHandling } from "./edges-Bn_OIa_h.js";
2
+ import { t as createAnimatedTime } from "./time-CTJvRUZ4.js";
3
+ import "./transformations-DxfQXZWi.js";
4
+ import { n as componentDefinition } from "./AngularBlur-Dl2gwk68.js";
5
+ import { n as componentDefinition$1 } from "./Ascii-Dha_QpT3.js";
6
+ import "./colorMixing-BXiTAqJU.js";
7
+ import { n as componentDefinition$2 } from "./Beam-CTN9Ni43.js";
8
+ import { n as componentDefinition$3 } from "./Blob-CxFDZovO.js";
9
+ import { n as componentDefinition$4 } from "./Blur-Y2FsmFk_.js";
10
+ import { n as componentDefinition$5 } from "./Bulge-Cb-t0xqI.js";
11
+ import { n as componentDefinition$6 } from "./ChannelBlur-CvM6GJgZ.js";
12
+ import { n as componentDefinition$7 } from "./Checkerboard-CgB-egNY.js";
13
+ import { n as componentDefinition$8 } from "./ChromaFlow-vRCwhQpN.js";
14
+ import { n as componentDefinition$9 } from "./ChromaticAberration-FTquTQIL.js";
15
+ import { n as componentDefinition$10 } from "./Circle-Daziv5d7.js";
16
+ import { n as componentDefinition$11 } from "./CRTScreen-CtERsenz.js";
17
+ import { n as componentDefinition$12 } from "./CursorTrail-Bsz9e6Fn.js";
18
+ import { n as componentDefinition$13 } from "./DiffuseBlur-Cj2PtRNd.js";
19
+ import { n as componentDefinition$14 } from "./Dither-D2Nf4p3w.js";
20
+ import { n as componentDefinition$15 } from "./DotGrid-CzOwquo4.js";
21
+ import { n as componentDefinition$16 } from "./Duotone-XuTN9tI7.js";
22
+ import { n as componentDefinition$17 } from "./FilmGrain-D3-nbi12.js";
23
+ import { n as componentDefinition$18 } from "./FloatingParticles-D9Nnu1qg.js";
24
+ import { n as componentDefinition$19 } from "./GlassTiles-CnjCvajI.js";
25
+ import { n as componentDefinition$20 } from "./Glow-BluFc9be.js";
26
+ import { n as componentDefinition$21 } from "./Godrays-ChLh_vGl.js";
27
+ import { n as componentDefinition$22 } from "./Grayscale-DRny75A9.js";
28
+ import { n as componentDefinition$23 } from "./Grid-DgyDa4H1.js";
29
+ import { n as componentDefinition$24 } from "./GridDistortion-BAspCYvp.js";
30
+ import { n as componentDefinition$25 } from "./Group-Dul7PUBl.js";
31
+ import { n as componentDefinition$26 } from "./Halftone-Ifv5F_FT.js";
32
+ import { n as componentDefinition$27 } from "./HueShift-De8ukMWs.js";
33
+ import { n as componentDefinition$28 } from "./ImageTexture-DvYcQgJB.js";
34
+ import { n as componentDefinition$29 } from "./Invert-Fz0NtIJc.js";
35
+ import { n as componentDefinition$30 } from "./LinearBlur-LmhnQoA4.js";
36
+ import { n as componentDefinition$31 } from "./LinearGradient-xbloQjzt.js";
37
+ import { n as componentDefinition$32 } from "./Liquify-DMe1V5-O.js";
38
+ import { n as componentDefinition$33 } from "./Pixelate-Cv8537Pj.js";
39
+ import { n as componentDefinition$34 } from "./PolarCoordinates-DDvDhBE-.js";
40
+ import { n as componentDefinition$35 } from "./Posterize-3m3xkWOz.js";
41
+ import { n as componentDefinition$36 } from "./ProgressiveBlur-EGkevObV.js";
42
+ import { n as componentDefinition$37 } from "./RadialGradient-B7ZZB_VJ.js";
43
+ import { n as componentDefinition$38 } from "./RectangularCoordinates-muWR8mZS.js";
44
+ import { n as componentDefinition$39 } from "./Ripples-8XaZaXQF.js";
45
+ import { n as componentDefinition$40 } from "./Saturation-CYFI1jzN.js";
46
+ import { n as componentDefinition$41 } from "./SimplexNoise-DJUe0wz_.js";
47
+ import { n as componentDefinition$42 } from "./SineWave-Dl3nFO1W.js";
48
+ import { n as componentDefinition$43 } from "./SolidColor-CWGq_Bjq.js";
49
+ import { n as componentDefinition$44 } from "./Spherize-C-jZEUsN.js";
50
+ import { n as componentDefinition$45 } from "./Spiral-BSB_R39p.js";
51
+ import { n as componentDefinition$46 } from "./Strands-0stO5BMy.js";
52
+ import { n as componentDefinition$47 } from "./Stretch-B645paha.js";
53
+ import { n as componentDefinition$48 } from "./Swirl-CVnbawit.js";
54
+ import { n as componentDefinition$49 } from "./TiltShift-0CxNRI6L.js";
55
+ import { n as componentDefinition$50 } from "./Tritone-Daa-I5UD.js";
56
+ import { n as componentDefinition$51 } from "./Twirl-2CJVZEtk.js";
57
+ import { n as componentDefinition$52 } from "./Vibrance-DRtecEvb.js";
58
+ import { n as componentDefinition$53 } from "./WaveDistortion-BscXN2rs.js";
59
+ import { n as componentDefinition$54 } from "./ZoomBlur-CAqK0Kju.js";
60
+ import { Material, Mesh, MeshBasicNodeMaterial, OrthographicCamera, PlaneGeometry, SRGBColorSpace, Scene, WebGPURenderer } from "three/webgpu";
61
+ import { WebGLRenderer } from "three";
62
+ import * as TSL from "three/tsl";
63
+ import { abs, add, atan, convertToTexture, cos, div, dot, float, max, min, mix, mul, pow, screenUV, sin, sqrt, step, sub, uniform, vec3, vec4, viewportSize } from "three/tsl";
64
+ function normal_default(base, overlay, opacity = 1) {
65
+ const overlayAlpha = mul(overlay.a, opacity);
66
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
67
+ return vec4(add(mul(overlay.rgb, overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
67
68
  }
68
- var cn = (e) => N(e.x.mul(1.2249401).sub(e.y.mul(0.2249404)).sub(e.z.mul(0)), e.x.mul(-0.0420569).add(e.y.mul(1.0420571)).add(e.z.mul(0)), e.x.mul(-0.0196376).sub(e.y.mul(0.0786361)).add(e.z.mul(1.0982735))), nr = (e) => N(e.x.mul(0.8224621).add(e.y.mul(0.177538)).add(e.z.mul(0)), e.x.mul(0.0331941).add(e.y.mul(0.9668058)).add(e.z.mul(0)), e.x.mul(0.0170826).add(e.y.mul(0.0723974)).add(e.z.mul(0.9105199))), fn = (e) => {
69
- const n = e.x, s = e.y, t = e.z, u = n.mul(0.4122214708).add(s.mul(0.5363325363)).add(t.mul(0.0514459929)), p = n.mul(0.2119034982).add(s.mul(0.6806995451).add(t.mul(0.1073969566))), h = n.mul(0.0883024619).add(s.mul(0.2817188376)).add(t.mul(0.6299787005)), d = W(u, j(1 / 3)), k = W(p, j(1 / 3)), U = W(h, j(1 / 3));
70
- return N(d.mul(0.2104542553).add(k.mul(0.793617785)).sub(U.mul(0.0040720468)), d.mul(1.9779984951).sub(k.mul(2.428592205)).add(U.mul(0.4505937099)), d.mul(0.0259040371).add(k.mul(0.7827717662)).sub(U.mul(0.808675766)));
71
- }, tr = (e) => {
72
- const n = e.x, s = e.y, t = e.z, u = n.add(s.mul(0.3963377774)).add(t.mul(0.2158037573)), p = n.sub(s.mul(0.1055613458)).sub(t.mul(0.0638541728)), h = n.sub(s.mul(0.0894841775)).sub(t.mul(1.291485548)), d = W(u, j(3)), k = W(p, j(3)), U = W(h, j(3));
73
- return N(d.mul(4.0767416621).sub(k.mul(3.3077115913)).add(U.mul(0.2309699292)), d.mul(-1.2684380046).add(k.mul(2.6097574011)).sub(U.mul(0.3413193965)), d.mul(-0.0041960863).sub(k.mul(0.7034186147)).add(U.mul(1.707614701)));
74
- }, un = (e) => {
75
- const n = e.x, s = e.y, t = e.z;
76
- return N(n, vn(s.mul(s).add(t.mul(t))), Hn(t, s));
77
- }, rr = (e) => {
78
- const n = e.x, s = e.y, t = e.z;
79
- return N(n, s.mul(jn(t)), s.mul(Vn(t)));
69
+ var p3ToSRGB$1 = (p3) => {
70
+ return vec3(p3.x.mul(1.2249401).sub(p3.y.mul(.2249404)).sub(p3.z.mul(0)), p3.x.mul(-.0420569).add(p3.y.mul(1.0420571)).add(p3.z.mul(0)), p3.x.mul(-.0196376).sub(p3.y.mul(.0786361)).add(p3.z.mul(1.0982735)));
80
71
  };
81
- function or(e, n, s = 1) {
82
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t))), p = cn(N(e.r, e.g, e.b)), h = cn(N(n.r, n.g, n.b)), d = fn(p), k = fn(h), U = un(d);
83
- return S(nr(tr(rr(y(l(un(k), t), l(U, l(e.a, R(1, t))))))), u);
72
+ var sRGBToP3$1 = (srgb) => {
73
+ return vec3(srgb.x.mul(.8224621).add(srgb.y.mul(.177538)).add(srgb.z.mul(0)), srgb.x.mul(.0331941).add(srgb.y.mul(.9668058)).add(srgb.z.mul(0)), srgb.x.mul(.0170826).add(srgb.y.mul(.0723974)).add(srgb.z.mul(.9105199)));
74
+ };
75
+ var rgbToOklab$1 = (rgb) => {
76
+ const r = rgb.x;
77
+ const g = rgb.y;
78
+ const b = rgb.z;
79
+ const l = r.mul(.4122214708).add(g.mul(.5363325363)).add(b.mul(.0514459929));
80
+ const m = r.mul(.2119034982).add(g.mul(.6806995451).add(b.mul(.1073969566)));
81
+ const s = r.mul(.0883024619).add(g.mul(.2817188376)).add(b.mul(.6299787005));
82
+ const l_ = pow(l, float(1 / 3));
83
+ const m_ = pow(m, float(1 / 3));
84
+ const s_ = pow(s, float(1 / 3));
85
+ return vec3(l_.mul(.2104542553).add(m_.mul(.793617785)).sub(s_.mul(.0040720468)), l_.mul(1.9779984951).sub(m_.mul(2.428592205)).add(s_.mul(.4505937099)), l_.mul(.0259040371).add(m_.mul(.7827717662)).sub(s_.mul(.808675766)));
86
+ };
87
+ var oklabToRgb$1 = (lab) => {
88
+ const L = lab.x;
89
+ const a = lab.y;
90
+ const b = lab.z;
91
+ const l_ = L.add(a.mul(.3963377774)).add(b.mul(.2158037573));
92
+ const m_ = L.sub(a.mul(.1055613458)).sub(b.mul(.0638541728));
93
+ const s_ = L.sub(a.mul(.0894841775)).sub(b.mul(1.291485548));
94
+ const l = pow(l_, float(3));
95
+ const m = pow(m_, float(3));
96
+ const s = pow(s_, float(3));
97
+ return vec3(l.mul(4.0767416621).sub(m.mul(3.3077115913)).add(s.mul(.2309699292)), l.mul(-1.2684380046).add(m.mul(2.6097574011)).sub(s.mul(.3413193965)), l.mul(-.0041960863).sub(m.mul(.7034186147)).add(s.mul(1.707614701)));
98
+ };
99
+ var oklabToOklch = (lab) => {
100
+ const L = lab.x;
101
+ const a = lab.y;
102
+ const b = lab.z;
103
+ return vec3(L, sqrt(a.mul(a).add(b.mul(b))), atan(b, a));
104
+ };
105
+ var oklchToOklab = (lch) => {
106
+ const L = lch.x;
107
+ const C = lch.y;
108
+ const h = lch.z;
109
+ return vec3(L, C.mul(cos(h)), C.mul(sin(h)));
110
+ };
111
+ function normal_oklch_default(base, overlay, opacity = 1) {
112
+ const overlayAlpha = mul(overlay.a, opacity);
113
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
114
+ const baseSRGB = p3ToSRGB$1(vec3(base.r, base.g, base.b));
115
+ const overlaySRGB = p3ToSRGB$1(vec3(overlay.r, overlay.g, overlay.b));
116
+ const baseOklab = rgbToOklab$1(baseSRGB);
117
+ const overlayOklab = rgbToOklab$1(overlaySRGB);
118
+ const baseOklch = oklabToOklch(baseOklab);
119
+ return vec4(sRGBToP3$1(oklabToRgb$1(oklchToOklab(add(mul(oklabToOklch(overlayOklab), overlayAlpha), mul(baseOklch, mul(base.a, sub(1, overlayAlpha))))))), finalAlpha);
84
120
  }
85
- var mn = (e) => N(e.x.mul(1.2249401).sub(e.y.mul(0.2249404)).sub(e.z.mul(0)), e.x.mul(-0.0420569).add(e.y.mul(1.0420571)).add(e.z.mul(0)), e.x.mul(-0.0196376).sub(e.y.mul(0.0786361)).add(e.z.mul(1.0982735))), ir = (e) => N(e.x.mul(0.8224621).add(e.y.mul(0.177538)).add(e.z.mul(0)), e.x.mul(0.0331941).add(e.y.mul(0.9668058)).add(e.z.mul(0)), e.x.mul(0.0170826).add(e.y.mul(0.0723974)).add(e.z.mul(0.9105199))), dn = (e) => {
86
- const n = e.x, s = e.y, t = e.z, u = n.mul(0.4122214708).add(s.mul(0.5363325363)).add(t.mul(0.0514459929)), p = n.mul(0.2119034982).add(s.mul(0.6806995451).add(t.mul(0.1073969566))), h = n.mul(0.0883024619).add(s.mul(0.2817188376)).add(t.mul(0.6299787005)), d = W(u, j(1 / 3)), k = W(p, j(1 / 3)), U = W(h, j(1 / 3));
87
- return N(d.mul(0.2104542553).add(k.mul(0.793617785)).sub(U.mul(0.0040720468)), d.mul(1.9779984951).sub(k.mul(2.428592205)).add(U.mul(0.4505937099)), d.mul(0.0259040371).add(k.mul(0.7827717662)).sub(U.mul(0.808675766)));
88
- }, ar = (e) => {
89
- const n = e.x, s = e.y, t = e.z, u = n.add(s.mul(0.3963377774)).add(t.mul(0.2158037573)), p = n.sub(s.mul(0.1055613458)).sub(t.mul(0.0638541728)), h = n.sub(s.mul(0.0894841775)).sub(t.mul(1.291485548)), d = W(u, j(3)), k = W(p, j(3)), U = W(h, j(3));
90
- return N(d.mul(4.0767416621).sub(k.mul(3.3077115913)).add(U.mul(0.2309699292)), d.mul(-1.2684380046).add(k.mul(2.6097574011)).sub(U.mul(0.3413193965)), d.mul(-0.0041960863).sub(k.mul(0.7034186147)).add(U.mul(1.707614701)));
121
+ var p3ToSRGB = (p3) => {
122
+ return vec3(p3.x.mul(1.2249401).sub(p3.y.mul(.2249404)).sub(p3.z.mul(0)), p3.x.mul(-.0420569).add(p3.y.mul(1.0420571)).add(p3.z.mul(0)), p3.x.mul(-.0196376).sub(p3.y.mul(.0786361)).add(p3.z.mul(1.0982735)));
123
+ };
124
+ var sRGBToP3 = (srgb) => {
125
+ return vec3(srgb.x.mul(.8224621).add(srgb.y.mul(.177538)).add(srgb.z.mul(0)), srgb.x.mul(.0331941).add(srgb.y.mul(.9668058)).add(srgb.z.mul(0)), srgb.x.mul(.0170826).add(srgb.y.mul(.0723974)).add(srgb.z.mul(.9105199)));
126
+ };
127
+ var rgbToOklab = (rgb) => {
128
+ const r = rgb.x;
129
+ const g = rgb.y;
130
+ const b = rgb.z;
131
+ const l = r.mul(.4122214708).add(g.mul(.5363325363)).add(b.mul(.0514459929));
132
+ const m = r.mul(.2119034982).add(g.mul(.6806995451).add(b.mul(.1073969566)));
133
+ const s = r.mul(.0883024619).add(g.mul(.2817188376)).add(b.mul(.6299787005));
134
+ const l_ = pow(l, float(1 / 3));
135
+ const m_ = pow(m, float(1 / 3));
136
+ const s_ = pow(s, float(1 / 3));
137
+ return vec3(l_.mul(.2104542553).add(m_.mul(.793617785)).sub(s_.mul(.0040720468)), l_.mul(1.9779984951).sub(m_.mul(2.428592205)).add(s_.mul(.4505937099)), l_.mul(.0259040371).add(m_.mul(.7827717662)).sub(s_.mul(.808675766)));
91
138
  };
92
- function sr(e, n, s = 1) {
93
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t))), p = mn(N(e.r, e.g, e.b)), h = mn(N(n.r, n.g, n.b)), d = dn(p);
94
- return S(ir(ar(y(l(dn(h), t), l(d, l(e.a, R(1, t)))))), u);
139
+ var oklabToRgb = (lab) => {
140
+ const L = lab.x;
141
+ const a = lab.y;
142
+ const b = lab.z;
143
+ const l_ = L.add(a.mul(.3963377774)).add(b.mul(.2158037573));
144
+ const m_ = L.sub(a.mul(.1055613458)).sub(b.mul(.0638541728));
145
+ const s_ = L.sub(a.mul(.0894841775)).sub(b.mul(1.291485548));
146
+ const l = pow(l_, float(3));
147
+ const m = pow(m_, float(3));
148
+ const s = pow(s_, float(3));
149
+ return vec3(l.mul(4.0767416621).sub(m.mul(3.3077115913)).add(s.mul(.2309699292)), l.mul(-1.2684380046).add(m.mul(2.6097574011)).sub(s.mul(.3413193965)), l.mul(-.0041960863).sub(m.mul(.7034186147)).add(s.mul(1.707614701)));
150
+ };
151
+ function normal_oklab_default(base, overlay, opacity = 1) {
152
+ const overlayAlpha = mul(overlay.a, opacity);
153
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
154
+ const baseSRGB = p3ToSRGB(vec3(base.r, base.g, base.b));
155
+ const overlaySRGB = p3ToSRGB(vec3(overlay.r, overlay.g, overlay.b));
156
+ const baseOklab = rgbToOklab(baseSRGB);
157
+ return vec4(sRGBToP3(oklabToRgb(add(mul(rgbToOklab(overlaySRGB), overlayAlpha), mul(baseOklab, mul(base.a, sub(1, overlayAlpha)))))), finalAlpha);
95
158
  }
96
- function lr(e, n, s = 1) {
97
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
98
- return S(y(l(l(e.rgb, n.rgb), t), l(e.rgb, l(e.a, R(1, t)))), u);
159
+ function multiply_default(base, overlay, opacity = 1) {
160
+ const overlayAlpha = mul(overlay.a, opacity);
161
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
162
+ return vec4(add(mul(mul(base.rgb, overlay.rgb), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
99
163
  }
100
- function cr(e, n, s = 1) {
101
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
102
- return S(y(l(R(1, l(R(1, e.rgb), R(1, n.rgb))), t), l(e.rgb, l(e.a, R(1, t)))), u);
164
+ function screen_default(base, overlay, opacity = 1) {
165
+ const overlayAlpha = mul(overlay.a, opacity);
166
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
167
+ return vec4(add(mul(sub(1, mul(sub(1, base.rgb), sub(1, overlay.rgb))), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
103
168
  }
104
- function fr(e, n, s = 1) {
105
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
106
- return S(y(l(We(y(e.rgb, n.rgb), 1), t), l(e.rgb, l(e.a, R(1, t)))), u);
169
+ function linearDodge_default(base, overlay, opacity = 1) {
170
+ const overlayAlpha = mul(overlay.a, opacity);
171
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
172
+ return vec4(add(mul(min(add(base.rgb, overlay.rgb), 1), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
107
173
  }
108
- function ur(e, n, s = 1) {
109
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
110
- return S(y(l(Me(l(2, l(e.rgb, n.rgb)), R(1, l(2, l(R(1, e.rgb), R(1, n.rgb)))), Se(0.5, e.rgb)), t), l(e.rgb, l(e.a, R(1, t)))), u);
174
+ function overlay_default(base, overlay, opacity = 1) {
175
+ const overlayAlpha = mul(overlay.a, opacity);
176
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
177
+ return vec4(add(mul(mix(mul(2, mul(base.rgb, overlay.rgb)), sub(1, mul(2, mul(sub(1, base.rgb), sub(1, overlay.rgb)))), step(.5, base.rgb)), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
111
178
  }
112
- function mr(e, n, s = 1) {
113
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
114
- return S(y(l(Qn(R(e.rgb, n.rgb)), t), l(e.rgb, l(e.a, R(1, t)))), u);
179
+ function difference_default(base, overlay, opacity = 1) {
180
+ const overlayAlpha = mul(overlay.a, opacity);
181
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
182
+ return vec4(add(mul(abs(sub(base.rgb, overlay.rgb)), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
115
183
  }
116
- function dr(e, n, s = 1) {
117
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
118
- return S(y(l(Me(e.rgb, We(In(e.rgb, R(1, n.rgb)), 1), Se(1e-3, R(1, n.rgb))), t), l(e.rgb, l(e.a, R(1, t)))), u);
184
+ function colorDodge_default(base, overlay, opacity = 1) {
185
+ const overlayAlpha = mul(overlay.a, opacity);
186
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
187
+ return vec4(add(mul(mix(base.rgb, min(div(base.rgb, sub(1, overlay.rgb)), 1), step(.001, sub(1, overlay.rgb))), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
119
188
  }
120
- function hr(e, n, s = 1) {
121
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
122
- return S(y(l(R(y(e.rgb, n.rgb), l(2, l(e.rgb, n.rgb))), t), l(e.rgb, l(e.a, R(1, t)))), u);
189
+ function exclusion_default(base, overlay, opacity = 1) {
190
+ const overlayAlpha = mul(overlay.a, opacity);
191
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
192
+ return vec4(add(mul(sub(add(base.rgb, overlay.rgb), mul(2, mul(base.rgb, overlay.rgb))), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
123
193
  }
124
- function oe(e) {
125
- return y(y(l(e.r, 0.2126), l(e.g, 0.7152)), l(e.b, 0.0722));
194
+ function getLuminance(rgb) {
195
+ return add(add(mul(rgb.r, .2126), mul(rgb.g, .7152)), mul(rgb.b, .0722));
126
196
  }
127
- function pr(e, n, s = 1) {
128
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t))), p = R(oe(e.rgb), oe(n.rgb));
129
- return S(y(l(y(n.rgb, p), t), l(e.rgb, l(e.a, R(1, t)))), u);
197
+ function color_default(base, overlay, opacity = 1) {
198
+ const overlayAlpha = mul(overlay.a, opacity);
199
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
200
+ const lumDiff = sub(getLuminance(base.rgb), getLuminance(overlay.rgb));
201
+ return vec4(add(mul(add(overlay.rgb, lumDiff), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
130
202
  }
131
- function gr(e, n, s = 1) {
132
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t))), p = oe(e.rgb), h = oe(n.rgb).div(y(p, 1e-4));
133
- return S(y(l(l(e.rgb, h), t), l(e.rgb, l(e.a, R(1, t)))), u);
203
+ function luminosity_default(base, overlay, opacity = 1) {
204
+ const overlayAlpha = mul(overlay.a, opacity);
205
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
206
+ const baseLum = getLuminance(base.rgb);
207
+ const lumRatio = getLuminance(overlay.rgb).div(add(baseLum, 1e-4));
208
+ return vec4(add(mul(mul(base.rgb, lumRatio), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
134
209
  }
135
- function br(e, n, s = 1) {
136
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
137
- return S(y(l(We(e.rgb, n.rgb), t), l(e.rgb, l(e.a, R(1, t)))), u);
210
+ function darken_default(base, overlay, opacity = 1) {
211
+ const overlayAlpha = mul(overlay.a, opacity);
212
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
213
+ return vec4(add(mul(min(base.rgb, overlay.rgb), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
138
214
  }
139
- function vr(e, n, s = 1) {
140
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
141
- return S(y(l(je(e.rgb, n.rgb), t), l(e.rgb, l(e.a, R(1, t)))), u);
215
+ function lighten_default(base, overlay, opacity = 1) {
216
+ const overlayAlpha = mul(overlay.a, opacity);
217
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
218
+ return vec4(add(mul(max(base.rgb, overlay.rgb), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
142
219
  }
143
- function Cr(e, n, s = 1) {
144
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
145
- return S(y(l(Me(S(0, 0, 0, 1).rgb, je(R(1, R(1, e.rgb).div(y(n.rgb, 1e-4))), 0), Se(1e-4, n.rgb)), t), l(e.rgb, l(e.a, R(1, t)))), u);
220
+ function colorBurn_default(base, overlay, opacity = 1) {
221
+ const overlayAlpha = mul(overlay.a, opacity);
222
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
223
+ return vec4(add(mul(mix(vec4(0, 0, 0, 1).rgb, max(sub(1, sub(1, base.rgb).div(add(overlay.rgb, 1e-4))), 0), step(1e-4, overlay.rgb)), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
146
224
  }
147
- function Rr(e, n, s = 1) {
148
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
149
- return S(y(l(je(y(y(e.rgb, n.rgb), -1), 0), t), l(e.rgb, l(e.a, R(1, t)))), u);
225
+ function linearBurn_default(base, overlay, opacity = 1) {
226
+ const overlayAlpha = mul(overlay.a, opacity);
227
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
228
+ return vec4(add(mul(max(add(add(base.rgb, overlay.rgb), -1), 0), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
150
229
  }
151
- function kr(e, n, s = 1) {
152
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t))), p = y(l(2, l(e.rgb, n.rgb)), l(l(e.rgb, e.rgb), R(1, l(2, n.rgb)))), h = vn(e.rgb);
153
- return S(y(l(Me(p, y(l(2, l(e.rgb, R(1, n.rgb))), l(h, R(l(2, n.rgb), 1))), Se(0.5, n.rgb)), t), l(e.rgb, l(e.a, R(1, t)))), u);
230
+ function softLight_default(base, overlay, opacity = 1) {
231
+ const overlayAlpha = mul(overlay.a, opacity);
232
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
233
+ const softLightDark = add(mul(2, mul(base.rgb, overlay.rgb)), mul(mul(base.rgb, base.rgb), sub(1, mul(2, overlay.rgb))));
234
+ const baseSqrt = sqrt(base.rgb);
235
+ return vec4(add(mul(mix(softLightDark, add(mul(2, mul(base.rgb, sub(1, overlay.rgb))), mul(baseSqrt, sub(mul(2, overlay.rgb), 1))), step(.5, overlay.rgb)), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
154
236
  }
155
- function Tr(e, n, s = 1) {
156
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t)));
157
- return S(y(l(Me(l(2, l(e.rgb, n.rgb)), R(1, l(2, l(R(1, e.rgb), R(1, n.rgb)))), Se(0.5, n.rgb)), t), l(e.rgb, l(e.a, R(1, t)))), u);
237
+ function hardLight_default(base, overlay, opacity = 1) {
238
+ const overlayAlpha = mul(overlay.a, opacity);
239
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
240
+ return vec4(add(mul(mix(mul(2, mul(base.rgb, overlay.rgb)), sub(1, mul(2, mul(sub(1, base.rgb), sub(1, overlay.rgb)))), step(.5, overlay.rgb)), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
158
241
  }
159
- function yr(e, n, s = 1) {
160
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t))), p = oe(e.rgb), h = oe(n.rgb), d = e.rgb.sub(p), k = n.rgb.sub(h), U = d.length();
161
- return S(y(l(y(l(k.normalize(), U), p), t), l(e.rgb, l(e.a, R(1, t)))), u);
242
+ function hue_default(base, overlay, opacity = 1) {
243
+ const overlayAlpha = mul(overlay.a, opacity);
244
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
245
+ const baseLum = getLuminance(base.rgb);
246
+ const overlayLum = getLuminance(overlay.rgb);
247
+ const baseChromaticity = base.rgb.sub(baseLum);
248
+ const overlayChromaticity = overlay.rgb.sub(overlayLum);
249
+ const baseChromaLength = baseChromaticity.length();
250
+ return vec4(add(mul(add(mul(overlayChromaticity.normalize(), baseChromaLength), baseLum), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
162
251
  }
163
- function wr(e, n, s = 1) {
164
- const t = l(n.a, s), u = y(t, l(e.a, R(1, t))), p = oe(e.rgb), h = oe(n.rgb), d = e.rgb.sub(p), k = n.rgb.sub(h);
165
- return S(y(l(y(l(d.normalize(), k.length()), p), t), l(e.rgb, l(e.a, R(1, t)))), u);
252
+ function saturation_default(base, overlay, opacity = 1) {
253
+ const overlayAlpha = mul(overlay.a, opacity);
254
+ const finalAlpha = add(overlayAlpha, mul(base.a, sub(1, overlayAlpha)));
255
+ const baseLum = getLuminance(base.rgb);
256
+ const overlayLum = getLuminance(overlay.rgb);
257
+ const baseChromaticity = base.rgb.sub(baseLum);
258
+ const overlayChromaticity = overlay.rgb.sub(overlayLum);
259
+ return vec4(add(mul(add(mul(baseChromaticity.normalize(), overlayChromaticity.length()), baseLum), overlayAlpha), mul(base.rgb, mul(base.a, sub(1, overlayAlpha)))), finalAlpha);
166
260
  }
167
- var hn = {
168
- normal: er,
169
- "normal-oklch": or,
170
- "normal-oklab": sr,
171
- multiply: lr,
172
- screen: cr,
173
- linearDodge: fr,
174
- overlay: ur,
175
- difference: mr,
176
- colorDodge: dr,
177
- exclusion: hr,
178
- color: pr,
179
- luminosity: gr,
180
- darken: br,
181
- lighten: vr,
182
- colorBurn: Cr,
183
- linearBurn: Rr,
184
- softLight: kr,
185
- hardLight: Tr,
186
- hue: yr,
187
- saturation: wr
261
+ var blendModes = {
262
+ normal: normal_default,
263
+ "normal-oklch": normal_oklch_default,
264
+ "normal-oklab": normal_oklab_default,
265
+ multiply: multiply_default,
266
+ screen: screen_default,
267
+ linearDodge: linearDodge_default,
268
+ overlay: overlay_default,
269
+ difference: difference_default,
270
+ colorDodge: colorDodge_default,
271
+ exclusion: exclusion_default,
272
+ color: color_default,
273
+ luminosity: luminosity_default,
274
+ darken: darken_default,
275
+ lighten: lighten_default,
276
+ colorBurn: colorBurn_default,
277
+ linearBurn: linearBurn_default,
278
+ softLight: softLight_default,
279
+ hardLight: hardLight_default,
280
+ hue: hue_default,
281
+ saturation: saturation_default
188
282
  };
189
- function H(e, n, s = "normal", t = 1) {
190
- return (hn[s] || hn.normal)(e, n, t);
283
+ function applyBlendMode(baseNode, overlayNode, blendMode = "normal", opacity = 1) {
284
+ return (blendModes[blendMode] || blendModes.normal)(baseNode, overlayNode, opacity);
191
285
  }
192
- function Ur(e, n) {
193
- const s = l(e.a, n.a);
194
- return S(e.rgb, s);
286
+ function alpha_default(target, mask) {
287
+ const maskedAlpha = mul(target.a, mask.a);
288
+ return vec4(target.rgb, maskedAlpha);
195
289
  }
196
- function Sr(e, n) {
197
- const s = R(1, n.a), t = l(e.a, s);
198
- return S(e.rgb, t);
290
+ function alphaInverted_default(target, mask) {
291
+ const invertedMaskAlpha = sub(1, mask.a);
292
+ const maskedAlpha = mul(target.a, invertedMaskAlpha);
293
+ return vec4(target.rgb, maskedAlpha);
199
294
  }
200
- function Mr(e, n) {
201
- const s = N(0.2126, 0.7152, 0.0722), t = bn(n.rgb, s), u = l(e.a, t);
202
- return S(e.rgb, u);
295
+ function luminance_default(target, mask) {
296
+ const luminanceWeights = vec3(.2126, .7152, .0722);
297
+ const luminance = dot(mask.rgb, luminanceWeights);
298
+ const maskedAlpha = mul(target.a, luminance);
299
+ return vec4(target.rgb, maskedAlpha);
203
300
  }
204
- function xr(e, n) {
205
- const s = N(0.2126, 0.7152, 0.0722), t = R(1, bn(n.rgb, s)), u = l(e.a, t);
206
- return S(e.rgb, u);
301
+ function luminanceInverted_default(target, mask) {
302
+ const luminanceWeights = vec3(.2126, .7152, .0722);
303
+ const invertedLuminance = sub(1, dot(mask.rgb, luminanceWeights));
304
+ const maskedAlpha = mul(target.a, invertedLuminance);
305
+ return vec4(target.rgb, maskedAlpha);
207
306
  }
208
- var pn = {
209
- alpha: Ur,
210
- alphaInverted: Sr,
211
- luminance: Mr,
212
- luminanceInverted: xr
307
+ var maskFunctions = {
308
+ "alpha": alpha_default,
309
+ "alphaInverted": alphaInverted_default,
310
+ "luminance": luminance_default,
311
+ "luminanceInverted": luminanceInverted_default
213
312
  };
214
- function Ar(e, n, s = "alpha") {
215
- return (pn[s] || pn.alpha)(e, n);
313
+ function applyMask(target, mask, maskType = "alpha") {
314
+ return (maskFunctions[maskType] || maskFunctions["alpha"])(target, mask);
216
315
  }
217
- var Dr = class {
218
- frameTimesMs = [];
219
- maxSamples = 60;
220
- targetFrameTime = 16.67;
221
- jankFrameCount = 0;
222
- totalFrameCount = 0;
223
- memorySnapshots = [];
224
- memoryWindowMs = 5e3;
225
- nodeCount = 0;
226
- rttNodeCount = 0;
227
- lastCpuTime = null;
228
- lastGpuTime = null;
229
- isRendering = !1;
230
- lastFrameTimestamp = 0;
231
- frameIntervals = [];
232
- /**
233
- * Records a frame's render time
234
- */
235
- recordFrame(e) {
236
- this.frameTimesMs.push(e), this.frameTimesMs.length > this.maxSamples && this.frameTimesMs.shift(), this.totalFrameCount++, e > this.targetFrameTime && this.jankFrameCount++;
237
- const n = performance.now();
238
- if (this.lastFrameTimestamp > 0) {
239
- const s = n - this.lastFrameTimestamp;
240
- this.frameIntervals.push(s), this.frameIntervals.length > this.maxSamples && this.frameIntervals.shift();
241
- }
242
- this.lastFrameTimestamp = n, this.recordMemorySnapshot();
243
- }
244
- /**
245
- * Records CPU time for the last frame
246
- */
247
- recordCpuTime(e) {
248
- this.lastCpuTime = e;
249
- }
250
- /**
251
- * Records GPU time for the last frame
252
- */
253
- recordGpuTime(e) {
254
- this.lastGpuTime = e;
255
- }
256
- /**
257
- * Updates node counts for complexity calculation
258
- */
259
- updateNodeCounts(e, n) {
260
- this.nodeCount = e, this.rttNodeCount = n;
261
- }
262
- /**
263
- * Sets rendering state
264
- */
265
- setRendering(e) {
266
- this.isRendering = e;
267
- }
268
- /**
269
- * Records a memory snapshot for growth rate calculation
270
- */
271
- recordMemorySnapshot() {
272
- if (!performance.memory) return;
273
- const e = performance.now(), n = performance.memory.usedJSHeapSize;
274
- this.memorySnapshots.push({
275
- time: e,
276
- bytes: n
277
- });
278
- const s = e - this.memoryWindowMs;
279
- this.memorySnapshots = this.memorySnapshots.filter((t) => t.time > s);
280
- }
281
- /**
282
- * Calculates memory growth rate in MB/sec
283
- */
284
- calculateMemoryGrowthRate() {
285
- if (this.memorySnapshots.length < 2) return null;
286
- const e = this.memorySnapshots[0], n = this.memorySnapshots[this.memorySnapshots.length - 1], s = (n.time - e.time) / 1e3;
287
- return (n.bytes - e.bytes) / (1024 * 1024) / s;
288
- }
289
- /**
290
- * Calculates standard deviation of frame times
291
- */
292
- calculateStdDev(e) {
293
- if (e.length === 0) return 0;
294
- const n = e.reduce((t, u) => t + u, 0) / e.length, s = e.map((t) => Math.pow(t - n, 2)).reduce((t, u) => t + u, 0) / e.length;
295
- return Math.sqrt(s);
296
- }
297
- /**
298
- * Calculates 99th percentile frame time
299
- */
300
- calculateP99(e) {
301
- if (e.length === 0) return 0;
302
- const n = [...e].sort((t, u) => t - u), s = Math.floor(n.length * 0.99);
303
- return n[Math.min(s, n.length - 1)];
304
- }
305
- /**
306
- * Calculates complexity score based on node structure
307
- * RTT nodes are 10x more expensive than regular nodes
308
- */
309
- calculateComplexityScore() {
310
- return this.nodeCount + this.rttNodeCount * 10;
311
- }
312
- /**
313
- * Calculates normalized intensity score (0-100) for "average machine" estimation
314
- * Combines frame time, complexity, and GPU time into single metric
315
- *
316
- * Scoring:
317
- * - 0-20: Very Light (simple effects, <5ms)
318
- * - 21-40: Light (basic effects, 5-8ms)
319
- * - 41-60: Medium (moderate effects, 8-12ms)
320
- * - 61-80: Heavy (complex effects, 12-15ms)
321
- * - 81-100: Very Heavy (intensive effects, >15ms)
322
- */
323
- calculateIntensityScore() {
324
- const e = this.frameTimesMs.length;
325
- if (e === 0) return {
326
- score: 0,
327
- label: "N/A"
328
- };
329
- const n = this.frameTimesMs.reduce((U, B) => U + B, 0) / e, s = Math.min(n / 16.67 * 100, 100), t = this.calculateComplexityScore(), u = Math.min(t / 100 * 100, 100);
330
- let p = 0;
331
- this.lastGpuTime !== null && (p = Math.min(this.lastGpuTime / 16.67 * 100, 100));
332
- const h = this.lastGpuTime !== null ? {
333
- frame: 0.4,
334
- gpu: 0.4,
335
- complexity: 0.2
336
- } : {
337
- frame: 0.7,
338
- gpu: 0,
339
- complexity: 0.3
340
- }, d = Math.round(s * h.frame + p * h.gpu + u * h.complexity);
341
- let k;
342
- return d <= 20 ? k = "Very Light" : d <= 40 ? k = "Light" : d <= 60 ? k = "Medium" : d <= 80 ? k = "Heavy" : k = "Very Heavy", {
343
- score: Math.min(d, 100),
344
- label: k
345
- };
346
- }
347
- /**
348
- * Gets current performance statistics
349
- */
350
- getStats(e) {
351
- const n = this.frameTimesMs.length, s = this.frameIntervals.length > 0 ? 1e3 / (this.frameIntervals.reduce((z, E) => z + E, 0) / this.frameIntervals.length) : 0, t = n > 0 ? this.frameTimesMs.reduce((z, E) => z + E, 0) / n : 0, u = n > 0 ? Math.min(...this.frameTimesMs) : 0, p = n > 0 ? Math.max(...this.frameTimesMs) : 0, h = this.calculateP99(this.frameTimesMs), d = this.calculateStdDev(this.frameTimesMs), k = this.totalFrameCount > 0 ? this.jankFrameCount / this.totalFrameCount * 100 : 0, U = performance.memory, B = U ? U.usedJSHeapSize / (1024 * 1024) : null, O = this.calculateMemoryGrowthRate(), Q = t > 0 ? t / this.targetFrameTime * 100 : 0, V = e?.render?.calls ?? null, q = e?.programs?.length ?? null, ce = e?.memory?.textures ?? null, ie = this.calculateIntensityScore();
352
- return {
353
- fps: Math.round(s),
354
- avgFrameTime: Math.round(t * 100) / 100,
355
- minFrameTime: Math.round(u * 100) / 100,
356
- maxFrameTime: Math.round(p * 100) / 100,
357
- p99FrameTime: Math.round(h * 100) / 100,
358
- stdDevFrameTime: Math.round(d * 100) / 100,
359
- jankCount: this.jankFrameCount,
360
- jankPercent: Math.round(k * 10) / 10,
361
- nodeCount: this.nodeCount,
362
- rttNodeCount: this.rttNodeCount,
363
- complexityScore: this.calculateComplexityScore(),
364
- memoryUsedMB: B !== null ? Math.round(B * 100) / 100 : null,
365
- memoryGrowthRate: O !== null ? Math.round(O * 1e3) / 1e3 : null,
366
- cpuTime: this.lastCpuTime !== null ? Math.round(this.lastCpuTime * 100) / 100 : null,
367
- gpuTime: this.lastGpuTime !== null ? Math.round(this.lastGpuTime * 100) / 100 : null,
368
- budgetUsed: Math.round(Q * 10) / 10,
369
- drawCalls: V,
370
- shaderPrograms: q,
371
- textureCount: ce,
372
- intensityScore: ie.score,
373
- intensityLabel: ie.label,
374
- isRendering: this.isRendering
375
- };
376
- }
377
- /**
378
- * Resets all statistics
379
- */
380
- reset() {
381
- this.frameTimesMs = [], this.frameIntervals = [], this.lastFrameTimestamp = 0, this.jankFrameCount = 0, this.totalFrameCount = 0, this.memorySnapshots = [], this.lastCpuTime = null, this.lastGpuTime = null;
382
- }
383
- }, { vec2: we, cos: zr, sin: Er, float: Fr, PI: $r } = le;
384
- const ne = (e) => e ? e.offsetX !== 0 || e.offsetY !== 0 || e.rotation !== 0 || e.scale !== 1 || e.anchorX !== 0.5 || e.anchorY !== 0.5 : !1, Ue = (e, n, s, t, u, p, h, d) => {
385
- const k = t.mul($r).div(Fr(180)), U = zr(k), B = Er(k), O = we(p, h), Q = e.sub(O).div(u), V = we(Q.x.mul(d), Q.y), q = we(V.x.mul(U).sub(V.y.mul(B)), V.x.mul(B).add(V.y.mul(U)));
386
- return we(q.x.div(d), q.y).sub(we(n, s)).add(O);
316
+ var PerformanceTracker = class {
317
+ frameTimesMs = [];
318
+ maxSamples = 60;
319
+ targetFrameTime = 16.67;
320
+ jankFrameCount = 0;
321
+ totalFrameCount = 0;
322
+ memorySnapshots = [];
323
+ memoryWindowMs = 5e3;
324
+ nodeCount = 0;
325
+ rttNodeCount = 0;
326
+ lastCpuTime = null;
327
+ lastGpuTime = null;
328
+ isRendering = false;
329
+ lastFrameTimestamp = 0;
330
+ frameIntervals = [];
331
+ recordFrame(frameTimeMs) {
332
+ this.frameTimesMs.push(frameTimeMs);
333
+ if (this.frameTimesMs.length > this.maxSamples) this.frameTimesMs.shift();
334
+ this.totalFrameCount++;
335
+ if (frameTimeMs > this.targetFrameTime) this.jankFrameCount++;
336
+ const now = performance.now();
337
+ if (this.lastFrameTimestamp > 0) {
338
+ const interval = now - this.lastFrameTimestamp;
339
+ this.frameIntervals.push(interval);
340
+ if (this.frameIntervals.length > this.maxSamples) this.frameIntervals.shift();
341
+ }
342
+ this.lastFrameTimestamp = now;
343
+ this.recordMemorySnapshot();
344
+ }
345
+ recordCpuTime(timeMs) {
346
+ this.lastCpuTime = timeMs;
347
+ }
348
+ recordGpuTime(timeMs) {
349
+ this.lastGpuTime = timeMs;
350
+ }
351
+ updateNodeCounts(nodeCount, rttNodeCount) {
352
+ this.nodeCount = nodeCount;
353
+ this.rttNodeCount = rttNodeCount;
354
+ }
355
+ setRendering(rendering) {
356
+ this.isRendering = rendering;
357
+ }
358
+ recordMemorySnapshot() {
359
+ if (!performance.memory) return;
360
+ const now = performance.now();
361
+ const bytes = performance.memory.usedJSHeapSize;
362
+ this.memorySnapshots.push({
363
+ time: now,
364
+ bytes
365
+ });
366
+ const cutoff = now - this.memoryWindowMs;
367
+ this.memorySnapshots = this.memorySnapshots.filter((s) => s.time > cutoff);
368
+ }
369
+ calculateMemoryGrowthRate() {
370
+ if (this.memorySnapshots.length < 2) return null;
371
+ const oldest = this.memorySnapshots[0];
372
+ const newest = this.memorySnapshots[this.memorySnapshots.length - 1];
373
+ const timeDeltaSeconds = (newest.time - oldest.time) / 1e3;
374
+ return (newest.bytes - oldest.bytes) / (1024 * 1024) / timeDeltaSeconds;
375
+ }
376
+ calculateStdDev(values) {
377
+ if (values.length === 0) return 0;
378
+ const mean = values.reduce((a, b) => a + b, 0) / values.length;
379
+ const avgSquaredDiff = values.map((v) => Math.pow(v - mean, 2)).reduce((a, b) => a + b, 0) / values.length;
380
+ return Math.sqrt(avgSquaredDiff);
381
+ }
382
+ calculateP99(values) {
383
+ if (values.length === 0) return 0;
384
+ const sorted = [...values].sort((a, b) => a - b);
385
+ const index = Math.floor(sorted.length * .99);
386
+ return sorted[Math.min(index, sorted.length - 1)];
387
+ }
388
+ calculateComplexityScore() {
389
+ return this.nodeCount + this.rttNodeCount * 10;
390
+ }
391
+ calculateIntensityScore() {
392
+ const frameCount = this.frameTimesMs.length;
393
+ if (frameCount === 0) return {
394
+ score: 0,
395
+ label: "N/A"
396
+ };
397
+ const avgFrameTime = this.frameTimesMs.reduce((a, b) => a + b, 0) / frameCount;
398
+ const frameTimeScore = Math.min(avgFrameTime / 16.67 * 100, 100);
399
+ const complexity = this.calculateComplexityScore();
400
+ const complexityScore = Math.min(complexity / 100 * 100, 100);
401
+ let gpuTimeScore = 0;
402
+ if (this.lastGpuTime !== null) gpuTimeScore = Math.min(this.lastGpuTime / 16.67 * 100, 100);
403
+ const weights = this.lastGpuTime !== null ? {
404
+ frame: .4,
405
+ gpu: .4,
406
+ complexity: .2
407
+ } : {
408
+ frame: .7,
409
+ gpu: 0,
410
+ complexity: .3
411
+ };
412
+ const finalScore = Math.round(frameTimeScore * weights.frame + gpuTimeScore * weights.gpu + complexityScore * weights.complexity);
413
+ let label;
414
+ if (finalScore <= 20) label = "Very Light";
415
+ else if (finalScore <= 40) label = "Light";
416
+ else if (finalScore <= 60) label = "Medium";
417
+ else if (finalScore <= 80) label = "Heavy";
418
+ else label = "Very Heavy";
419
+ return {
420
+ score: Math.min(finalScore, 100),
421
+ label
422
+ };
423
+ }
424
+ getStats(rendererInfo) {
425
+ const frameCount = this.frameTimesMs.length;
426
+ const fps = this.frameIntervals.length > 0 ? 1e3 / (this.frameIntervals.reduce((a, b) => a + b, 0) / this.frameIntervals.length) : 0;
427
+ const avgFrameTime = frameCount > 0 ? this.frameTimesMs.reduce((a, b) => a + b, 0) / frameCount : 0;
428
+ const minFrameTime = frameCount > 0 ? Math.min(...this.frameTimesMs) : 0;
429
+ const maxFrameTime = frameCount > 0 ? Math.max(...this.frameTimesMs) : 0;
430
+ const p99FrameTime = this.calculateP99(this.frameTimesMs);
431
+ const stdDevFrameTime = this.calculateStdDev(this.frameTimesMs);
432
+ const jankPercent = this.totalFrameCount > 0 ? this.jankFrameCount / this.totalFrameCount * 100 : 0;
433
+ const memory = performance.memory;
434
+ const memoryUsedMB = memory ? memory.usedJSHeapSize / (1024 * 1024) : null;
435
+ const memoryGrowthRate = this.calculateMemoryGrowthRate();
436
+ const budgetUsed = avgFrameTime > 0 ? avgFrameTime / this.targetFrameTime * 100 : 0;
437
+ const drawCalls = rendererInfo?.render?.calls ?? null;
438
+ const shaderPrograms = rendererInfo?.programs?.length ?? null;
439
+ const textureCount = rendererInfo?.memory?.textures ?? null;
440
+ const intensity = this.calculateIntensityScore();
441
+ return {
442
+ fps: Math.round(fps),
443
+ avgFrameTime: Math.round(avgFrameTime * 100) / 100,
444
+ minFrameTime: Math.round(minFrameTime * 100) / 100,
445
+ maxFrameTime: Math.round(maxFrameTime * 100) / 100,
446
+ p99FrameTime: Math.round(p99FrameTime * 100) / 100,
447
+ stdDevFrameTime: Math.round(stdDevFrameTime * 100) / 100,
448
+ jankCount: this.jankFrameCount,
449
+ jankPercent: Math.round(jankPercent * 10) / 10,
450
+ nodeCount: this.nodeCount,
451
+ rttNodeCount: this.rttNodeCount,
452
+ complexityScore: this.calculateComplexityScore(),
453
+ memoryUsedMB: memoryUsedMB !== null ? Math.round(memoryUsedMB * 100) / 100 : null,
454
+ memoryGrowthRate: memoryGrowthRate !== null ? Math.round(memoryGrowthRate * 1e3) / 1e3 : null,
455
+ cpuTime: this.lastCpuTime !== null ? Math.round(this.lastCpuTime * 100) / 100 : null,
456
+ gpuTime: this.lastGpuTime !== null ? Math.round(this.lastGpuTime * 100) / 100 : null,
457
+ budgetUsed: Math.round(budgetUsed * 10) / 10,
458
+ drawCalls,
459
+ shaderPrograms,
460
+ textureCount,
461
+ intensityScore: intensity.score,
462
+ intensityLabel: intensity.label,
463
+ isRendering: this.isRendering
464
+ };
465
+ }
466
+ reset() {
467
+ this.frameTimesMs = [];
468
+ this.frameIntervals = [];
469
+ this.lastFrameTimestamp = 0;
470
+ this.jankFrameCount = 0;
471
+ this.totalFrameCount = 0;
472
+ this.memorySnapshots = [];
473
+ this.lastCpuTime = null;
474
+ this.lastGpuTime = null;
475
+ }
476
+ };
477
+ var { vec2: vec2$3, cos: cos$1, sin: sin$2, float: float$1, PI } = TSL;
478
+ const needsTransformation = (transform) => {
479
+ if (!transform) return false;
480
+ return transform.offsetX !== 0 || transform.offsetY !== 0 || transform.rotation !== 0 || transform.scale !== 1 || transform.anchorX !== .5 || transform.anchorY !== .5;
481
+ };
482
+ const applyUVTransform = (uv, offsetXUniform, offsetYUniform, rotationUniform, scaleUniform, anchorXUniform, anchorYUniform, aspectRatioUniform) => {
483
+ const rotationRad = rotationUniform.mul(PI).div(float$1(180));
484
+ const cosAngle = cos$1(rotationRad);
485
+ const sinAngle = sin$2(rotationRad);
486
+ const anchor = vec2$3(anchorXUniform, anchorYUniform);
487
+ const scaledUV = uv.sub(anchor).div(scaleUniform);
488
+ const squareUV = vec2$3(scaledUV.x.mul(aspectRatioUniform), scaledUV.y);
489
+ const rotatedSquareUV = vec2$3(squareUV.x.mul(cosAngle).sub(squareUV.y.mul(sinAngle)), squareUV.x.mul(sinAngle).add(squareUV.y.mul(cosAngle)));
490
+ return vec2$3(rotatedSquareUV.x.div(aspectRatioUniform), rotatedSquareUV.y).sub(vec2$3(offsetXUniform, offsetYUniform)).add(anchor);
387
491
  };
388
- var { uniform: Or } = le;
389
- function ii(e, n, s) {
390
- const t = {};
391
- return Object.entries(e.props).forEach(([u, p]) => {
392
- const h = n[u];
393
- let d = h;
394
- if (p.transform) {
395
- const U = p.transform(h);
396
- d = U?.node ?? U;
397
- }
398
- if (d == null && (d = p.default, p.transform && d !== null && d !== void 0)) {
399
- const U = p.transform(d);
400
- d = U?.node ?? U;
401
- }
402
- d == null && (console.error(`[Shaders] Uniform "${u}" is null/undefined after fallback. PropConfig:`, {
403
- propName: u,
404
- initialValue: h,
405
- default: p.default,
406
- hasTransform: !!p.transform
407
- }), d = 0);
408
- const k = Or(d).setName(`${u}_${s}`);
409
- typeof d == "string" && k.value === null && (k.value = d), t[u] = {
410
- uniform: k,
411
- transform: p.transform || void 0
412
- };
413
- }), t;
492
+ var { uniform: uniform$1 } = TSL;
493
+ function createUniformsMap(component, reactiveProps, instanceId) {
494
+ const uniformsMap = {};
495
+ Object.entries(component.props).forEach(([propName, propConfig]) => {
496
+ const initialValue = reactiveProps[propName];
497
+ let uniformValue = initialValue;
498
+ if (propConfig.transform) {
499
+ const transformed = propConfig.transform(initialValue);
500
+ uniformValue = transformed?.node ?? transformed;
501
+ }
502
+ if (uniformValue === null || uniformValue === void 0) {
503
+ uniformValue = propConfig.default;
504
+ if (propConfig.transform && uniformValue !== null && uniformValue !== void 0) {
505
+ const transformed = propConfig.transform(uniformValue);
506
+ uniformValue = transformed?.node ?? transformed;
507
+ }
508
+ }
509
+ if (uniformValue === null || uniformValue === void 0) {
510
+ console.error(`[Shaders] Uniform "${propName}" is null/undefined after fallback. PropConfig:`, {
511
+ propName,
512
+ initialValue,
513
+ default: propConfig.default,
514
+ hasTransform: !!propConfig.transform
515
+ });
516
+ uniformValue = 0;
517
+ }
518
+ const uniformNode = uniform$1(uniformValue).setName(`${propName}_${instanceId}`);
519
+ if (typeof uniformValue === "string" && uniformNode.value === null) uniformNode.value = uniformValue;
520
+ uniformsMap[propName] = {
521
+ uniform: uniformNode,
522
+ transform: propConfig.transform || void 0
523
+ };
524
+ });
525
+ return uniformsMap;
414
526
  }
415
- function Br(e, n) {
416
- if (e?.transform) {
417
- const s = e.transform(n), t = s?.data ?? s;
418
- e.uniform.value = t;
419
- } else e.uniform.value = n;
527
+ function updateUniformValue(uniform$2, newValue) {
528
+ if (uniform$2?.transform) {
529
+ const transformed = uniform$2.transform(newValue);
530
+ const dataValue = transformed?.data ?? transformed;
531
+ uniform$2.uniform.value = dataValue;
532
+ } else uniform$2.uniform.value = newValue;
420
533
  }
421
- var gn = !1, _r = /* @__PURE__ */ (() => {
422
- let e = 0;
423
- const n = /* @__PURE__ */ new Set(), s = (h) => {
424
- n.forEach((d) => {
425
- try {
426
- d.onMouseMove(h);
427
- } catch (k) {
428
- console.error("[Shaders] Error in mouse move handler:", k);
429
- }
430
- });
431
- }, t = (h) => {
432
- n.forEach((d) => {
433
- try {
434
- d.onTouchMove(h);
435
- } catch (k) {
436
- console.error("[Shaders] Error in touch move handler:", k);
437
- }
438
- });
439
- }, u = () => {
440
- n.forEach((h) => {
441
- try {
442
- h.onMouseUp();
443
- } catch (d) {
444
- console.error("[Shaders] Error in mouse up handler:", d);
445
- }
446
- });
447
- }, p = () => {
448
- n.forEach((h) => {
449
- try {
450
- h.onTouchEnd();
451
- } catch (d) {
452
- console.error("[Shaders] Error in touch end handler:", d);
453
- }
454
- });
455
- };
456
- return { register(h) {
457
- return n.add(h), e++, e === 1 && (window.addEventListener("mousemove", s), window.addEventListener("touchmove", t), window.addEventListener("mouseup", u), window.addEventListener("touchend", p)), () => {
458
- n.delete(h), e--, e === 0 && (window.removeEventListener("mousemove", s), window.removeEventListener("touchmove", t), window.removeEventListener("mouseup", u), window.removeEventListener("touchend", p));
459
- };
460
- } };
461
- })(), Lr = () => {
462
- try {
463
- {
464
- const { MODE: e, DEV: n } = {
465
- DEV: !1,
466
- MODE: "production"
467
- };
468
- return n || e === "development";
469
- }
470
- if (typeof window < "u" && window.location) {
471
- const e = window.location.hostname;
472
- return e === "localhost" || e === "127.0.0.1" || e.endsWith(".local") || e.includes("dev.") || e.startsWith("dev-");
473
- }
474
- return !1;
475
- } catch {
476
- return !1;
477
- }
534
+ var hasLoggedLicenseInfo = false;
535
+ var globalEventManager = (() => {
536
+ let instanceCount = 0;
537
+ const callbacks = /* @__PURE__ */ new Set();
538
+ const globalMouseMoveHandler = (e) => {
539
+ callbacks.forEach((cb) => {
540
+ try {
541
+ cb.onMouseMove(e);
542
+ } catch (error) {
543
+ console.error("[Shaders] Error in mouse move handler:", error);
544
+ }
545
+ });
546
+ };
547
+ const globalTouchMoveHandler = (e) => {
548
+ callbacks.forEach((cb) => {
549
+ try {
550
+ cb.onTouchMove(e);
551
+ } catch (error) {
552
+ console.error("[Shaders] Error in touch move handler:", error);
553
+ }
554
+ });
555
+ };
556
+ const globalMouseUpHandler = () => {
557
+ callbacks.forEach((cb) => {
558
+ try {
559
+ cb.onMouseUp();
560
+ } catch (error) {
561
+ console.error("[Shaders] Error in mouse up handler:", error);
562
+ }
563
+ });
564
+ };
565
+ const globalTouchEndHandler = () => {
566
+ callbacks.forEach((cb) => {
567
+ try {
568
+ cb.onTouchEnd();
569
+ } catch (error) {
570
+ console.error("[Shaders] Error in touch end handler:", error);
571
+ }
572
+ });
573
+ };
574
+ return { register(handlers) {
575
+ callbacks.add(handlers);
576
+ instanceCount++;
577
+ if (instanceCount === 1) {
578
+ window.addEventListener("mousemove", globalMouseMoveHandler);
579
+ window.addEventListener("touchmove", globalTouchMoveHandler);
580
+ window.addEventListener("mouseup", globalMouseUpHandler);
581
+ window.addEventListener("touchend", globalTouchEndHandler);
582
+ }
583
+ return () => {
584
+ callbacks.delete(handlers);
585
+ instanceCount--;
586
+ if (instanceCount === 0) {
587
+ window.removeEventListener("mousemove", globalMouseMoveHandler);
588
+ window.removeEventListener("touchmove", globalTouchMoveHandler);
589
+ window.removeEventListener("mouseup", globalMouseUpHandler);
590
+ window.removeEventListener("touchend", globalTouchEndHandler);
591
+ }
592
+ };
593
+ } };
594
+ })();
595
+ var isDevelopment = () => {
596
+ try {
597
+ {
598
+ const { MODE, DEV } = {
599
+ "DEV": false,
600
+ "MODE": "production"
601
+ };
602
+ return DEV || MODE === "development";
603
+ }
604
+ if (typeof window !== "undefined" && window.location) {
605
+ const hostname = window.location.hostname;
606
+ return hostname === "localhost" || hostname === "127.0.0.1" || hostname.endsWith(".local") || hostname.includes("dev.") || hostname.startsWith("dev-");
607
+ }
608
+ return false;
609
+ } catch (error) {
610
+ return false;
611
+ }
478
612
  };
479
- function ai() {
480
- let e = null, n, s, t, u, p;
481
- const h = {
482
- nodes: /* @__PURE__ */ new Map(),
483
- rootId: null,
484
- idToNodeId: /* @__PURE__ */ new Map()
485
- }, d = /* @__PURE__ */ new Map();
486
- let k = null, U = null, B = null, O = !1, Q = !1, V = !1, q = null, ce = !1, ie = !0, z = 0, E = 0, pe = 0, Qe = !1, xe = 0.5, Ae = 0.5, ae = !1, De = !1, ze = null, ge = null, se = !1;
487
- const te = new Dr();
488
- let K = [], Ge = !1, Ee = [], fe = null, Fe = [], ue = null, Je = /* @__PURE__ */ new Set(), Ze = /* @__PURE__ */ new Set(), Ne = 0, be = /* @__PURE__ */ new Set(), Ve = /* @__PURE__ */ new Set(), ve = null, $e = !1;
489
- const Cn = (i, r) => {
490
- i <= 0 || r <= 0 || i === z && r === E || (ve = {
491
- width: i,
492
- height: r
493
- }, $e || ($e = !0, requestAnimationFrame(() => {
494
- if ($e = !1, !ve) return;
495
- const { width: o, height: f } = ve;
496
- ve = null, z = o, E = f, V || (V = !0), n.setSize(o, f, !1);
497
- const c = o / f, b = 2, v = b * c;
498
- s.left = -v / 2, s.right = v / 2, s.top = b / 2, s.bottom = -b / 2, s.updateProjectionMatrix(), u.scale.set(v, b, 1), h.nodes.forEach((m) => {
499
- m.transformUniforms?.aspectRatio && (m.transformUniforms.aspectRatio.value = c), m.resizeCallbacks.forEach((M) => {
500
- try {
501
- M({
502
- width: o,
503
- height: f
504
- });
505
- } catch (D) {
506
- console.error("Error in resize callback:", D);
507
- }
508
- });
509
- }), Z().catch(console.warn);
510
- })));
511
- }, Rn = () => O && !!n && !!t && !!s && !!p && z > 0 && E > 0, kn = (i) => {
512
- if (!n || !s || !u) return;
513
- const r = i[0];
514
- if (!r) return;
515
- let o, f;
516
- if (r.contentBoxSize) {
517
- const c = Array.isArray(r.contentBoxSize) ? r.contentBoxSize[0] : r.contentBoxSize;
518
- c ? (o = Math.round(c.inlineSize), f = Math.round(c.blockSize)) : (o = Math.round(r.contentRect.width), f = Math.round(r.contentRect.height));
519
- } else
520
- o = Math.round(r.contentRect.width), f = Math.round(r.contentRect.height);
521
- o === 0 || f === 0 || Cn(o, f);
522
- }, Tn = (i) => {
523
- const r = i[0];
524
- r && (ce = r.isIntersecting);
525
- }, yn = (i, r) => {
526
- if (i.size !== r.size) return !1;
527
- for (const o of i) if (!r.has(o)) return !1;
528
- return !0;
529
- }, Ce = (i) => {
530
- Ne++;
531
- const r = Wn(i);
532
- return be.add(r), r;
533
- }, Ke = () => {
534
- Ve.forEach((i) => {
535
- try {
536
- i?.renderTarget?.dispose && i.renderTarget.dispose();
537
- } catch {
538
- }
539
- }), Ve.clear();
540
- };
541
- let me = !1;
542
- const Re = () => {
543
- if (!(!h.rootId || !p || De) && h.nodes.get(h.rootId)) {
544
- if (z === 0 || E === 0) {
545
- me || (me = !0, requestAnimationFrame(() => {
546
- me = !1, z > 0 && E > 0 && Re();
547
- }));
548
- return;
549
- }
550
- De = !0;
551
- try {
552
- Ve = new Set(be), be.clear();
553
- const i = /* @__PURE__ */ new Set();
554
- Ze.clear(), h.nodes.forEach((o, f) => {
555
- (o.requiresRTT || o.transformRTTActive) && Ze.add(f);
556
- }), Ne = 0;
557
- const r = I(h.rootId, /* @__PURE__ */ new Set(), i);
558
- if (r && p) {
559
- const o = !yn(Je, i), f = p.fragmentNode !== r;
560
- if (o || Qe || f) {
561
- Ke();
562
- try {
563
- p.dispose(), n.renderTarget && n.renderTarget.dispose();
564
- } catch {
565
- }
566
- const c = new ln({ transparent: !0 });
567
- c.fragmentNode = r, c.needsUpdate = !0, u.material = c, p = c, Qe = !1, Je = i;
568
- }
569
- }
570
- } catch (i) {
571
- console.error("Error composing shader tree:", i);
572
- } finally {
573
- De = !1;
574
- }
575
- Z().catch(console.warn);
576
- }
577
- }, P = (i) => {
578
- const r = d.get(i);
579
- if (!r) return [];
580
- const o = [];
581
- for (const f of r) {
582
- const c = h.nodes.get(f);
583
- c && o.push(c);
584
- }
585
- return o;
586
- }, wn = (i) => {
587
- for (const [r, o] of h.nodes.entries()) if (o.metadata.id === i) return r;
588
- return null;
589
- }, J = (i, r, o, f, c) => {
590
- if (!r.metadata.mask?.source) return i;
591
- const b = r.metadata.mask.source, v = wn(b);
592
- if (!v) return i;
593
- if (f.has(v))
594
- return console.error("Uh oh, looks like you've got a circular dependency in your shader masks."), i;
595
- const m = new Set(f);
596
- m.add(o);
597
- const M = I(v, m);
598
- let D = M;
599
- c && (D = Ce(M).sample(c));
600
- const T = r.metadata.mask.type || "alpha";
601
- return Ar(i, D, T);
602
- }, ee = (i, r) => {
603
- if (!r.metadata.transform || !r.transformUniforms || !ne(r.metadata.transform) && !r.transformRTTActive) return i;
604
- const o = Ce(i), f = Ue(de, r.transformUniforms.offsetX, r.transformUniforms.offsetY, r.transformUniforms.rotation, r.transformUniforms.scale, r.transformUniforms.anchorX, r.transformUniforms.anchorY, r.transformUniforms.aspectRatio);
605
- return he(f, o.sample(f), o, r.transformUniforms.edges);
606
- }, X = (i) => !!i.uvTransformFunc && i.requiresChild && i.metadata.blendMode === "normal" && (i.metadata.opacity === void 0 || i.metadata.opacity === 1) && i.metadata.visible !== !1 && !i.metadata.mask?.source && !(i.transformUniforms && i.metadata.transform && ne(i.metadata.transform)), Oe = (i) => {
607
- const r = [];
608
- let o = i;
609
- for (; o; ) {
610
- const f = h.nodes.get(o);
611
- if (!f || !X(f)) break;
612
- r.push(f);
613
- const c = P(f.id);
614
- if (c.length !== 1) break;
615
- const b = c[0];
616
- if (X(b)) o = b.id;
617
- else break;
618
- }
619
- return r;
620
- }, Un = (i) => {
621
- if (i.length === 0) return null;
622
- const r = i[i.length - 1], o = P(r.id);
623
- return o.length === 0 ? null : o.length === 1 ? o[0] : null;
624
- }, ke = (i) => {
625
- if (!i.uvTransformFunc || !X(i)) return !1;
626
- const r = P(i.id);
627
- if (r.length !== 1) return !1;
628
- const o = r[0];
629
- return o.acceptsUVContext && !o.requiresChild ? !0 : o.uvTransformFunc && X(o) ? ke(o) : !1;
630
- }, Be = (i, r, o) => {
631
- const f = [];
632
- let c = i;
633
- for (; c; ) {
634
- const g = h.nodes.get(c);
635
- if (!g) break;
636
- if (f.length >= 2) return I(i, r, o, !0);
637
- if (f.push(g), o && o.add(g.id), g.acceptsUVContext && !g.requiresChild) break;
638
- const a = P(c);
639
- if (a.length !== 1) break;
640
- c = a[0].id;
641
- }
642
- if (f.length === 0) return S(0, 0, 0, 0);
643
- const b = f[f.length - 1];
644
- let v = de;
645
- for (let g = 0; g < f.length; g++) {
646
- const a = f[g];
647
- a.uvTransformFunc && (v = a.uvTransformFunc({
648
- uv: v,
649
- uniforms: a.uniforms,
650
- viewportSize: ye
651
- })), a.transformUniforms && a.metadata.transform && ne(a.metadata.transform) && (v = Ue(v, a.transformUniforms.offsetX, a.transformUniforms.offsetY, a.transformUniforms.rotation, a.transformUniforms.scale, a.transformUniforms.anchorX, a.transformUniforms.anchorY, a.transformUniforms.aspectRatio), a.transformUniforms.edges && (v = re(v, a.transformUniforms.edges)), a.transformRTTActive = !0);
652
- }
653
- for (let g = 0; g < f.length - 1; g++) {
654
- const a = f[g];
655
- if (!a.requiresChild) continue;
656
- const A = (_) => {
657
- a.cleanupCallbacks.push(_);
658
- }, Y = (_) => {
659
- a.beforeRenderCallbacks.push(_);
660
- }, x = (_) => {
661
- a.afterRenderCallbacks.push(_);
662
- }, w = (_) => {
663
- a.resizeCallbacks.push(_);
664
- };
665
- a.cleanupCallbacks.forEach((_) => {
666
- try {
667
- _();
668
- } catch (F) {
669
- console.error("Error in cleanup callback:", F);
670
- }
671
- }), a.cleanupCallbacks = [], a.beforeRenderCallbacks = [], a.afterRenderCallbacks = [], a.resizeCallbacks = [], a.fragmentNodeFunc({
672
- uniforms: a.uniforms ?? {},
673
- childNode: void 0,
674
- uvContext: void 0,
675
- onCleanup: A,
676
- onBeforeRender: Y,
677
- onAfterRender: x,
678
- onResize: w,
679
- canvas: e,
680
- dimensions: {
681
- width: z,
682
- height: E
683
- },
684
- renderer: n
685
- });
686
- }
687
- const m = (g) => {
688
- b.cleanupCallbacks.push(g);
689
- }, M = (g) => {
690
- b.beforeRenderCallbacks.push(g);
691
- }, D = (g) => {
692
- b.afterRenderCallbacks.push(g);
693
- }, T = (g) => {
694
- b.resizeCallbacks.push(g);
695
- };
696
- b.cleanupCallbacks.forEach((g) => {
697
- try {
698
- g();
699
- } catch (a) {
700
- console.error("Error in cleanup callback:", a);
701
- }
702
- }), b.cleanupCallbacks = [], b.beforeRenderCallbacks = [], b.afterRenderCallbacks = [], b.resizeCallbacks = [];
703
- const C = b.fragmentNodeFunc({
704
- uniforms: b.uniforms ?? {},
705
- childNode: void 0,
706
- uvContext: v,
707
- onCleanup: m,
708
- onBeforeRender: M,
709
- onAfterRender: D,
710
- onResize: T,
711
- canvas: e,
712
- dimensions: {
713
- width: z,
714
- height: E
715
- },
716
- renderer: n
717
- });
718
- for (const g of f) if (g.uniforms.edges?.uniform) return he(v, C, null, g.uniforms.edges.uniform);
719
- return C;
720
- }, _e = (i, r, o) => {
721
- if (i.length === 0) return S(0, 0, 0, 0);
722
- const f = Un(i);
723
- let c;
724
- if (f) c = I(f.id, r, o);
725
- else {
726
- const D = i[i.length - 1];
727
- if (P(D.id).length === 0) return S(0, 0, 0, 0);
728
- c = I(D.id, r, o);
729
- }
730
- const b = Ce(c);
731
- let v = de;
732
- for (let D = i.length - 1; D >= 0; D--) {
733
- const T = i[D];
734
- T.uvTransformFunc && (v = T.uvTransformFunc({
735
- uv: v,
736
- uniforms: T.uniforms,
737
- viewportSize: ye
738
- }), T.uniforms.edges?.uniform && (v = re(v, T.uniforms.edges.uniform))), o && o.add(T.id);
739
- }
740
- const m = b.sample(v), M = i[0];
741
- return M.uniforms.edges?.uniform ? he(v, m, b, M.uniforms.edges.uniform) : m;
742
- }, qe = (i, r) => {
743
- const o = [];
744
- for (let f = r; f < i.length; f++) {
745
- const c = i[f];
746
- if (!X(c) || P(c.id).length > 0) break;
747
- o.push(c);
748
- }
749
- return o;
750
- }, Pe = (i, r, o) => {
751
- if (i.length === 0) return r;
752
- const f = Ce(r);
753
- let c = de;
754
- for (let m = i.length - 1; m >= 0; m--) {
755
- const M = i[m];
756
- M.uvTransformFunc && (c = M.uvTransformFunc({
757
- uv: c,
758
- uniforms: M.uniforms,
759
- viewportSize: ye
760
- }), M.uniforms.edges?.uniform && (c = re(c, M.uniforms.edges.uniform))), o && o.add(M.id);
761
- }
762
- const b = f.sample(c), v = i[i.length - 1];
763
- return v.uniforms.edges?.uniform ? he(c, b, f, v.uniforms.edges.uniform) : b;
764
- }, Xe = (i) => {
765
- const r = [], o = [];
766
- let f = !1;
767
- for (let v = 0; v < i.length; v++) {
768
- const m = i[v], M = P(m.id).length > 0;
769
- m.acceptsUVContext && !m.requiresChild && r.push(v), X(m) && !M && (o.push(v), r.length > 0 && (f = !0));
770
- }
771
- if (r.length === 0 || o.length === 0 || !f) return !1;
772
- const c = Math.min(...r), b = Math.max(...o);
773
- for (let v = c + 1; v < b; v++) {
774
- const m = i[v];
775
- if (m.requiresRTT && !X(m) && !(m.acceptsUVContext && !m.requiresChild)) return !1;
776
- }
777
- return !(o.length > 2);
778
- }, Ye = (i, r, o) => {
779
- const f = [], c = [];
780
- i.forEach((v, m) => {
781
- const M = P(v.id).length > 0;
782
- X(v) && !M ? c.push({
783
- node: v,
784
- index: m
785
- }) : v.acceptsUVContext && !v.requiresChild && !M && f.push({
786
- node: v,
787
- index: m
788
- });
789
- });
790
- for (const v of c) {
791
- const m = v.node;
792
- m.cleanupCallbacks.forEach((g) => {
793
- try {
794
- g();
795
- } catch (a) {
796
- console.error("Cleanup error:", a);
797
- }
798
- }), m.cleanupCallbacks = [], m.beforeRenderCallbacks = [], m.afterRenderCallbacks = [], m.resizeCallbacks = [];
799
- const M = (g) => m.cleanupCallbacks.push(g), D = (g) => m.beforeRenderCallbacks.push(g), T = (g) => m.afterRenderCallbacks.push(g), C = (g) => m.resizeCallbacks.push(g);
800
- m.fragmentNodeFunc({
801
- uniforms: m.uniforms ?? {},
802
- childNode: void 0,
803
- uvContext: void 0,
804
- onCleanup: M,
805
- onBeforeRender: D,
806
- onAfterRender: T,
807
- onResize: C,
808
- canvas: e,
809
- dimensions: {
810
- width: z,
811
- height: E
812
- },
813
- renderer: n
814
- }), o && o.add(m.id);
815
- }
816
- let b;
817
- for (let v = 0; v < i.length; v++) {
818
- const m = i[v];
819
- if (m.metadata.visible === !1) continue;
820
- const M = m.metadata.opacity ?? 1;
821
- m.opacityUniform.value = M, o && o.add(m.id);
822
- const D = P(m.id).length > 0;
823
- let T;
824
- const C = f.find((g) => g.index === v);
825
- if (C) {
826
- const g = c.filter((F) => F.index > C.index).sort((F, $) => F.index - $.index).map((F) => F.node);
827
- let a = de;
828
- for (let F = g.length - 1; F >= 0; F--) {
829
- const $ = g[F];
830
- $.uvTransformFunc && (a = $.uvTransformFunc({
831
- uv: a,
832
- uniforms: $.uniforms,
833
- viewportSize: ye
834
- })), $.transformUniforms && $.metadata.transform && ne($.metadata.transform) && (a = Ue(a, $.transformUniforms.offsetX, $.transformUniforms.offsetY, $.transformUniforms.rotation, $.transformUniforms.scale, $.transformUniforms.anchorX, $.transformUniforms.anchorY, $.transformUniforms.aspectRatio), $.transformUniforms.edges && (a = re(a, $.transformUniforms.edges)), $.transformRTTActive = !0), $.uniforms.edges?.uniform && (a = re(a, $.uniforms.edges.uniform));
835
- }
836
- C.node.transformUniforms && C.node.metadata.transform && ne(C.node.metadata.transform) && (a = Ue(a, C.node.transformUniforms.offsetX, C.node.transformUniforms.offsetY, C.node.transformUniforms.rotation, C.node.transformUniforms.scale, C.node.transformUniforms.anchorX, C.node.transformUniforms.anchorY, C.node.transformUniforms.aspectRatio), C.node.transformUniforms.edges && (a = re(a, C.node.transformUniforms.edges)), C.node.transformRTTActive = !0), m.cleanupCallbacks.forEach((F) => {
837
- try {
838
- F();
839
- } catch ($) {
840
- console.error("Cleanup error:", $);
841
- }
842
- }), m.cleanupCallbacks = [], m.beforeRenderCallbacks = [], m.afterRenderCallbacks = [], m.resizeCallbacks = [];
843
- const A = (F) => m.cleanupCallbacks.push(F), Y = (F) => m.beforeRenderCallbacks.push(F), x = (F) => m.afterRenderCallbacks.push(F), w = (F) => m.resizeCallbacks.push(F);
844
- let _ = m.fragmentNodeFunc({
845
- uniforms: m.uniforms ?? {},
846
- childNode: void 0,
847
- uvContext: a,
848
- onCleanup: A,
849
- onBeforeRender: Y,
850
- onAfterRender: x,
851
- onResize: w,
852
- canvas: e,
853
- dimensions: {
854
- width: z,
855
- height: E
856
- },
857
- renderer: n
858
- });
859
- if (g.length > 0) {
860
- const F = g[0];
861
- F.uniforms.edges?.uniform && (_ = he(a, _, null, F.uniforms.edges.uniform));
862
- }
863
- T = J(_, m, m.id, r, a);
864
- } else {
865
- if (c.find((g) => g.index === v)) continue;
866
- if (D) {
867
- if (ke(m)) T = Be(m.id, r, o);
868
- else if (X(m)) {
869
- const a = Oe(m.id);
870
- a.length > 1 ? T = _e(a, r, o) : T = I(m.id, r, o);
871
- } else T = I(m.id, r, o);
872
- const g = c.filter((a) => a.index > v).sort((a, A) => a.index - A.index).map((a) => a.node);
873
- if (g.length > 0) {
874
- const a = Ce(T);
875
- let A = de;
876
- for (let x = g.length - 1; x >= 0; x--) {
877
- const w = g[x];
878
- w.uvTransformFunc && (A = w.uvTransformFunc({
879
- uv: A,
880
- uniforms: w.uniforms,
881
- viewportSize: ye
882
- })), w.transformUniforms && w.metadata.transform && ne(w.metadata.transform) && (A = Ue(A, w.transformUniforms.offsetX, w.transformUniforms.offsetY, w.transformUniforms.rotation, w.transformUniforms.scale, w.transformUniforms.anchorX, w.transformUniforms.anchorY, w.transformUniforms.aspectRatio), w.transformUniforms.edges && (A = re(A, w.transformUniforms.edges)), w.transformRTTActive = !0), w.uniforms.edges?.uniform && (A = re(A, w.uniforms.edges.uniform));
883
- }
884
- T = a.sample(A);
885
- const Y = g[g.length - 1];
886
- Y.transformUniforms?.edges && (T = he(A, T, a, Y.transformUniforms.edges));
887
- }
888
- } else {
889
- m.cleanupCallbacks.forEach((w) => {
890
- try {
891
- w();
892
- } catch (_) {
893
- console.error("Cleanup error:", _);
894
- }
895
- }), m.cleanupCallbacks = [], m.beforeRenderCallbacks = [], m.afterRenderCallbacks = [], m.resizeCallbacks = [];
896
- const g = (w) => m.cleanupCallbacks.push(w), a = (w) => m.beforeRenderCallbacks.push(w), A = (w) => m.afterRenderCallbacks.push(w), Y = (w) => m.resizeCallbacks.push(w);
897
- let x = b;
898
- m.requiresRTT && b !== void 0 && (x = H(S(0, 0, 0, 0), b, "normal", 1)), T = J(ee(m.fragmentNodeFunc({
899
- uniforms: m.uniforms ?? {},
900
- childNode: x,
901
- onCleanup: g,
902
- onBeforeRender: a,
903
- onAfterRender: A,
904
- onResize: Y,
905
- canvas: e,
906
- dimensions: {
907
- width: z,
908
- height: E
909
- },
910
- renderer: n
911
- }), m), m, m.id, r);
912
- }
913
- }
914
- m.requiresChild && m.metadata.blendMode === "normal" && !D ? b = H(S(0, 0, 0, 0), T, "normal", m.opacityUniform) : b === void 0 ? b = H(S(1, 1, 1, 0), T, m.metadata.blendMode, m.opacityUniform) : b = H(b, T, m.metadata.blendMode, m.opacityUniform);
915
- }
916
- return b ?? S(0, 0, 0, 0);
917
- }, I = (i, r = /* @__PURE__ */ new Set(), o, f = !1) => {
918
- if (z === 0 || E === 0) return S(0, 0, 0, 0);
919
- const c = h.nodes.get(i);
920
- if (!c) return S(0, 0, 0, 0);
921
- const b = (T) => {
922
- c.cleanupCallbacks.push(T);
923
- }, v = (T) => {
924
- c.beforeRenderCallbacks.push(T);
925
- }, m = (T) => {
926
- c.afterRenderCallbacks.push(T);
927
- }, M = (T) => {
928
- c.resizeCallbacks.push(T);
929
- }, D = P(i);
930
- if (D.length === 0)
931
- return c.cleanupCallbacks.forEach((T) => {
932
- try {
933
- T();
934
- } catch (C) {
935
- console.error("Error in cleanup callback:", C);
936
- }
937
- }), c.cleanupCallbacks = [], c.beforeRenderCallbacks = [], c.afterRenderCallbacks = [], c.resizeCallbacks = [], J(ee(c.fragmentNodeFunc({
938
- uniforms: c.uniforms ?? {},
939
- childNode: void 0,
940
- onCleanup: b,
941
- onBeforeRender: v,
942
- onAfterRender: m,
943
- onResize: M,
944
- canvas: e,
945
- dimensions: {
946
- width: z,
947
- height: E
948
- },
949
- renderer: n
950
- }), c), c, i, r);
951
- {
952
- const T = [...D].sort((C, g) => C.metadata.renderOrder - g.metadata.renderOrder);
953
- if (c.parentId === null) {
954
- if (!f && Xe(T)) return J(ee(Ye(T, r, o), c), c, i, r);
955
- let C;
956
- for (let g = 0; g < T.length; g++) {
957
- const a = T[g];
958
- let A;
959
- if (a.metadata.opacity === void 0 ? (A = 1, a.opacityUniform.value = A) : (A = a.metadata.opacity, a.opacityUniform.value = A), a.metadata.visible === !1) continue;
960
- o && o.add(a.id);
961
- const Y = P(a.id).length > 0;
962
- let x;
963
- if (Y) if (f) x = I(a.id, r, o, !0);
964
- else if (ke(a)) x = Be(a.id, r, o);
965
- else if (X(a)) {
966
- const w = Oe(a.id);
967
- w.length > 1 ? x = _e(w, r, o) : x = I(a.id, r, o);
968
- } else x = I(a.id, r, o);
969
- else {
970
- if (X(a) && a.requiresChild && C !== void 0) {
971
- const w = qe(T, g);
972
- if (w.length > 1) {
973
- x = Pe(w, C, o), g += w.length - 1, C = x;
974
- continue;
975
- }
976
- }
977
- {
978
- const w = (L) => {
979
- a.cleanupCallbacks.push(L);
980
- }, _ = (L) => {
981
- a.beforeRenderCallbacks.push(L);
982
- }, F = (L) => {
983
- a.afterRenderCallbacks.push(L);
984
- }, $ = (L) => {
985
- a.resizeCallbacks.push(L);
986
- };
987
- let Te = C;
988
- a.requiresRTT && C !== void 0 && (Te = H(S(0, 0, 0, 0), C, "normal", 1)), a.cleanupCallbacks.forEach((L) => {
989
- try {
990
- L();
991
- } catch (Gn) {
992
- console.error("Error in cleanup callback:", Gn);
993
- }
994
- }), a.cleanupCallbacks = [], a.beforeRenderCallbacks = [], a.afterRenderCallbacks = [], a.resizeCallbacks = [], x = J(ee(a.fragmentNodeFunc({
995
- uniforms: a.uniforms ?? {},
996
- childNode: Te,
997
- onCleanup: w,
998
- onBeforeRender: _,
999
- onAfterRender: F,
1000
- onResize: $,
1001
- canvas: e,
1002
- dimensions: {
1003
- width: z,
1004
- height: E
1005
- },
1006
- renderer: n
1007
- }), a), a, a.id, r);
1008
- }
1009
- }
1010
- a.requiresChild && a.metadata.blendMode === "normal" && !Y ? C = H(S(0, 0, 0, 0), x, "normal", a.opacityUniform) : C === void 0 ? c.requiresRTT || A !== 1 ? C = H(S(1, 1, 1, 0), x, a.metadata.blendMode, a.opacityUniform) : C = x : C = H(C, x, a.metadata.blendMode, a.opacityUniform);
1011
- }
1012
- return c.cleanupCallbacks.forEach((g) => {
1013
- try {
1014
- g();
1015
- } catch (a) {
1016
- console.error("Error in cleanup callback:", a);
1017
- }
1018
- }), c.cleanupCallbacks = [], c.beforeRenderCallbacks = [], c.afterRenderCallbacks = [], c.resizeCallbacks = [], J(ee(c.fragmentNodeFunc({
1019
- uniforms: c.uniforms ?? {},
1020
- childNode: C,
1021
- onCleanup: b,
1022
- onBeforeRender: v,
1023
- onAfterRender: m,
1024
- onResize: M,
1025
- canvas: e,
1026
- dimensions: {
1027
- width: z,
1028
- height: E
1029
- },
1030
- renderer: n
1031
- }), c), c, i, r);
1032
- } else {
1033
- if (!f && Xe(T)) {
1034
- const g = Ye(T, r, o);
1035
- return J(ee(c.fragmentNodeFunc({
1036
- uniforms: c.uniforms ?? {},
1037
- childNode: g,
1038
- onCleanup: b,
1039
- onBeforeRender: v,
1040
- onAfterRender: m,
1041
- onResize: M,
1042
- canvas: e,
1043
- dimensions: {
1044
- width: z,
1045
- height: E
1046
- },
1047
- renderer: n
1048
- }), c), c, i, r);
1049
- }
1050
- let C;
1051
- for (let g = 0; g < T.length; g++) {
1052
- const a = T[g];
1053
- let A;
1054
- if (a.metadata.opacity === void 0 ? (A = 1, a.opacityUniform.value = A) : (A = a.metadata.opacity, a.opacityUniform.value = A), a.metadata.visible === !1) continue;
1055
- o && o.add(a.id);
1056
- const Y = P(a.id).length > 0;
1057
- let x;
1058
- if (Y) if (f) x = I(a.id, r, o, !0);
1059
- else if (ke(a)) x = Be(a.id, r, o);
1060
- else if (X(a)) {
1061
- const w = Oe(a.id);
1062
- w.length > 1 ? x = _e(w, r, o) : x = I(a.id, r, o);
1063
- } else x = I(a.id, r, o);
1064
- else {
1065
- if (X(a) && a.requiresChild && C !== void 0) {
1066
- const w = qe(T, g);
1067
- if (w.length > 1) {
1068
- x = Pe(w, C, o), g += w.length - 1, C = x;
1069
- continue;
1070
- }
1071
- }
1072
- {
1073
- const w = (L) => {
1074
- a.cleanupCallbacks.push(L);
1075
- }, _ = (L) => {
1076
- a.beforeRenderCallbacks.push(L);
1077
- }, F = (L) => {
1078
- a.afterRenderCallbacks.push(L);
1079
- }, $ = (L) => {
1080
- a.resizeCallbacks.push(L);
1081
- };
1082
- let Te = C;
1083
- a.requiresRTT && C !== void 0 && (Te = H(S(0, 0, 0, 0), C, "normal", 1)), a.cleanupCallbacks = [], a.beforeRenderCallbacks = [], a.afterRenderCallbacks = [], a.resizeCallbacks = [], x = J(ee(a.fragmentNodeFunc({
1084
- uniforms: a.uniforms ?? {},
1085
- childNode: Te,
1086
- onCleanup: w,
1087
- onBeforeRender: _,
1088
- onAfterRender: F,
1089
- onResize: $,
1090
- canvas: e,
1091
- dimensions: {
1092
- width: z,
1093
- height: E
1094
- },
1095
- renderer: n
1096
- }), a), a, a.id, r);
1097
- }
1098
- }
1099
- a.requiresChild && a.metadata.blendMode === "normal" && !Y ? C = H(S(0, 0, 0, 0), x, "normal", a.opacityUniform) : C === void 0 ? c.requiresRTT || A !== 1 ? C = H(S(1, 1, 1, 0), x, a.metadata.blendMode, a.opacityUniform) : C = x : C = H(C, x, a.metadata.blendMode, a.opacityUniform);
1100
- }
1101
- return c.cleanupCallbacks.forEach((g) => {
1102
- try {
1103
- g();
1104
- } catch (a) {
1105
- console.error("Error in cleanup callback:", a);
1106
- }
1107
- }), c.cleanupCallbacks = [], c.beforeRenderCallbacks = [], c.afterRenderCallbacks = [], c.resizeCallbacks = [], J(ee(c.fragmentNodeFunc({
1108
- uniforms: c.uniforms ?? {},
1109
- childNode: C,
1110
- onCleanup: b,
1111
- onBeforeRender: v,
1112
- onAfterRender: m,
1113
- onResize: M,
1114
- canvas: e,
1115
- dimensions: {
1116
- width: z,
1117
- height: E
1118
- },
1119
- renderer: n
1120
- }), c), c, i, r);
1121
- }
1122
- }
1123
- }, en = (i, r, o, f, c = {}, b) => {
1124
- if (r === null) {
1125
- const C = K.findIndex((g) => g.id === i);
1126
- if (C !== -1) {
1127
- K.splice(C, 1);
1128
- return;
1129
- }
1130
- Ie(i);
1131
- return;
1132
- }
1133
- if (!Ge) {
1134
- const C = K.findIndex((g) => g.id === i);
1135
- C !== -1 ? K[C] = {
1136
- id: i,
1137
- fragmentNodeFunc: r,
1138
- parentId: o,
1139
- metadata: f,
1140
- uniforms: c,
1141
- componentDefinition: b
1142
- } : K.push({
1143
- id: i,
1144
- fragmentNodeFunc: r,
1145
- parentId: o,
1146
- metadata: f,
1147
- uniforms: c,
1148
- componentDefinition: b
1149
- });
1150
- return;
1151
- }
1152
- let v = 0;
1153
- if (o !== null) {
1154
- const C = d.get(o);
1155
- if (C && C.size > 0) {
1156
- let g = 0;
1157
- for (const a of C) {
1158
- const A = h.nodes.get(a);
1159
- A && A.metadata.renderOrder > g && (g = A.metadata.renderOrder);
1160
- }
1161
- v = g + 1;
1162
- }
1163
- }
1164
- const m = G(f?.opacity !== void 0 ? f.opacity : 1);
1165
- let M;
1166
- if (f?.transform) {
1167
- const C = z / Math.max(1, E);
1168
- M = {
1169
- offsetX: G(f.transform.offsetX),
1170
- offsetY: G(f.transform.offsetY),
1171
- rotation: G(f.transform.rotation),
1172
- scale: G(f.transform.scale),
1173
- anchorX: G(f.transform.anchorX),
1174
- anchorY: G(f.transform.anchorY),
1175
- edges: G(f.transform.edges === "stretch" ? 0 : f.transform.edges === "transparent" ? 1 : f.transform.edges === "mirror" ? 2 : 3),
1176
- aspectRatio: G(C)
1177
- };
1178
- }
1179
- const D = {
1180
- id: i,
1181
- componentName: b?.name || "Unknown",
1182
- fragmentNodeFunc: r,
1183
- parentId: o,
1184
- requiresRTT: b?.requiresRTT || !1,
1185
- requiresChild: b?.requiresChild || !1,
1186
- opacityUniform: m,
1187
- metadata: {
1188
- blendMode: f?.blendMode || "normal",
1189
- opacity: f?.opacity,
1190
- visible: f?.visible !== !1,
1191
- id: f?.id,
1192
- mask: f?.mask,
1193
- renderOrder: f?.renderOrder !== void 0 ? f?.renderOrder : v,
1194
- transform: f?.transform
1195
- },
1196
- uniforms: c,
1197
- cleanupCallbacks: [],
1198
- beforeRenderCallbacks: [],
1199
- afterRenderCallbacks: [],
1200
- resizeCallbacks: [],
1201
- transformUniforms: M,
1202
- transformRTTActive: !1,
1203
- uvTransformFunc: b?.uvTransformNode,
1204
- acceptsUVContext: b?.acceptsUVContext || !1
1205
- };
1206
- h.nodes.set(i, D), o === null && (h.rootId = i);
1207
- const T = d.get(o) || /* @__PURE__ */ new Set();
1208
- T.add(i), d.set(o, T), p && O && z > 0 && E > 0 ? (Ee.includes(i) || Ee.push(i), fe === null && (fe = requestAnimationFrame(() => {
1209
- fe = null, Ee = [], Re();
1210
- }))) : p && O && (me || (me = !0, requestAnimationFrame(() => {
1211
- me = !1, z > 0 && E > 0 && Re();
1212
- })));
1213
- }, Sn = (i, r, o) => {
1214
- const f = h.nodes.get(i);
1215
- if (!f || !f.uniforms) return;
1216
- const c = f.uniforms[r];
1217
- !c || !c.uniform || (c.transform ? Br(c, o) : c.uniform.value = o, Z());
1218
- }, Mn = (i, r) => {
1219
- const o = h.nodes.get(i);
1220
- if (!o) return;
1221
- let f = !1;
1222
- r.blendMode !== void 0 && o.metadata.blendMode !== r.blendMode && (o.metadata.blendMode = r.blendMode, f = !0), r.opacity !== void 0 && o.metadata.opacity !== r.opacity && (o.metadata.opacity = r.opacity, o.opacityUniform.value = r.opacity), r.renderOrder !== void 0 && o.metadata.renderOrder !== r.renderOrder && (o.metadata.renderOrder = r.renderOrder, f = !0);
1223
- const c = r.visible !== !1;
1224
- if (o.metadata.visible !== c && (o.metadata.visible = c, f = !0), r.id !== void 0 && o.metadata.id !== r.id && (o.metadata.id = r.id, f = !0), r.mask !== void 0 && (o.metadata.mask?.source !== r.mask?.source || o.metadata.mask?.type !== r.mask?.type) && (o.metadata.mask = r.mask, f = !0), r.transform !== void 0) {
1225
- const b = o.metadata.transform ? ne(o.metadata.transform) : !1, v = ne(r.transform);
1226
- if (o.metadata.transform = r.transform, !o.transformUniforms && r.transform) {
1227
- const m = z / Math.max(1, E);
1228
- o.transformUniforms = {
1229
- offsetX: G(r.transform.offsetX),
1230
- offsetY: G(r.transform.offsetY),
1231
- rotation: G(r.transform.rotation),
1232
- scale: G(r.transform.scale),
1233
- anchorX: G(r.transform.anchorX),
1234
- anchorY: G(r.transform.anchorY),
1235
- edges: G(r.transform.edges === "stretch" ? 0 : r.transform.edges === "transparent" ? 1 : r.transform.edges === "mirror" ? 2 : 3),
1236
- aspectRatio: G(m)
1237
- };
1238
- } else o.transformUniforms && (o.transformUniforms.offsetX.value = r.transform.offsetX, o.transformUniforms.offsetY.value = r.transform.offsetY, o.transformUniforms.rotation.value = r.transform.rotation, o.transformUniforms.scale.value = r.transform.scale, o.transformUniforms.anchorX.value = r.transform.anchorX, o.transformUniforms.anchorY.value = r.transform.anchorY, o.transformUniforms.edges.value = r.transform.edges === "stretch" ? 0 : r.transform.edges === "transparent" ? 1 : r.transform.edges === "mirror" ? 2 : 3);
1239
- v && !o.transformRTTActive && (o.transformRTTActive = !0, f = !0), !b && v && !o.transformRTTActive && (f = !0);
1240
- }
1241
- f && p && O ? (Fe.includes(i) || Fe.push(i), ue === null && (ue = requestAnimationFrame(() => {
1242
- ue = null, Fe = [], Re();
1243
- }))) : Z();
1244
- }, Ie = (i) => {
1245
- if (!h.nodes.has(i)) return;
1246
- const r = h.nodes.get(i);
1247
- if (r && r.cleanupCallbacks.length > 0) for (const f of r.cleanupCallbacks) try {
1248
- f();
1249
- } catch (c) {
1250
- console.error(`Error executing cleanup callback for node ${i}:`, c);
1251
- }
1252
- const o = P(i);
1253
- for (const f of o) Ie(f.id);
1254
- if (h.rootId === i && (h.rootId = null), r) {
1255
- const f = d.get(r.parentId);
1256
- f && (f.delete(i), f.size === 0 && d.delete(r.parentId));
1257
- }
1258
- h.nodes.delete(i), p && O && Re();
1259
- }, xn = (i) => {
1260
- const r = {
1261
- deltaTime: i,
1262
- pointer: {
1263
- x: xe,
1264
- y: Ae
1265
- },
1266
- pointerActive: ae,
1267
- dimensions: {
1268
- width: z,
1269
- height: E
1270
- }
1271
- };
1272
- for (const o of h.nodes.values()) if (o.beforeRenderCallbacks.length > 0) for (const f of o.beforeRenderCallbacks) try {
1273
- f(r);
1274
- } catch (c) {
1275
- console.error(`Error executing before render callback for node ${o.id}:`, c);
1276
- }
1277
- }, An = (i) => {
1278
- const r = {
1279
- deltaTime: i,
1280
- pointer: {
1281
- x: xe,
1282
- y: Ae
1283
- },
1284
- pointerActive: ae,
1285
- dimensions: {
1286
- width: z,
1287
- height: E
1288
- }
1289
- };
1290
- for (const o of h.nodes.values()) if (o.afterRenderCallbacks.length > 0) for (const f of o.afterRenderCallbacks) try {
1291
- f(r);
1292
- } catch (c) {
1293
- console.error(`Error executing after render callback for node ${o.id}:`, c);
1294
- }
1295
- }, Z = async () => {
1296
- if (!Rn()) return;
1297
- const i = se ? performance.now() : 0, r = i || performance.now(), o = pe > 0 ? (r - pe) / 1e3 : 0.016;
1298
- if (!ce && pe > 0 && r - pe < 1e3)
1299
- return;
1300
- const c = Math.min(o, 0.1);
1301
- pe = r, se && performance.mark("shader-cpu-start"), xn(c);
1302
- try {
1303
- if (De) return;
1304
- if (se && performance.mark("shader-gpu-start"), n.render(t, s), An(c), se) {
1305
- if (performance.mark("shader-gpu-end"), n instanceof He) try {
1306
- const b = n.backend;
1307
- if (b && b.get && b.get(n)) {
1308
- const v = b.get(n);
1309
- if (v?.timestampQuery) {
1310
- const m = v.timestampQuery.getResult();
1311
- m != null && te.recordGpuTime(m / 1e6);
1312
- }
1313
- }
1314
- } catch {
1315
- }
1316
- try {
1317
- performance.measure("shader-gpu-time", "shader-gpu-start", "shader-gpu-end");
1318
- const b = performance.getEntriesByName("shader-gpu-time")[0];
1319
- b && te.recordGpuTime(b.duration), performance.clearMarks("shader-gpu-start"), performance.clearMarks("shader-gpu-end"), performance.clearMeasures("shader-gpu-time");
1320
- } catch {
1321
- }
1322
- }
1323
- if (se) {
1324
- performance.mark("shader-cpu-end");
1325
- try {
1326
- performance.measure("shader-cpu-time", "shader-cpu-start", "shader-cpu-end");
1327
- const v = performance.getEntriesByName("shader-cpu-time")[0];
1328
- v && te.recordCpuTime(v.duration), performance.clearMarks("shader-cpu-start"), performance.clearMarks("shader-cpu-end"), performance.clearMeasures("shader-cpu-time");
1329
- } catch {
1330
- }
1331
- const b = performance.now() - i;
1332
- te.recordFrame(b);
1333
- }
1334
- } catch (b) {
1335
- console.error("Render frame error:", b);
1336
- }
1337
- }, Dn = () => {
1338
- const i = Math.max(0, h.nodes.size - 1), r = Ne;
1339
- te.updateNodeCounts(i, r);
1340
- }, zn = () => {
1341
- Dn();
1342
- const i = n?.info;
1343
- return te.getStats(i);
1344
- }, nn = () => {
1345
- if (k || !ie) return;
1346
- te.setRendering(!0);
1347
- const i = () => {
1348
- k = requestAnimationFrame(i), Z().catch(console.warn);
1349
- };
1350
- i();
1351
- }, tn = () => {
1352
- k && (cancelAnimationFrame(k), k = null), te.setRendering(!1);
1353
- }, rn = (i) => {
1354
- if (!e) return;
1355
- let r, o;
1356
- if ("touches" in i) {
1357
- if (i.touches.length === 0) return;
1358
- r = i.touches[0].clientX, o = i.touches[0].clientY;
1359
- } else
1360
- r = i.clientX, o = i.clientY;
1361
- const f = e.getBoundingClientRect(), c = (r - f.left) / f.width, b = (o - f.top) / f.height;
1362
- xe = c, Ae = b;
1363
- }, En = (i) => {
1364
- !O || !e || rn(i);
1365
- }, Fn = (i) => {
1366
- !O || !e || rn(i);
1367
- }, $n = () => {
1368
- O && (ae = !1, Z().catch(console.warn));
1369
- }, On = () => {
1370
- O && (ae = !1, Z().catch(console.warn));
1371
- }, on = () => {
1372
- ae = !0, Z().catch(console.warn);
1373
- }, an = () => {
1374
- ae = !0, Z().catch(console.warn);
1375
- }, Bn = () => {
1376
- if (K.length === 0) return;
1377
- const i = [...K];
1378
- K = [];
1379
- for (const { id: r, fragmentNodeFunc: o, parentId: f, metadata: c, uniforms: b, componentDefinition: v } of i) o && en(r, o, f, c, b, v);
1380
- }, _n = async ({ canvas: i, enablePerformanceTracking: r = !1 }) => {
1381
- if (O || Q) return;
1382
- se = r, Q = !0, q = new AbortController();
1383
- const o = q;
1384
- try {
1385
- if (e = i, t = new Yn(), t.background = null, s = new Xn(-1, 1, 1, -1, 0.1, 10), s.position.z = 1, s.lookAt(0, 0, 0), ze = _r.register({
1386
- onMouseMove: En,
1387
- onTouchMove: Fn,
1388
- onMouseUp: $n,
1389
- onTouchEnd: On
1390
- }), i.addEventListener("mousedown", on), i.addEventListener("touchstart", an), ge = () => {
1391
- sn();
1392
- }, window.addEventListener("beforeunload", ge), o.signal.aborted) return;
1393
- try {
1394
- const D = {
1395
- canvas: i,
1396
- antialias: !0,
1397
- alpha: !0,
1398
- depth: !1,
1399
- powerPreference: "high-performance"
1400
- };
1401
- if (se && (D.forceWebGL = !1, D.requiredFeatures = ["timestamp-query"]), n = new He(D), await n.init(), o.signal.aborted) return;
1402
- } catch (D) {
1403
- if (o.signal.aborted) return;
1404
- console.warn("[Shaders] WebGPU initialization failed, falling back to WebGL:", D);
1405
- try {
1406
- if (n = new Kt({
1407
- canvas: i,
1408
- antialias: !0,
1409
- alpha: !0,
1410
- depth: !1,
1411
- powerPreference: "high-performance"
1412
- }), o.signal.aborted) return;
1413
- } catch (T) {
1414
- if (o.signal.aborted) return;
1415
- console.error("[Shaders] Both WebGPU and WebGL initialization failed:", T);
1416
- return;
1417
- }
1418
- }
1419
- if (o.signal.aborted) return;
1420
- n.setPixelRatio(Math.min(window.devicePixelRatio, 2)), n.outputColorSpace = Nn, p = new ln({ transparent: !0 }), p.fragmentNode = S(0, 0, 0, 0), u = new Pn(new Jn(2, 2), p), t.add(u);
1421
- const f = i.parentElement;
1422
- if (!f) {
1423
- console.warn("[Shaders] Canvas has no parent element for resize observation");
1424
- return;
1425
- }
1426
- U = new ResizeObserver(kn), U.observe(f), B = new IntersectionObserver(Tn, { threshold: 0 }), B.observe(i);
1427
- const c = i.getBoundingClientRect();
1428
- ce = c.width > 0 && c.height > 0 && c.top < window.innerHeight && c.bottom > 0 && c.left < window.innerWidth && c.right > 0, ie = !0;
1429
- const { width: b, height: v } = i.getBoundingClientRect(), m = Math.round(b), M = Math.round(v);
1430
- if (m > 0 && M > 0) {
1431
- z = m, E = M, V = !0, n.setSize(m, M, !1);
1432
- const D = m / M, T = 2, C = T * D;
1433
- s.left = -C / 2, s.right = C / 2, s.top = T / 2, s.bottom = -T / 2, s.updateProjectionMatrix(), u.scale.set(C, T, 1), await Z();
1434
- } else V = !1;
1435
- ie && nn(), o.signal.aborted || (O = !0, Ge = !0, Bn());
1436
- } catch (f) {
1437
- console.error("[Shaders] Initialization error:", f);
1438
- } finally {
1439
- Q = !1, q === o && (q = null);
1440
- }
1441
- }, Ln = () => {
1442
- !Lr() || gn || (console.warn("Shaders is running in development mode. Please purchase a license at https://shaders.com to use it in production."), gn = !0);
1443
- }, sn = () => {
1444
- if (q && q.abort(), U && (U.disconnect(), U = null), B && (B.disconnect(), B = null), ze && (ze(), ze = null), e && (e.removeEventListener("mousedown", on), e.removeEventListener("touchstart", an)), ge && (window.removeEventListener("beforeunload", ge), ge = null), tn(), Ke(), be.forEach((i) => {
1445
- try {
1446
- i?.renderTarget?.dispose && i.renderTarget.dispose();
1447
- } catch {
1448
- }
1449
- }), be.clear(), h.nodes.clear(), h.rootId = null, h.idToNodeId.clear(), d.clear(), K = [], Ge = !1, Ee = [], fe !== null && (cancelAnimationFrame(fe), fe = null), Fe = [], ue !== null && (cancelAnimationFrame(ue), ue = null), ve = null, $e = !1, u) {
1450
- t && t.remove(u);
1451
- try {
1452
- u.geometry && typeof u.geometry.dispose == "function" && u.geometry.dispose();
1453
- } catch {
1454
- }
1455
- try {
1456
- u.material instanceof qn && typeof u.material.dispose == "function" && u.material.dispose();
1457
- } catch {
1458
- }
1459
- }
1460
- if (n && typeof n.dispose == "function") try {
1461
- n.dispose();
1462
- } catch {
1463
- }
1464
- e = null, n = null, s = null, t = null, u = null, p = null, O = !1, Q = !1, V = !1, q = null, z = 0, E = 0, ce = !1, ie = !0, xe = 0.5, Ae = 0.5, ae = !1;
1465
- };
1466
- return {
1467
- initialize: _n,
1468
- cleanup: sn,
1469
- registerNode: en,
1470
- removeNode: Ie,
1471
- updateUniformValue: Sn,
1472
- updateNodeMetadata: Mn,
1473
- showLicenseWarning: Ln,
1474
- isInitialized: () => O,
1475
- startAnimation: nn,
1476
- stopAnimation: tn,
1477
- getPerformanceStats: zn,
1478
- getNodeRegistry: () => ({ nodes: new Map(h.nodes) }),
1479
- getRendererType: () => n ? n instanceof He ? "webgpu" : "webgl" : null,
1480
- __testing: {
1481
- isUVComposable: X,
1482
- canSkipRTT: ke,
1483
- hasUVPropagationOpportunity: Xe,
1484
- needsTransformation: ne,
1485
- findUVChain: Oe,
1486
- findSiblingUVChain: qe,
1487
- findChildNodes: P,
1488
- composeUVContextChain: Be,
1489
- composeUVChain: _e,
1490
- composeSiblingUVChain: Pe,
1491
- composeSiblingsWithUVContext: Ye,
1492
- applyMaskIfNeeded: J,
1493
- applyNodeTransformation: ee,
1494
- getNodeRegistry: () => h,
1495
- getParentToChildren: () => d
1496
- }
1497
- };
613
+ function shaderRenderer() {
614
+ let canvasElement = null;
615
+ let renderer;
616
+ let camera;
617
+ let scene;
618
+ let mesh;
619
+ let material;
620
+ const nodeRegistry = {
621
+ nodes: /* @__PURE__ */ new Map(),
622
+ rootId: null,
623
+ idToNodeId: /* @__PURE__ */ new Map()
624
+ };
625
+ const parentToChildren = /* @__PURE__ */ new Map();
626
+ let animationFrameId = null;
627
+ let resizeObserver = null;
628
+ let intersectionObserver = null;
629
+ let isInitialized = false;
630
+ let isInitializing = false;
631
+ let hasInitialDimensions = false;
632
+ let initializationAbortController = null;
633
+ let isVisible = false;
634
+ let shouldAnimate = true;
635
+ let currentWidth = 0;
636
+ let currentHeight = 0;
637
+ let lastRenderTime = 0;
638
+ let needsMaterialRefresh = false;
639
+ let pointerX = .5;
640
+ let pointerY = .5;
641
+ let pointerActive = false;
642
+ let isUpdatingMaterial = false;
643
+ let globalEventUnregister = null;
644
+ let unloadHandler = null;
645
+ let enablePerformanceTracking = false;
646
+ const performanceTracker = new PerformanceTracker();
647
+ let pendingRegistrationQueue = [];
648
+ let isRendererReady = false;
649
+ let registrationQueue = [];
650
+ let registrationBatchRAF = null;
651
+ let metadataUpdateQueue = [];
652
+ let metadataUpdateBatchRAF = null;
653
+ let lastComposedNodes = /* @__PURE__ */ new Set();
654
+ let activeRTTNodes = /* @__PURE__ */ new Set();
655
+ let actualRTTOperations = 0;
656
+ let currentTextures = /* @__PURE__ */ new Set();
657
+ let previousTextures = /* @__PURE__ */ new Set();
658
+ let pendingResize = null;
659
+ let isResizeScheduled = false;
660
+ const updateRendererDimensions = (width, height) => {
661
+ if (width <= 0 || height <= 0) return;
662
+ if (width === currentWidth && height === currentHeight) return;
663
+ pendingResize = {
664
+ width,
665
+ height
666
+ };
667
+ if (!isResizeScheduled) {
668
+ isResizeScheduled = true;
669
+ requestAnimationFrame(() => {
670
+ isResizeScheduled = false;
671
+ if (!pendingResize) return;
672
+ const { width: width$1, height: height$1 } = pendingResize;
673
+ pendingResize = null;
674
+ currentWidth = width$1;
675
+ currentHeight = height$1;
676
+ if (!hasInitialDimensions) hasInitialDimensions = true;
677
+ renderer.setSize(width$1, height$1, false);
678
+ const aspectRatio = width$1 / height$1;
679
+ const frustumHeight = 2;
680
+ const frustumWidth = frustumHeight * aspectRatio;
681
+ camera.left = -frustumWidth / 2;
682
+ camera.right = frustumWidth / 2;
683
+ camera.top = frustumHeight / 2;
684
+ camera.bottom = -frustumHeight / 2;
685
+ camera.updateProjectionMatrix();
686
+ mesh.scale.set(frustumWidth, frustumHeight, 1);
687
+ nodeRegistry.nodes.forEach((nodeInfo) => {
688
+ if (nodeInfo.transformUniforms?.aspectRatio) nodeInfo.transformUniforms.aspectRatio.value = aspectRatio;
689
+ nodeInfo.resizeCallbacks.forEach((callback) => {
690
+ try {
691
+ callback({
692
+ width: width$1,
693
+ height: height$1
694
+ });
695
+ } catch (error) {
696
+ console.error("Error in resize callback:", error);
697
+ }
698
+ });
699
+ });
700
+ renderFrame().catch(console.warn);
701
+ });
702
+ }
703
+ };
704
+ const canRender = () => {
705
+ return isInitialized && !!renderer && !!scene && !!camera && !!material && currentWidth > 0 && currentHeight > 0;
706
+ };
707
+ const handleResize = (entries) => {
708
+ if (!renderer || !camera || !mesh) return;
709
+ const entry = entries[0];
710
+ if (!entry) return;
711
+ let width, height;
712
+ if (entry.contentBoxSize) {
713
+ const boxSize = Array.isArray(entry.contentBoxSize) ? entry.contentBoxSize[0] : entry.contentBoxSize;
714
+ if (boxSize) {
715
+ width = Math.round(boxSize.inlineSize);
716
+ height = Math.round(boxSize.blockSize);
717
+ } else {
718
+ width = Math.round(entry.contentRect.width);
719
+ height = Math.round(entry.contentRect.height);
720
+ }
721
+ } else {
722
+ width = Math.round(entry.contentRect.width);
723
+ height = Math.round(entry.contentRect.height);
724
+ }
725
+ if (width === 0 || height === 0) return;
726
+ updateRendererDimensions(width, height);
727
+ };
728
+ const handleVisibilityChange = (entries) => {
729
+ const entry = entries[0];
730
+ if (!entry) return;
731
+ isVisible = entry.isIntersecting;
732
+ };
733
+ const setsAreEqual = (set1, set2) => {
734
+ if (set1.size !== set2.size) return false;
735
+ for (const item of set1) if (!set2.has(item)) return false;
736
+ return true;
737
+ };
738
+ const trackConvertToTexture = (node) => {
739
+ actualRTTOperations++;
740
+ const texture = convertToTexture(node);
741
+ currentTextures.add(texture);
742
+ return texture;
743
+ };
744
+ const disposePreviousTextures = () => {
745
+ previousTextures.forEach((texture) => {
746
+ try {
747
+ if (texture?.renderTarget?.dispose) texture.renderTarget.dispose();
748
+ } catch (e) {}
749
+ });
750
+ previousTextures.clear();
751
+ };
752
+ let materialUpdatePending = false;
753
+ const updateMaterial = () => {
754
+ if (!nodeRegistry.rootId || !material || isUpdatingMaterial) return;
755
+ if (!nodeRegistry.nodes.get(nodeRegistry.rootId)) return;
756
+ if (currentWidth === 0 || currentHeight === 0) {
757
+ if (!materialUpdatePending) {
758
+ materialUpdatePending = true;
759
+ requestAnimationFrame(() => {
760
+ materialUpdatePending = false;
761
+ if (currentWidth > 0 && currentHeight > 0) updateMaterial();
762
+ });
763
+ }
764
+ return;
765
+ }
766
+ isUpdatingMaterial = true;
767
+ try {
768
+ previousTextures = new Set(currentTextures);
769
+ currentTextures.clear();
770
+ const currentComposedNodes = /* @__PURE__ */ new Set();
771
+ activeRTTNodes.clear();
772
+ nodeRegistry.nodes.forEach((nodeInfo, nodeId) => {
773
+ if (nodeInfo.requiresRTT || nodeInfo.transformRTTActive) activeRTTNodes.add(nodeId);
774
+ });
775
+ actualRTTOperations = 0;
776
+ const composedNode = composeNodeTree(nodeRegistry.rootId, /* @__PURE__ */ new Set(), currentComposedNodes);
777
+ if (composedNode && material) {
778
+ const compositionChanged = !setsAreEqual(lastComposedNodes, currentComposedNodes);
779
+ const nodeChanged = material.fragmentNode !== composedNode;
780
+ if (compositionChanged || needsMaterialRefresh || nodeChanged) {
781
+ disposePreviousTextures();
782
+ try {
783
+ material.dispose();
784
+ if (renderer.renderTarget) renderer.renderTarget.dispose();
785
+ } catch (e) {}
786
+ const newMaterial = new MeshBasicNodeMaterial({ transparent: true });
787
+ newMaterial.fragmentNode = composedNode;
788
+ newMaterial.needsUpdate = true;
789
+ mesh.material = newMaterial;
790
+ material = newMaterial;
791
+ needsMaterialRefresh = false;
792
+ lastComposedNodes = currentComposedNodes;
793
+ }
794
+ }
795
+ } catch (error) {
796
+ console.error("Error composing shader tree:", error);
797
+ } finally {
798
+ isUpdatingMaterial = false;
799
+ }
800
+ renderFrame().catch(console.warn);
801
+ };
802
+ const findChildNodes = (parentId) => {
803
+ const childIds = parentToChildren.get(parentId);
804
+ if (!childIds) return [];
805
+ const children = [];
806
+ for (const childId of childIds) {
807
+ const nodeInfo = nodeRegistry.nodes.get(childId);
808
+ if (nodeInfo) children.push(nodeInfo);
809
+ }
810
+ return children;
811
+ };
812
+ const findNodeByCustomId = (customId) => {
813
+ for (const [nodeId, info] of nodeRegistry.nodes.entries()) if (info.metadata.id === customId) return nodeId;
814
+ return null;
815
+ };
816
+ const applyMaskIfNeeded = (result, nodeInfo, nodeId, processedMasks, distortedUV) => {
817
+ if (!nodeInfo.metadata.mask?.source) return result;
818
+ const maskSourceId = nodeInfo.metadata.mask.source;
819
+ const maskNodeId = findNodeByCustomId(maskSourceId);
820
+ if (!maskNodeId) return result;
821
+ if (processedMasks.has(maskNodeId)) {
822
+ console.error(`Uh oh, looks like you've got a circular dependency in your shader masks.`);
823
+ return result;
824
+ }
825
+ const newProcessedMasks = new Set(processedMasks);
826
+ newProcessedMasks.add(nodeId);
827
+ const maskNode = composeNodeTree(maskNodeId, newProcessedMasks);
828
+ let finalMaskNode = maskNode;
829
+ if (distortedUV) finalMaskNode = trackConvertToTexture(maskNode).sample(distortedUV);
830
+ const maskType = nodeInfo.metadata.mask.type || "alpha";
831
+ return applyMask(result, finalMaskNode, maskType);
832
+ };
833
+ const applyNodeTransformation = (result, nodeInfo) => {
834
+ if (!nodeInfo.metadata.transform || !nodeInfo.transformUniforms || !needsTransformation(nodeInfo.metadata.transform) && !nodeInfo.transformRTTActive) return result;
835
+ const texture = trackConvertToTexture(result);
836
+ const transformedUV = applyUVTransform(screenUV, nodeInfo.transformUniforms.offsetX, nodeInfo.transformUniforms.offsetY, nodeInfo.transformUniforms.rotation, nodeInfo.transformUniforms.scale, nodeInfo.transformUniforms.anchorX, nodeInfo.transformUniforms.anchorY, nodeInfo.transformUniforms.aspectRatio);
837
+ return applyEdgeHandling(transformedUV, texture.sample(transformedUV), texture, nodeInfo.transformUniforms.edges);
838
+ };
839
+ const isUVComposable = (nodeInfo) => {
840
+ return !!nodeInfo.uvTransformFunc && nodeInfo.requiresChild && nodeInfo.metadata.blendMode === "normal" && (nodeInfo.metadata.opacity === void 0 || nodeInfo.metadata.opacity === 1) && nodeInfo.metadata.visible !== false && !nodeInfo.metadata.mask?.source && !(nodeInfo.transformUniforms && nodeInfo.metadata.transform && needsTransformation(nodeInfo.metadata.transform));
841
+ };
842
+ const findUVChain = (startNodeId) => {
843
+ const chain = [];
844
+ let currentId = startNodeId;
845
+ while (currentId) {
846
+ const nodeInfo = nodeRegistry.nodes.get(currentId);
847
+ if (!nodeInfo) break;
848
+ if (!isUVComposable(nodeInfo)) break;
849
+ chain.push(nodeInfo);
850
+ const children = findChildNodes(nodeInfo.id);
851
+ if (children.length !== 1) break;
852
+ const child = children[0];
853
+ if (isUVComposable(child)) currentId = child.id;
854
+ else break;
855
+ }
856
+ return chain;
857
+ };
858
+ const findUVChainTerminus = (chain) => {
859
+ if (chain.length === 0) return null;
860
+ const innermostNode = chain[chain.length - 1];
861
+ const children = findChildNodes(innermostNode.id);
862
+ if (children.length === 0) return null;
863
+ if (children.length === 1) return children[0];
864
+ return null;
865
+ };
866
+ const canSkipRTT = (distortionInfo) => {
867
+ if (!distortionInfo.uvTransformFunc) return false;
868
+ if (!isUVComposable(distortionInfo)) return false;
869
+ const children = findChildNodes(distortionInfo.id);
870
+ if (children.length !== 1) return false;
871
+ const child = children[0];
872
+ if (child.acceptsUVContext && !child.requiresChild) return true;
873
+ if (child.uvTransformFunc && isUVComposable(child)) return canSkipRTT(child);
874
+ return false;
875
+ };
876
+ const composeUVContextChain = (startNodeId, _processedMasks, currentlyComposedNodes) => {
877
+ const chain = [];
878
+ let currentId = startNodeId;
879
+ while (currentId) {
880
+ const nodeInfo = nodeRegistry.nodes.get(currentId);
881
+ if (!nodeInfo) break;
882
+ if (chain.length >= 2) return composeNodeTree(startNodeId, _processedMasks, currentlyComposedNodes, true);
883
+ chain.push(nodeInfo);
884
+ if (currentlyComposedNodes) currentlyComposedNodes.add(nodeInfo.id);
885
+ if (nodeInfo.acceptsUVContext && !nodeInfo.requiresChild) break;
886
+ const children = findChildNodes(currentId);
887
+ if (children.length !== 1) break;
888
+ currentId = children[0].id;
889
+ }
890
+ if (chain.length === 0) return vec4(0, 0, 0, 0);
891
+ const terminus = chain[chain.length - 1];
892
+ let composedUV = screenUV;
893
+ for (let i = 0; i < chain.length; i++) {
894
+ const nodeInfo = chain[i];
895
+ if (nodeInfo.uvTransformFunc) composedUV = nodeInfo.uvTransformFunc({
896
+ uv: composedUV,
897
+ uniforms: nodeInfo.uniforms,
898
+ viewportSize
899
+ });
900
+ if (nodeInfo.transformUniforms && nodeInfo.metadata.transform && needsTransformation(nodeInfo.metadata.transform)) {
901
+ composedUV = applyUVTransform(composedUV, nodeInfo.transformUniforms.offsetX, nodeInfo.transformUniforms.offsetY, nodeInfo.transformUniforms.rotation, nodeInfo.transformUniforms.scale, nodeInfo.transformUniforms.anchorX, nodeInfo.transformUniforms.anchorY, nodeInfo.transformUniforms.aspectRatio);
902
+ if (nodeInfo.transformUniforms.edges) composedUV = applyEdgeToUV(composedUV, nodeInfo.transformUniforms.edges);
903
+ nodeInfo.transformRTTActive = true;
904
+ }
905
+ }
906
+ for (let i = 0; i < chain.length - 1; i++) {
907
+ const distortion = chain[i];
908
+ if (!distortion.requiresChild) continue;
909
+ const distortionOnCleanup = (callback) => {
910
+ distortion.cleanupCallbacks.push(callback);
911
+ };
912
+ const distortionOnBeforeRender = (callback) => {
913
+ distortion.beforeRenderCallbacks.push(callback);
914
+ };
915
+ const distortionOnAfterRender = (callback) => {
916
+ distortion.afterRenderCallbacks.push(callback);
917
+ };
918
+ const distortionOnResize = (callback) => {
919
+ distortion.resizeCallbacks.push(callback);
920
+ };
921
+ distortion.cleanupCallbacks.forEach((callback) => {
922
+ try {
923
+ callback();
924
+ } catch (e) {
925
+ console.error("Error in cleanup callback:", e);
926
+ }
927
+ });
928
+ distortion.cleanupCallbacks = [];
929
+ distortion.beforeRenderCallbacks = [];
930
+ distortion.afterRenderCallbacks = [];
931
+ distortion.resizeCallbacks = [];
932
+ distortion.fragmentNodeFunc({
933
+ uniforms: distortion.uniforms ?? {},
934
+ childNode: void 0,
935
+ uvContext: void 0,
936
+ onCleanup: distortionOnCleanup,
937
+ onBeforeRender: distortionOnBeforeRender,
938
+ onAfterRender: distortionOnAfterRender,
939
+ onResize: distortionOnResize,
940
+ canvas: canvasElement,
941
+ dimensions: {
942
+ width: currentWidth,
943
+ height: currentHeight
944
+ },
945
+ renderer
946
+ });
947
+ }
948
+ const terminusOnCleanup = (callback) => {
949
+ terminus.cleanupCallbacks.push(callback);
950
+ };
951
+ const terminusOnBeforeRender = (callback) => {
952
+ terminus.beforeRenderCallbacks.push(callback);
953
+ };
954
+ const terminusOnAfterRender = (callback) => {
955
+ terminus.afterRenderCallbacks.push(callback);
956
+ };
957
+ const terminusOnResize = (callback) => {
958
+ terminus.resizeCallbacks.push(callback);
959
+ };
960
+ terminus.cleanupCallbacks.forEach((callback) => {
961
+ try {
962
+ callback();
963
+ } catch (e) {
964
+ console.error("Error in cleanup callback:", e);
965
+ }
966
+ });
967
+ terminus.cleanupCallbacks = [];
968
+ terminus.beforeRenderCallbacks = [];
969
+ terminus.afterRenderCallbacks = [];
970
+ terminus.resizeCallbacks = [];
971
+ const result = terminus.fragmentNodeFunc({
972
+ uniforms: terminus.uniforms ?? {},
973
+ childNode: void 0,
974
+ uvContext: composedUV,
975
+ onCleanup: terminusOnCleanup,
976
+ onBeforeRender: terminusOnBeforeRender,
977
+ onAfterRender: terminusOnAfterRender,
978
+ onResize: terminusOnResize,
979
+ canvas: canvasElement,
980
+ dimensions: {
981
+ width: currentWidth,
982
+ height: currentHeight
983
+ },
984
+ renderer
985
+ });
986
+ for (const nodeInfo of chain) if (nodeInfo.uniforms.edges?.uniform) return applyEdgeHandling(composedUV, result, null, nodeInfo.uniforms.edges.uniform);
987
+ return result;
988
+ };
989
+ const composeUVChain = (chain, processedMasks, currentlyComposedNodes) => {
990
+ if (chain.length === 0) return vec4(0, 0, 0, 0);
991
+ const terminus = findUVChainTerminus(chain);
992
+ let terminusNode;
993
+ if (terminus) terminusNode = composeNodeTree(terminus.id, processedMasks, currentlyComposedNodes);
994
+ else {
995
+ const innermostNode = chain[chain.length - 1];
996
+ if (findChildNodes(innermostNode.id).length === 0) return vec4(0, 0, 0, 0);
997
+ terminusNode = composeNodeTree(innermostNode.id, processedMasks, currentlyComposedNodes);
998
+ }
999
+ const texture = trackConvertToTexture(terminusNode);
1000
+ let composedUV = screenUV;
1001
+ for (let i = chain.length - 1; i >= 0; i--) {
1002
+ const nodeInfo = chain[i];
1003
+ if (nodeInfo.uvTransformFunc) {
1004
+ composedUV = nodeInfo.uvTransformFunc({
1005
+ uv: composedUV,
1006
+ uniforms: nodeInfo.uniforms,
1007
+ viewportSize
1008
+ });
1009
+ if (nodeInfo.uniforms.edges?.uniform) composedUV = applyEdgeToUV(composedUV, nodeInfo.uniforms.edges.uniform);
1010
+ }
1011
+ if (currentlyComposedNodes) currentlyComposedNodes.add(nodeInfo.id);
1012
+ }
1013
+ const sampledColor = texture.sample(composedUV);
1014
+ const outermostNode = chain[0];
1015
+ if (outermostNode.uniforms.edges?.uniform) return applyEdgeHandling(composedUV, sampledColor, texture, outermostNode.uniforms.edges.uniform);
1016
+ return sampledColor;
1017
+ };
1018
+ const findSiblingUVChain = (sortedChildren, startIndex) => {
1019
+ const chain = [];
1020
+ for (let i = startIndex; i < sortedChildren.length; i++) {
1021
+ const sibling = sortedChildren[i];
1022
+ if (!isUVComposable(sibling)) break;
1023
+ if (findChildNodes(sibling.id).length > 0) break;
1024
+ chain.push(sibling);
1025
+ }
1026
+ return chain;
1027
+ };
1028
+ const composeSiblingUVChain = (chain, inputContent, currentlyComposedNodes) => {
1029
+ if (chain.length === 0) return inputContent;
1030
+ const texture = trackConvertToTexture(inputContent);
1031
+ let composedUV = screenUV;
1032
+ for (let i = chain.length - 1; i >= 0; i--) {
1033
+ const nodeInfo = chain[i];
1034
+ if (nodeInfo.uvTransformFunc) {
1035
+ composedUV = nodeInfo.uvTransformFunc({
1036
+ uv: composedUV,
1037
+ uniforms: nodeInfo.uniforms,
1038
+ viewportSize
1039
+ });
1040
+ if (nodeInfo.uniforms.edges?.uniform) composedUV = applyEdgeToUV(composedUV, nodeInfo.uniforms.edges.uniform);
1041
+ }
1042
+ if (currentlyComposedNodes) currentlyComposedNodes.add(nodeInfo.id);
1043
+ }
1044
+ const sampledColor = texture.sample(composedUV);
1045
+ const lastNode = chain[chain.length - 1];
1046
+ if (lastNode.uniforms.edges?.uniform) return applyEdgeHandling(composedUV, sampledColor, texture, lastNode.uniforms.edges.uniform);
1047
+ return sampledColor;
1048
+ };
1049
+ const hasUVPropagationOpportunity = (sortedChildren) => {
1050
+ const generators = [];
1051
+ const distortions = [];
1052
+ let hasGeneratorBeforeDistortion = false;
1053
+ for (let i = 0; i < sortedChildren.length; i++) {
1054
+ const child = sortedChildren[i];
1055
+ const childHasChildren = findChildNodes(child.id).length > 0;
1056
+ if (child.acceptsUVContext && !child.requiresChild) generators.push(i);
1057
+ if (isUVComposable(child) && !childHasChildren) {
1058
+ distortions.push(i);
1059
+ if (generators.length > 0) hasGeneratorBeforeDistortion = true;
1060
+ }
1061
+ }
1062
+ if (generators.length === 0 || distortions.length === 0 || !hasGeneratorBeforeDistortion) return false;
1063
+ const minGen = Math.min(...generators);
1064
+ const maxDist = Math.max(...distortions);
1065
+ for (let i = minGen + 1; i < maxDist; i++) {
1066
+ const node = sortedChildren[i];
1067
+ if (node.requiresRTT && !isUVComposable(node) && !(node.acceptsUVContext && !node.requiresChild)) return false;
1068
+ }
1069
+ if (distortions.length > 2) return false;
1070
+ return true;
1071
+ };
1072
+ const composeSiblingsWithUVContext = (sortedChildren, processedMasks, currentlyComposedNodes) => {
1073
+ const generators = [];
1074
+ const distortions = [];
1075
+ sortedChildren.forEach((child, index) => {
1076
+ const hasChildren = findChildNodes(child.id).length > 0;
1077
+ if (isUVComposable(child) && !hasChildren) distortions.push({
1078
+ node: child,
1079
+ index
1080
+ });
1081
+ else if (child.acceptsUVContext && !child.requiresChild && !hasChildren) generators.push({
1082
+ node: child,
1083
+ index
1084
+ });
1085
+ });
1086
+ for (const d of distortions) {
1087
+ const distortion = d.node;
1088
+ distortion.cleanupCallbacks.forEach((cb) => {
1089
+ try {
1090
+ cb();
1091
+ } catch (e) {
1092
+ console.error("Cleanup error:", e);
1093
+ }
1094
+ });
1095
+ distortion.cleanupCallbacks = [];
1096
+ distortion.beforeRenderCallbacks = [];
1097
+ distortion.afterRenderCallbacks = [];
1098
+ distortion.resizeCallbacks = [];
1099
+ const onCleanup = (cb) => distortion.cleanupCallbacks.push(cb);
1100
+ const onBeforeRender = (cb) => distortion.beforeRenderCallbacks.push(cb);
1101
+ const onAfterRender = (cb) => distortion.afterRenderCallbacks.push(cb);
1102
+ const onResize = (cb) => distortion.resizeCallbacks.push(cb);
1103
+ distortion.fragmentNodeFunc({
1104
+ uniforms: distortion.uniforms ?? {},
1105
+ childNode: void 0,
1106
+ uvContext: void 0,
1107
+ onCleanup,
1108
+ onBeforeRender,
1109
+ onAfterRender,
1110
+ onResize,
1111
+ canvas: canvasElement,
1112
+ dimensions: {
1113
+ width: currentWidth,
1114
+ height: currentHeight
1115
+ },
1116
+ renderer
1117
+ });
1118
+ if (currentlyComposedNodes) currentlyComposedNodes.add(distortion.id);
1119
+ }
1120
+ let composedResult = void 0;
1121
+ for (let i = 0; i < sortedChildren.length; i++) {
1122
+ const childInfo = sortedChildren[i];
1123
+ if (childInfo.metadata.visible === false) continue;
1124
+ const effectiveOpacity = childInfo.metadata.opacity ?? 1;
1125
+ childInfo.opacityUniform.value = effectiveOpacity;
1126
+ if (currentlyComposedNodes) currentlyComposedNodes.add(childInfo.id);
1127
+ const hasChildren = findChildNodes(childInfo.id).length > 0;
1128
+ let childResult;
1129
+ const genEntry = generators.find((g) => g.index === i);
1130
+ if (genEntry) {
1131
+ const applicableDistortions = distortions.filter((d) => d.index > genEntry.index).sort((a, b) => a.index - b.index).map((d) => d.node);
1132
+ let composedUV = screenUV;
1133
+ for (let j = applicableDistortions.length - 1; j >= 0; j--) {
1134
+ const distortion = applicableDistortions[j];
1135
+ if (distortion.uvTransformFunc) composedUV = distortion.uvTransformFunc({
1136
+ uv: composedUV,
1137
+ uniforms: distortion.uniforms,
1138
+ viewportSize
1139
+ });
1140
+ if (distortion.transformUniforms && distortion.metadata.transform && needsTransformation(distortion.metadata.transform)) {
1141
+ composedUV = applyUVTransform(composedUV, distortion.transformUniforms.offsetX, distortion.transformUniforms.offsetY, distortion.transformUniforms.rotation, distortion.transformUniforms.scale, distortion.transformUniforms.anchorX, distortion.transformUniforms.anchorY, distortion.transformUniforms.aspectRatio);
1142
+ if (distortion.transformUniforms.edges) composedUV = applyEdgeToUV(composedUV, distortion.transformUniforms.edges);
1143
+ distortion.transformRTTActive = true;
1144
+ }
1145
+ if (distortion.uniforms.edges?.uniform) composedUV = applyEdgeToUV(composedUV, distortion.uniforms.edges.uniform);
1146
+ }
1147
+ if (genEntry.node.transformUniforms && genEntry.node.metadata.transform && needsTransformation(genEntry.node.metadata.transform)) {
1148
+ composedUV = applyUVTransform(composedUV, genEntry.node.transformUniforms.offsetX, genEntry.node.transformUniforms.offsetY, genEntry.node.transformUniforms.rotation, genEntry.node.transformUniforms.scale, genEntry.node.transformUniforms.anchorX, genEntry.node.transformUniforms.anchorY, genEntry.node.transformUniforms.aspectRatio);
1149
+ if (genEntry.node.transformUniforms.edges) composedUV = applyEdgeToUV(composedUV, genEntry.node.transformUniforms.edges);
1150
+ genEntry.node.transformRTTActive = true;
1151
+ }
1152
+ childInfo.cleanupCallbacks.forEach((cb) => {
1153
+ try {
1154
+ cb();
1155
+ } catch (e) {
1156
+ console.error("Cleanup error:", e);
1157
+ }
1158
+ });
1159
+ childInfo.cleanupCallbacks = [];
1160
+ childInfo.beforeRenderCallbacks = [];
1161
+ childInfo.afterRenderCallbacks = [];
1162
+ childInfo.resizeCallbacks = [];
1163
+ const onCleanup = (cb) => childInfo.cleanupCallbacks.push(cb);
1164
+ const onBeforeRender = (cb) => childInfo.beforeRenderCallbacks.push(cb);
1165
+ const onAfterRender = (cb) => childInfo.afterRenderCallbacks.push(cb);
1166
+ const onResize = (cb) => childInfo.resizeCallbacks.push(cb);
1167
+ let fragmentResult = childInfo.fragmentNodeFunc({
1168
+ uniforms: childInfo.uniforms ?? {},
1169
+ childNode: void 0,
1170
+ uvContext: composedUV,
1171
+ onCleanup,
1172
+ onBeforeRender,
1173
+ onAfterRender,
1174
+ onResize,
1175
+ canvas: canvasElement,
1176
+ dimensions: {
1177
+ width: currentWidth,
1178
+ height: currentHeight
1179
+ },
1180
+ renderer
1181
+ });
1182
+ if (applicableDistortions.length > 0) {
1183
+ const outermostDistortion = applicableDistortions[0];
1184
+ if (outermostDistortion.uniforms.edges?.uniform) fragmentResult = applyEdgeHandling(composedUV, fragmentResult, null, outermostDistortion.uniforms.edges.uniform);
1185
+ }
1186
+ childResult = applyMaskIfNeeded(fragmentResult, childInfo, childInfo.id, processedMasks, composedUV);
1187
+ } else if (distortions.find((d) => d.index === i)) continue;
1188
+ else if (hasChildren) {
1189
+ if (canSkipRTT(childInfo)) childResult = composeUVContextChain(childInfo.id, processedMasks, currentlyComposedNodes);
1190
+ else if (isUVComposable(childInfo)) {
1191
+ const uvChain = findUVChain(childInfo.id);
1192
+ if (uvChain.length > 1) childResult = composeUVChain(uvChain, processedMasks, currentlyComposedNodes);
1193
+ else childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes);
1194
+ } else childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes);
1195
+ const applicableDistortions = distortions.filter((d) => d.index > i).sort((a, b) => a.index - b.index).map((d) => d.node);
1196
+ if (applicableDistortions.length > 0) {
1197
+ const childTexture = trackConvertToTexture(childResult);
1198
+ let composedUV = screenUV;
1199
+ for (let j = applicableDistortions.length - 1; j >= 0; j--) {
1200
+ const distortion = applicableDistortions[j];
1201
+ if (distortion.uvTransformFunc) composedUV = distortion.uvTransformFunc({
1202
+ uv: composedUV,
1203
+ uniforms: distortion.uniforms,
1204
+ viewportSize
1205
+ });
1206
+ if (distortion.transformUniforms && distortion.metadata.transform && needsTransformation(distortion.metadata.transform)) {
1207
+ composedUV = applyUVTransform(composedUV, distortion.transformUniforms.offsetX, distortion.transformUniforms.offsetY, distortion.transformUniforms.rotation, distortion.transformUniforms.scale, distortion.transformUniforms.anchorX, distortion.transformUniforms.anchorY, distortion.transformUniforms.aspectRatio);
1208
+ if (distortion.transformUniforms.edges) composedUV = applyEdgeToUV(composedUV, distortion.transformUniforms.edges);
1209
+ distortion.transformRTTActive = true;
1210
+ }
1211
+ if (distortion.uniforms.edges?.uniform) composedUV = applyEdgeToUV(composedUV, distortion.uniforms.edges.uniform);
1212
+ }
1213
+ childResult = childTexture.sample(composedUV);
1214
+ const outermostDistortion = applicableDistortions[applicableDistortions.length - 1];
1215
+ if (outermostDistortion.transformUniforms?.edges) childResult = applyEdgeHandling(composedUV, childResult, childTexture, outermostDistortion.transformUniforms.edges);
1216
+ }
1217
+ } else {
1218
+ childInfo.cleanupCallbacks.forEach((cb) => {
1219
+ try {
1220
+ cb();
1221
+ } catch (e) {
1222
+ console.error("Cleanup error:", e);
1223
+ }
1224
+ });
1225
+ childInfo.cleanupCallbacks = [];
1226
+ childInfo.beforeRenderCallbacks = [];
1227
+ childInfo.afterRenderCallbacks = [];
1228
+ childInfo.resizeCallbacks = [];
1229
+ const onCleanup = (cb) => childInfo.cleanupCallbacks.push(cb);
1230
+ const onBeforeRender = (cb) => childInfo.beforeRenderCallbacks.push(cb);
1231
+ const onAfterRender = (cb) => childInfo.afterRenderCallbacks.push(cb);
1232
+ const onResize = (cb) => childInfo.resizeCallbacks.push(cb);
1233
+ let effectiveChildNode = composedResult;
1234
+ if (childInfo.requiresRTT && composedResult !== void 0) effectiveChildNode = applyBlendMode(vec4(0, 0, 0, 0), composedResult, "normal", 1);
1235
+ childResult = applyMaskIfNeeded(applyNodeTransformation(childInfo.fragmentNodeFunc({
1236
+ uniforms: childInfo.uniforms ?? {},
1237
+ childNode: effectiveChildNode,
1238
+ onCleanup,
1239
+ onBeforeRender,
1240
+ onAfterRender,
1241
+ onResize,
1242
+ canvas: canvasElement,
1243
+ dimensions: {
1244
+ width: currentWidth,
1245
+ height: currentHeight
1246
+ },
1247
+ renderer
1248
+ }), childInfo), childInfo, childInfo.id, processedMasks);
1249
+ }
1250
+ if (childInfo.requiresChild && childInfo.metadata.blendMode === "normal" && !hasChildren) composedResult = applyBlendMode(vec4(0, 0, 0, 0), childResult, "normal", childInfo.opacityUniform);
1251
+ else if (composedResult === void 0) composedResult = applyBlendMode(vec4(1, 1, 1, 0), childResult, childInfo.metadata.blendMode, childInfo.opacityUniform);
1252
+ else composedResult = applyBlendMode(composedResult, childResult, childInfo.metadata.blendMode, childInfo.opacityUniform);
1253
+ }
1254
+ return composedResult ?? vec4(0, 0, 0, 0);
1255
+ };
1256
+ const composeNodeTree = (nodeId, processedMasks = /* @__PURE__ */ new Set(), currentlyComposedNodes, forceRTT = false) => {
1257
+ if (currentWidth === 0 || currentHeight === 0) return vec4(0, 0, 0, 0);
1258
+ const nodeInfo = nodeRegistry.nodes.get(nodeId);
1259
+ if (!nodeInfo) return vec4(0, 0, 0, 0);
1260
+ const nodeSpecificOnCleanup = (callback) => {
1261
+ nodeInfo.cleanupCallbacks.push(callback);
1262
+ };
1263
+ const nodeSpecificOnBeforeRender = (callback) => {
1264
+ nodeInfo.beforeRenderCallbacks.push(callback);
1265
+ };
1266
+ const nodeSpecificOnAfterRender = (callback) => {
1267
+ nodeInfo.afterRenderCallbacks.push(callback);
1268
+ };
1269
+ const nodeSpecificOnResize = (callback) => {
1270
+ nodeInfo.resizeCallbacks.push(callback);
1271
+ };
1272
+ const childNodes = findChildNodes(nodeId);
1273
+ if (childNodes.length === 0) {
1274
+ nodeInfo.cleanupCallbacks.forEach((callback) => {
1275
+ try {
1276
+ callback();
1277
+ } catch (e) {
1278
+ console.error("Error in cleanup callback:", e);
1279
+ }
1280
+ });
1281
+ nodeInfo.cleanupCallbacks = [];
1282
+ nodeInfo.beforeRenderCallbacks = [];
1283
+ nodeInfo.afterRenderCallbacks = [];
1284
+ nodeInfo.resizeCallbacks = [];
1285
+ return applyMaskIfNeeded(applyNodeTransformation(nodeInfo.fragmentNodeFunc({
1286
+ uniforms: nodeInfo.uniforms ?? {},
1287
+ childNode: void 0,
1288
+ onCleanup: nodeSpecificOnCleanup,
1289
+ onBeforeRender: nodeSpecificOnBeforeRender,
1290
+ onAfterRender: nodeSpecificOnAfterRender,
1291
+ onResize: nodeSpecificOnResize,
1292
+ canvas: canvasElement,
1293
+ dimensions: {
1294
+ width: currentWidth,
1295
+ height: currentHeight
1296
+ },
1297
+ renderer
1298
+ }), nodeInfo), nodeInfo, nodeId, processedMasks);
1299
+ } else {
1300
+ const sortedChildren = [...childNodes].sort((a, b) => a.metadata.renderOrder - b.metadata.renderOrder);
1301
+ if (nodeInfo.parentId === null) {
1302
+ if (!forceRTT && hasUVPropagationOpportunity(sortedChildren)) return applyMaskIfNeeded(applyNodeTransformation(composeSiblingsWithUVContext(sortedChildren, processedMasks, currentlyComposedNodes), nodeInfo), nodeInfo, nodeId, processedMasks);
1303
+ let composedChildren = void 0;
1304
+ for (let i = 0; i < sortedChildren.length; i++) {
1305
+ const childInfo = sortedChildren[i];
1306
+ let effectiveOpacity;
1307
+ if (childInfo.metadata.opacity === void 0) {
1308
+ effectiveOpacity = 1;
1309
+ childInfo.opacityUniform.value = effectiveOpacity;
1310
+ } else {
1311
+ effectiveOpacity = childInfo.metadata.opacity;
1312
+ childInfo.opacityUniform.value = effectiveOpacity;
1313
+ }
1314
+ if (childInfo.metadata.visible === false) continue;
1315
+ if (currentlyComposedNodes) currentlyComposedNodes.add(childInfo.id);
1316
+ const childHasChildren = findChildNodes(childInfo.id).length > 0;
1317
+ let childResult;
1318
+ if (childHasChildren) if (forceRTT) childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes, true);
1319
+ else if (canSkipRTT(childInfo)) childResult = composeUVContextChain(childInfo.id, processedMasks, currentlyComposedNodes);
1320
+ else if (isUVComposable(childInfo)) {
1321
+ const uvChain = findUVChain(childInfo.id);
1322
+ if (uvChain.length > 1) childResult = composeUVChain(uvChain, processedMasks, currentlyComposedNodes);
1323
+ else childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes);
1324
+ } else childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes);
1325
+ else {
1326
+ if (isUVComposable(childInfo) && childInfo.requiresChild && composedChildren !== void 0) {
1327
+ const siblingChain = findSiblingUVChain(sortedChildren, i);
1328
+ if (siblingChain.length > 1) {
1329
+ childResult = composeSiblingUVChain(siblingChain, composedChildren, currentlyComposedNodes);
1330
+ i += siblingChain.length - 1;
1331
+ composedChildren = childResult;
1332
+ continue;
1333
+ }
1334
+ }
1335
+ {
1336
+ const childSpecificOnCleanup = (callback) => {
1337
+ childInfo.cleanupCallbacks.push(callback);
1338
+ };
1339
+ const childSpecificOnBeforeRender = (callback) => {
1340
+ childInfo.beforeRenderCallbacks.push(callback);
1341
+ };
1342
+ const childSpecificOnAfterRender = (callback) => {
1343
+ childInfo.afterRenderCallbacks.push(callback);
1344
+ };
1345
+ const childSpecificOnResize = (callback) => {
1346
+ childInfo.resizeCallbacks.push(callback);
1347
+ };
1348
+ let effectiveChildNode = composedChildren;
1349
+ if (childInfo.requiresRTT && composedChildren !== void 0) effectiveChildNode = applyBlendMode(vec4(0, 0, 0, 0), composedChildren, "normal", 1);
1350
+ childInfo.cleanupCallbacks.forEach((callback) => {
1351
+ try {
1352
+ callback();
1353
+ } catch (e) {
1354
+ console.error("Error in cleanup callback:", e);
1355
+ }
1356
+ });
1357
+ childInfo.cleanupCallbacks = [];
1358
+ childInfo.beforeRenderCallbacks = [];
1359
+ childInfo.afterRenderCallbacks = [];
1360
+ childInfo.resizeCallbacks = [];
1361
+ childResult = applyMaskIfNeeded(applyNodeTransformation(childInfo.fragmentNodeFunc({
1362
+ uniforms: childInfo.uniforms ?? {},
1363
+ childNode: effectiveChildNode,
1364
+ onCleanup: childSpecificOnCleanup,
1365
+ onBeforeRender: childSpecificOnBeforeRender,
1366
+ onAfterRender: childSpecificOnAfterRender,
1367
+ onResize: childSpecificOnResize,
1368
+ canvas: canvasElement,
1369
+ dimensions: {
1370
+ width: currentWidth,
1371
+ height: currentHeight
1372
+ },
1373
+ renderer
1374
+ }), childInfo), childInfo, childInfo.id, processedMasks);
1375
+ }
1376
+ }
1377
+ if (childInfo.requiresChild && childInfo.metadata.blendMode === "normal" && !childHasChildren) composedChildren = applyBlendMode(vec4(0, 0, 0, 0), childResult, "normal", childInfo.opacityUniform);
1378
+ else if (composedChildren === void 0) if (nodeInfo.requiresRTT || effectiveOpacity !== 1) composedChildren = applyBlendMode(vec4(1, 1, 1, 0), childResult, childInfo.metadata.blendMode, childInfo.opacityUniform);
1379
+ else composedChildren = childResult;
1380
+ else composedChildren = applyBlendMode(composedChildren, childResult, childInfo.metadata.blendMode, childInfo.opacityUniform);
1381
+ }
1382
+ nodeInfo.cleanupCallbacks.forEach((callback) => {
1383
+ try {
1384
+ callback();
1385
+ } catch (e) {
1386
+ console.error("Error in cleanup callback:", e);
1387
+ }
1388
+ });
1389
+ nodeInfo.cleanupCallbacks = [];
1390
+ nodeInfo.beforeRenderCallbacks = [];
1391
+ nodeInfo.afterRenderCallbacks = [];
1392
+ nodeInfo.resizeCallbacks = [];
1393
+ return applyMaskIfNeeded(applyNodeTransformation(nodeInfo.fragmentNodeFunc({
1394
+ uniforms: nodeInfo.uniforms ?? {},
1395
+ childNode: composedChildren,
1396
+ onCleanup: nodeSpecificOnCleanup,
1397
+ onBeforeRender: nodeSpecificOnBeforeRender,
1398
+ onAfterRender: nodeSpecificOnAfterRender,
1399
+ onResize: nodeSpecificOnResize,
1400
+ canvas: canvasElement,
1401
+ dimensions: {
1402
+ width: currentWidth,
1403
+ height: currentHeight
1404
+ },
1405
+ renderer
1406
+ }), nodeInfo), nodeInfo, nodeId, processedMasks);
1407
+ } else {
1408
+ if (!forceRTT && hasUVPropagationOpportunity(sortedChildren)) {
1409
+ const composedChildrenResult$1 = composeSiblingsWithUVContext(sortedChildren, processedMasks, currentlyComposedNodes);
1410
+ return applyMaskIfNeeded(applyNodeTransformation(nodeInfo.fragmentNodeFunc({
1411
+ uniforms: nodeInfo.uniforms ?? {},
1412
+ childNode: composedChildrenResult$1,
1413
+ onCleanup: nodeSpecificOnCleanup,
1414
+ onBeforeRender: nodeSpecificOnBeforeRender,
1415
+ onAfterRender: nodeSpecificOnAfterRender,
1416
+ onResize: nodeSpecificOnResize,
1417
+ canvas: canvasElement,
1418
+ dimensions: {
1419
+ width: currentWidth,
1420
+ height: currentHeight
1421
+ },
1422
+ renderer
1423
+ }), nodeInfo), nodeInfo, nodeId, processedMasks);
1424
+ }
1425
+ let composedChildrenResult = void 0;
1426
+ for (let i = 0; i < sortedChildren.length; i++) {
1427
+ const childInfo = sortedChildren[i];
1428
+ let effectiveOpacity;
1429
+ if (childInfo.metadata.opacity === void 0) {
1430
+ effectiveOpacity = 1;
1431
+ childInfo.opacityUniform.value = effectiveOpacity;
1432
+ } else {
1433
+ effectiveOpacity = childInfo.metadata.opacity;
1434
+ childInfo.opacityUniform.value = effectiveOpacity;
1435
+ }
1436
+ if (childInfo.metadata.visible === false) continue;
1437
+ if (currentlyComposedNodes) currentlyComposedNodes.add(childInfo.id);
1438
+ const childHasChildren = findChildNodes(childInfo.id).length > 0;
1439
+ let childResult;
1440
+ if (childHasChildren) if (forceRTT) childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes, true);
1441
+ else if (canSkipRTT(childInfo)) childResult = composeUVContextChain(childInfo.id, processedMasks, currentlyComposedNodes);
1442
+ else if (isUVComposable(childInfo)) {
1443
+ const uvChain = findUVChain(childInfo.id);
1444
+ if (uvChain.length > 1) childResult = composeUVChain(uvChain, processedMasks, currentlyComposedNodes);
1445
+ else childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes);
1446
+ } else childResult = composeNodeTree(childInfo.id, processedMasks, currentlyComposedNodes);
1447
+ else {
1448
+ if (isUVComposable(childInfo) && childInfo.requiresChild && composedChildrenResult !== void 0) {
1449
+ const siblingChain = findSiblingUVChain(sortedChildren, i);
1450
+ if (siblingChain.length > 1) {
1451
+ childResult = composeSiblingUVChain(siblingChain, composedChildrenResult, currentlyComposedNodes);
1452
+ i += siblingChain.length - 1;
1453
+ composedChildrenResult = childResult;
1454
+ continue;
1455
+ }
1456
+ }
1457
+ {
1458
+ const childSpecificOnCleanup = (callback) => {
1459
+ childInfo.cleanupCallbacks.push(callback);
1460
+ };
1461
+ const childSpecificOnBeforeRender = (callback) => {
1462
+ childInfo.beforeRenderCallbacks.push(callback);
1463
+ };
1464
+ const childSpecificOnAfterRender = (callback) => {
1465
+ childInfo.afterRenderCallbacks.push(callback);
1466
+ };
1467
+ const childSpecificOnResize = (callback) => {
1468
+ childInfo.resizeCallbacks.push(callback);
1469
+ };
1470
+ let effectiveChildNode = composedChildrenResult;
1471
+ if (childInfo.requiresRTT && composedChildrenResult !== void 0) effectiveChildNode = applyBlendMode(vec4(0, 0, 0, 0), composedChildrenResult, "normal", 1);
1472
+ childInfo.cleanupCallbacks = [];
1473
+ childInfo.beforeRenderCallbacks = [];
1474
+ childInfo.afterRenderCallbacks = [];
1475
+ childInfo.resizeCallbacks = [];
1476
+ childResult = applyMaskIfNeeded(applyNodeTransformation(childInfo.fragmentNodeFunc({
1477
+ uniforms: childInfo.uniforms ?? {},
1478
+ childNode: effectiveChildNode,
1479
+ onCleanup: childSpecificOnCleanup,
1480
+ onBeforeRender: childSpecificOnBeforeRender,
1481
+ onAfterRender: childSpecificOnAfterRender,
1482
+ onResize: childSpecificOnResize,
1483
+ canvas: canvasElement,
1484
+ dimensions: {
1485
+ width: currentWidth,
1486
+ height: currentHeight
1487
+ },
1488
+ renderer
1489
+ }), childInfo), childInfo, childInfo.id, processedMasks);
1490
+ }
1491
+ }
1492
+ if (childInfo.requiresChild && childInfo.metadata.blendMode === "normal" && !childHasChildren) composedChildrenResult = applyBlendMode(vec4(0, 0, 0, 0), childResult, "normal", childInfo.opacityUniform);
1493
+ else if (composedChildrenResult === void 0) if (nodeInfo.requiresRTT || effectiveOpacity !== 1) composedChildrenResult = applyBlendMode(vec4(1, 1, 1, 0), childResult, childInfo.metadata.blendMode, childInfo.opacityUniform);
1494
+ else composedChildrenResult = childResult;
1495
+ else composedChildrenResult = applyBlendMode(composedChildrenResult, childResult, childInfo.metadata.blendMode, childInfo.opacityUniform);
1496
+ }
1497
+ nodeInfo.cleanupCallbacks.forEach((callback) => {
1498
+ try {
1499
+ callback();
1500
+ } catch (e) {
1501
+ console.error("Error in cleanup callback:", e);
1502
+ }
1503
+ });
1504
+ nodeInfo.cleanupCallbacks = [];
1505
+ nodeInfo.beforeRenderCallbacks = [];
1506
+ nodeInfo.afterRenderCallbacks = [];
1507
+ nodeInfo.resizeCallbacks = [];
1508
+ return applyMaskIfNeeded(applyNodeTransformation(nodeInfo.fragmentNodeFunc({
1509
+ uniforms: nodeInfo.uniforms ?? {},
1510
+ childNode: composedChildrenResult,
1511
+ onCleanup: nodeSpecificOnCleanup,
1512
+ onBeforeRender: nodeSpecificOnBeforeRender,
1513
+ onAfterRender: nodeSpecificOnAfterRender,
1514
+ onResize: nodeSpecificOnResize,
1515
+ canvas: canvasElement,
1516
+ dimensions: {
1517
+ width: currentWidth,
1518
+ height: currentHeight
1519
+ },
1520
+ renderer
1521
+ }), nodeInfo), nodeInfo, nodeId, processedMasks);
1522
+ }
1523
+ }
1524
+ };
1525
+ const registerNode = (id, fragmentNodeFunc, parentId, metadata, uniforms = {}, componentDefinition$55) => {
1526
+ if (fragmentNodeFunc === null) {
1527
+ const queueIndex = pendingRegistrationQueue.findIndex((item) => item.id === id);
1528
+ if (queueIndex !== -1) {
1529
+ pendingRegistrationQueue.splice(queueIndex, 1);
1530
+ return;
1531
+ }
1532
+ removeNode(id);
1533
+ return;
1534
+ }
1535
+ if (!isRendererReady) {
1536
+ const existing = pendingRegistrationQueue.findIndex((item) => item.id === id);
1537
+ if (existing !== -1) pendingRegistrationQueue[existing] = {
1538
+ id,
1539
+ fragmentNodeFunc,
1540
+ parentId,
1541
+ metadata,
1542
+ uniforms,
1543
+ componentDefinition: componentDefinition$55
1544
+ };
1545
+ else pendingRegistrationQueue.push({
1546
+ id,
1547
+ fragmentNodeFunc,
1548
+ parentId,
1549
+ metadata,
1550
+ uniforms,
1551
+ componentDefinition: componentDefinition$55
1552
+ });
1553
+ return;
1554
+ }
1555
+ let defaultRenderOrder = 0;
1556
+ if (parentId !== null) {
1557
+ const siblings = parentToChildren.get(parentId);
1558
+ if (siblings && siblings.size > 0) {
1559
+ let maxOrder = 0;
1560
+ for (const siblingId of siblings) {
1561
+ const sibling = nodeRegistry.nodes.get(siblingId);
1562
+ if (sibling && sibling.metadata.renderOrder > maxOrder) maxOrder = sibling.metadata.renderOrder;
1563
+ }
1564
+ defaultRenderOrder = maxOrder + 1;
1565
+ }
1566
+ }
1567
+ const opacityUniform = uniform(metadata?.opacity !== void 0 ? metadata.opacity : 1);
1568
+ let transformUniforms = void 0;
1569
+ if (metadata?.transform) {
1570
+ const aspectRatio = currentWidth / Math.max(1, currentHeight);
1571
+ transformUniforms = {
1572
+ offsetX: uniform(metadata.transform.offsetX),
1573
+ offsetY: uniform(metadata.transform.offsetY),
1574
+ rotation: uniform(metadata.transform.rotation),
1575
+ scale: uniform(metadata.transform.scale),
1576
+ anchorX: uniform(metadata.transform.anchorX),
1577
+ anchorY: uniform(metadata.transform.anchorY),
1578
+ edges: uniform(metadata.transform.edges === "stretch" ? 0 : metadata.transform.edges === "transparent" ? 1 : metadata.transform.edges === "mirror" ? 2 : 3),
1579
+ aspectRatio: uniform(aspectRatio)
1580
+ };
1581
+ }
1582
+ const nodeInfo = {
1583
+ id,
1584
+ componentName: componentDefinition$55?.name || "Unknown",
1585
+ fragmentNodeFunc,
1586
+ parentId,
1587
+ requiresRTT: componentDefinition$55?.requiresRTT || false,
1588
+ requiresChild: componentDefinition$55?.requiresChild || false,
1589
+ opacityUniform,
1590
+ metadata: {
1591
+ blendMode: metadata?.blendMode || "normal",
1592
+ opacity: metadata?.opacity,
1593
+ visible: metadata?.visible === false ? false : true,
1594
+ id: metadata?.id,
1595
+ mask: metadata?.mask,
1596
+ renderOrder: metadata?.renderOrder !== void 0 ? metadata?.renderOrder : defaultRenderOrder,
1597
+ transform: metadata?.transform
1598
+ },
1599
+ uniforms,
1600
+ cleanupCallbacks: [],
1601
+ beforeRenderCallbacks: [],
1602
+ afterRenderCallbacks: [],
1603
+ resizeCallbacks: [],
1604
+ transformUniforms,
1605
+ transformRTTActive: false,
1606
+ uvTransformFunc: componentDefinition$55?.uvTransformNode,
1607
+ acceptsUVContext: componentDefinition$55?.acceptsUVContext || false
1608
+ };
1609
+ nodeRegistry.nodes.set(id, nodeInfo);
1610
+ if (parentId === null) nodeRegistry.rootId = id;
1611
+ const childrenSet = parentToChildren.get(parentId) || /* @__PURE__ */ new Set();
1612
+ childrenSet.add(id);
1613
+ parentToChildren.set(parentId, childrenSet);
1614
+ if (material && isInitialized && currentWidth > 0 && currentHeight > 0) {
1615
+ if (!registrationQueue.includes(id)) registrationQueue.push(id);
1616
+ if (registrationBatchRAF === null) registrationBatchRAF = requestAnimationFrame(() => {
1617
+ registrationBatchRAF = null;
1618
+ registrationQueue = [];
1619
+ updateMaterial();
1620
+ });
1621
+ } else if (material && isInitialized) {
1622
+ if (!materialUpdatePending) {
1623
+ materialUpdatePending = true;
1624
+ requestAnimationFrame(() => {
1625
+ materialUpdatePending = false;
1626
+ if (currentWidth > 0 && currentHeight > 0) updateMaterial();
1627
+ });
1628
+ }
1629
+ }
1630
+ };
1631
+ const updateUniformValue$1 = (nodeId, uniformName, value) => {
1632
+ const nodeInfo = nodeRegistry.nodes.get(nodeId);
1633
+ if (!nodeInfo || !nodeInfo.uniforms) return;
1634
+ const uniformDefinition = nodeInfo.uniforms[uniformName];
1635
+ if (!uniformDefinition || !uniformDefinition.uniform) return;
1636
+ if (uniformDefinition.transform) updateUniformValue(uniformDefinition, value);
1637
+ else uniformDefinition.uniform.value = value;
1638
+ renderFrame();
1639
+ };
1640
+ const updateNodeMetadata = (nodeId, metadata) => {
1641
+ const existingNode = nodeRegistry.nodes.get(nodeId);
1642
+ if (!existingNode) return;
1643
+ let needsRecompose = false;
1644
+ if (metadata.blendMode !== void 0 && existingNode.metadata.blendMode !== metadata.blendMode) {
1645
+ existingNode.metadata.blendMode = metadata.blendMode;
1646
+ needsRecompose = true;
1647
+ }
1648
+ if (metadata.opacity !== void 0 && existingNode.metadata.opacity !== metadata.opacity) {
1649
+ existingNode.metadata.opacity = metadata.opacity;
1650
+ existingNode.opacityUniform.value = metadata.opacity;
1651
+ }
1652
+ if (metadata.renderOrder !== void 0 && existingNode.metadata.renderOrder !== metadata.renderOrder) {
1653
+ existingNode.metadata.renderOrder = metadata.renderOrder;
1654
+ needsRecompose = true;
1655
+ }
1656
+ const newVisible = metadata.visible === false ? false : true;
1657
+ if (existingNode.metadata.visible !== newVisible) {
1658
+ existingNode.metadata.visible = newVisible;
1659
+ needsRecompose = true;
1660
+ }
1661
+ if (metadata.id !== void 0 && existingNode.metadata.id !== metadata.id) {
1662
+ existingNode.metadata.id = metadata.id;
1663
+ needsRecompose = true;
1664
+ }
1665
+ if (metadata.mask !== void 0 && (existingNode.metadata.mask?.source !== metadata.mask?.source || existingNode.metadata.mask?.type !== metadata.mask?.type)) {
1666
+ existingNode.metadata.mask = metadata.mask;
1667
+ needsRecompose = true;
1668
+ }
1669
+ if (metadata.transform !== void 0) {
1670
+ const oldTransformState = existingNode.metadata.transform ? needsTransformation(existingNode.metadata.transform) : false;
1671
+ const newTransformState = needsTransformation(metadata.transform);
1672
+ existingNode.metadata.transform = metadata.transform;
1673
+ if (!existingNode.transformUniforms && metadata.transform) {
1674
+ const aspectRatio = currentWidth / Math.max(1, currentHeight);
1675
+ existingNode.transformUniforms = {
1676
+ offsetX: uniform(metadata.transform.offsetX),
1677
+ offsetY: uniform(metadata.transform.offsetY),
1678
+ rotation: uniform(metadata.transform.rotation),
1679
+ scale: uniform(metadata.transform.scale),
1680
+ anchorX: uniform(metadata.transform.anchorX),
1681
+ anchorY: uniform(metadata.transform.anchorY),
1682
+ edges: uniform(metadata.transform.edges === "stretch" ? 0 : metadata.transform.edges === "transparent" ? 1 : metadata.transform.edges === "mirror" ? 2 : 3),
1683
+ aspectRatio: uniform(aspectRatio)
1684
+ };
1685
+ } else if (existingNode.transformUniforms) {
1686
+ existingNode.transformUniforms.offsetX.value = metadata.transform.offsetX;
1687
+ existingNode.transformUniforms.offsetY.value = metadata.transform.offsetY;
1688
+ existingNode.transformUniforms.rotation.value = metadata.transform.rotation;
1689
+ existingNode.transformUniforms.scale.value = metadata.transform.scale;
1690
+ existingNode.transformUniforms.anchorX.value = metadata.transform.anchorX;
1691
+ existingNode.transformUniforms.anchorY.value = metadata.transform.anchorY;
1692
+ existingNode.transformUniforms.edges.value = metadata.transform.edges === "stretch" ? 0 : metadata.transform.edges === "transparent" ? 1 : metadata.transform.edges === "mirror" ? 2 : 3;
1693
+ }
1694
+ if (newTransformState && !existingNode.transformRTTActive) {
1695
+ existingNode.transformRTTActive = true;
1696
+ needsRecompose = true;
1697
+ }
1698
+ if (!oldTransformState && newTransformState && !existingNode.transformRTTActive) needsRecompose = true;
1699
+ }
1700
+ if (needsRecompose && material && isInitialized) {
1701
+ if (!metadataUpdateQueue.includes(nodeId)) metadataUpdateQueue.push(nodeId);
1702
+ if (metadataUpdateBatchRAF === null) metadataUpdateBatchRAF = requestAnimationFrame(() => {
1703
+ metadataUpdateBatchRAF = null;
1704
+ metadataUpdateQueue = [];
1705
+ updateMaterial();
1706
+ });
1707
+ } else renderFrame();
1708
+ };
1709
+ const removeNode = (id) => {
1710
+ if (!nodeRegistry.nodes.has(id)) return;
1711
+ const nodeInfo = nodeRegistry.nodes.get(id);
1712
+ if (nodeInfo && nodeInfo.cleanupCallbacks.length > 0) for (const callback of nodeInfo.cleanupCallbacks) try {
1713
+ callback();
1714
+ } catch (e) {
1715
+ console.error(`Error executing cleanup callback for node ${id}:`, e);
1716
+ }
1717
+ const childNodes = findChildNodes(id);
1718
+ for (const child of childNodes) removeNode(child.id);
1719
+ if (nodeRegistry.rootId === id) nodeRegistry.rootId = null;
1720
+ if (nodeInfo) {
1721
+ const childrenSet = parentToChildren.get(nodeInfo.parentId);
1722
+ if (childrenSet) {
1723
+ childrenSet.delete(id);
1724
+ if (childrenSet.size === 0) parentToChildren.delete(nodeInfo.parentId);
1725
+ }
1726
+ }
1727
+ nodeRegistry.nodes.delete(id);
1728
+ if (material && isInitialized) updateMaterial();
1729
+ };
1730
+ const executeBeforeRenderCallbacks = (deltaTime) => {
1731
+ const params = {
1732
+ deltaTime,
1733
+ pointer: {
1734
+ x: pointerX,
1735
+ y: pointerY
1736
+ },
1737
+ pointerActive,
1738
+ dimensions: {
1739
+ width: currentWidth,
1740
+ height: currentHeight
1741
+ }
1742
+ };
1743
+ for (const nodeInfo of nodeRegistry.nodes.values()) if (nodeInfo.beforeRenderCallbacks.length > 0) for (const callback of nodeInfo.beforeRenderCallbacks) try {
1744
+ callback(params);
1745
+ } catch (e) {
1746
+ console.error(`Error executing before render callback for node ${nodeInfo.id}:`, e);
1747
+ }
1748
+ };
1749
+ const executeAfterRenderCallbacks = (deltaTime) => {
1750
+ const params = {
1751
+ deltaTime,
1752
+ pointer: {
1753
+ x: pointerX,
1754
+ y: pointerY
1755
+ },
1756
+ pointerActive,
1757
+ dimensions: {
1758
+ width: currentWidth,
1759
+ height: currentHeight
1760
+ }
1761
+ };
1762
+ for (const nodeInfo of nodeRegistry.nodes.values()) if (nodeInfo.afterRenderCallbacks.length > 0) for (const callback of nodeInfo.afterRenderCallbacks) try {
1763
+ callback(params);
1764
+ } catch (e) {
1765
+ console.error(`Error executing after render callback for node ${nodeInfo.id}:`, e);
1766
+ }
1767
+ };
1768
+ const renderFrame = async () => {
1769
+ if (!canRender()) return;
1770
+ const frameStartTime = enablePerformanceTracking ? performance.now() : 0;
1771
+ const currentTime = frameStartTime || performance.now();
1772
+ const deltaTime = lastRenderTime > 0 ? (currentTime - lastRenderTime) / 1e3 : .016;
1773
+ const OFF_SCREEN_FPS_INTERVAL = 1e3;
1774
+ if (!isVisible && lastRenderTime > 0) {
1775
+ if (currentTime - lastRenderTime < OFF_SCREEN_FPS_INTERVAL) return;
1776
+ }
1777
+ const cappedDeltaTime = Math.min(deltaTime, .1);
1778
+ lastRenderTime = currentTime;
1779
+ if (enablePerformanceTracking) performance.mark("shader-cpu-start");
1780
+ executeBeforeRenderCallbacks(cappedDeltaTime);
1781
+ try {
1782
+ if (isUpdatingMaterial) return;
1783
+ if (enablePerformanceTracking) performance.mark("shader-gpu-start");
1784
+ renderer.render(scene, camera);
1785
+ executeAfterRenderCallbacks(cappedDeltaTime);
1786
+ if (enablePerformanceTracking) {
1787
+ performance.mark("shader-gpu-end");
1788
+ if (renderer instanceof WebGPURenderer) try {
1789
+ const backend = renderer.backend;
1790
+ if (backend && backend.get && backend.get(renderer)) {
1791
+ const renderContext = backend.get(renderer);
1792
+ if (renderContext?.timestampQuery) {
1793
+ const gpuTime = renderContext.timestampQuery.getResult();
1794
+ if (gpuTime !== null && gpuTime !== void 0) performanceTracker.recordGpuTime(gpuTime / 1e6);
1795
+ }
1796
+ }
1797
+ } catch (e) {}
1798
+ try {
1799
+ performance.measure("shader-gpu-time", "shader-gpu-start", "shader-gpu-end");
1800
+ const gpuMeasure = performance.getEntriesByName("shader-gpu-time")[0];
1801
+ if (gpuMeasure) performanceTracker.recordGpuTime(gpuMeasure.duration);
1802
+ performance.clearMarks("shader-gpu-start");
1803
+ performance.clearMarks("shader-gpu-end");
1804
+ performance.clearMeasures("shader-gpu-time");
1805
+ } catch (e) {}
1806
+ }
1807
+ if (enablePerformanceTracking) {
1808
+ performance.mark("shader-cpu-end");
1809
+ try {
1810
+ performance.measure("shader-cpu-time", "shader-cpu-start", "shader-cpu-end");
1811
+ const cpuMeasure = performance.getEntriesByName("shader-cpu-time")[0];
1812
+ if (cpuMeasure) performanceTracker.recordCpuTime(cpuMeasure.duration);
1813
+ performance.clearMarks("shader-cpu-start");
1814
+ performance.clearMarks("shader-cpu-end");
1815
+ performance.clearMeasures("shader-cpu-time");
1816
+ } catch (e) {}
1817
+ const frameTime = performance.now() - frameStartTime;
1818
+ performanceTracker.recordFrame(frameTime);
1819
+ }
1820
+ } catch (error) {
1821
+ console.error("Render frame error:", error);
1822
+ }
1823
+ };
1824
+ const updatePerformanceNodeCounts = () => {
1825
+ const nodeCount = Math.max(0, nodeRegistry.nodes.size - 1);
1826
+ const rttNodeCount = actualRTTOperations;
1827
+ performanceTracker.updateNodeCounts(nodeCount, rttNodeCount);
1828
+ };
1829
+ const getPerformanceStats = () => {
1830
+ updatePerformanceNodeCounts();
1831
+ const rendererInfo = renderer?.info;
1832
+ return performanceTracker.getStats(rendererInfo);
1833
+ };
1834
+ const startAnimation = () => {
1835
+ if (animationFrameId || !shouldAnimate) return;
1836
+ performanceTracker.setRendering(true);
1837
+ const animate = () => {
1838
+ animationFrameId = requestAnimationFrame(animate);
1839
+ renderFrame().catch(console.warn);
1840
+ };
1841
+ animate();
1842
+ };
1843
+ const stopAnimation = () => {
1844
+ if (animationFrameId) {
1845
+ cancelAnimationFrame(animationFrameId);
1846
+ animationFrameId = null;
1847
+ }
1848
+ performanceTracker.setRendering(false);
1849
+ };
1850
+ const updatePointerCoords = (event) => {
1851
+ if (!canvasElement) return;
1852
+ let clientX;
1853
+ let clientY;
1854
+ if ("touches" in event) {
1855
+ if (event.touches.length === 0) return;
1856
+ clientX = event.touches[0].clientX;
1857
+ clientY = event.touches[0].clientY;
1858
+ } else {
1859
+ clientX = event.clientX;
1860
+ clientY = event.clientY;
1861
+ }
1862
+ const rect = canvasElement.getBoundingClientRect();
1863
+ const x = (clientX - rect.left) / rect.width;
1864
+ const y = (clientY - rect.top) / rect.height;
1865
+ pointerX = x;
1866
+ pointerY = y;
1867
+ };
1868
+ const globalMouseMoveHandler = (event) => {
1869
+ if (!isInitialized || !canvasElement) return;
1870
+ updatePointerCoords(event);
1871
+ };
1872
+ const globalTouchMoveHandler = (event) => {
1873
+ if (!isInitialized || !canvasElement) return;
1874
+ updatePointerCoords(event);
1875
+ };
1876
+ const globalMouseUpHandler = () => {
1877
+ if (!isInitialized) return;
1878
+ pointerActive = false;
1879
+ renderFrame().catch(console.warn);
1880
+ };
1881
+ const globalTouchEndHandler = () => {
1882
+ if (!isInitialized) return;
1883
+ pointerActive = false;
1884
+ renderFrame().catch(console.warn);
1885
+ };
1886
+ const canvasMouseDownHandler = () => {
1887
+ pointerActive = true;
1888
+ renderFrame().catch(console.warn);
1889
+ };
1890
+ const canvasTouchStartHandler = () => {
1891
+ pointerActive = true;
1892
+ renderFrame().catch(console.warn);
1893
+ };
1894
+ const processQueuedRegistrations = () => {
1895
+ if (pendingRegistrationQueue.length === 0) return;
1896
+ const queue = [...pendingRegistrationQueue];
1897
+ pendingRegistrationQueue = [];
1898
+ for (const { id, fragmentNodeFunc, parentId, metadata, uniforms, componentDefinition: componentDefinition$55 } of queue) if (fragmentNodeFunc) registerNode(id, fragmentNodeFunc, parentId, metadata, uniforms, componentDefinition$55);
1899
+ };
1900
+ const initialize = async ({ canvas, enablePerformanceTracking: enableTracking = false }) => {
1901
+ if (isInitialized || isInitializing) return;
1902
+ enablePerformanceTracking = enableTracking;
1903
+ isInitializing = true;
1904
+ initializationAbortController = new AbortController();
1905
+ const localAbortController = initializationAbortController;
1906
+ try {
1907
+ canvasElement = canvas;
1908
+ scene = new Scene();
1909
+ scene.background = null;
1910
+ camera = new OrthographicCamera(-1, 1, 1, -1, .1, 10);
1911
+ camera.position.z = 1;
1912
+ camera.lookAt(0, 0, 0);
1913
+ globalEventUnregister = globalEventManager.register({
1914
+ onMouseMove: globalMouseMoveHandler,
1915
+ onTouchMove: globalTouchMoveHandler,
1916
+ onMouseUp: globalMouseUpHandler,
1917
+ onTouchEnd: globalTouchEndHandler
1918
+ });
1919
+ canvas.addEventListener("mousedown", canvasMouseDownHandler);
1920
+ canvas.addEventListener("touchstart", canvasTouchStartHandler);
1921
+ unloadHandler = () => {
1922
+ cleanup();
1923
+ };
1924
+ window.addEventListener("beforeunload", unloadHandler);
1925
+ if (localAbortController.signal.aborted) return;
1926
+ try {
1927
+ const rendererOptions = {
1928
+ canvas,
1929
+ antialias: true,
1930
+ alpha: true,
1931
+ depth: false,
1932
+ powerPreference: "high-performance"
1933
+ };
1934
+ if (enablePerformanceTracking) {
1935
+ rendererOptions.forceWebGL = false;
1936
+ rendererOptions.requiredFeatures = ["timestamp-query"];
1937
+ }
1938
+ renderer = new WebGPURenderer(rendererOptions);
1939
+ await renderer.init();
1940
+ if (localAbortController.signal.aborted) return;
1941
+ } catch (e) {
1942
+ if (localAbortController.signal.aborted) return;
1943
+ console.warn("[Shaders] WebGPU initialization failed, falling back to WebGL:", e);
1944
+ try {
1945
+ renderer = new WebGLRenderer({
1946
+ canvas,
1947
+ antialias: true,
1948
+ alpha: true,
1949
+ depth: false,
1950
+ powerPreference: "high-performance"
1951
+ });
1952
+ if (localAbortController.signal.aborted) return;
1953
+ } catch (webglError) {
1954
+ if (localAbortController.signal.aborted) return;
1955
+ console.error("[Shaders] Both WebGPU and WebGL initialization failed:", webglError);
1956
+ return;
1957
+ }
1958
+ }
1959
+ if (localAbortController.signal.aborted) return;
1960
+ renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));
1961
+ renderer.outputColorSpace = SRGBColorSpace;
1962
+ material = new MeshBasicNodeMaterial({ transparent: true });
1963
+ material.fragmentNode = vec4(0, 0, 0, 0);
1964
+ mesh = new Mesh(new PlaneGeometry(2, 2), material);
1965
+ scene.add(mesh);
1966
+ const parentElement = canvas.parentElement;
1967
+ if (!parentElement) {
1968
+ console.warn("[Shaders] Canvas has no parent element for resize observation");
1969
+ return;
1970
+ }
1971
+ resizeObserver = new ResizeObserver(handleResize);
1972
+ resizeObserver.observe(parentElement);
1973
+ intersectionObserver = new IntersectionObserver(handleVisibilityChange, { threshold: 0 });
1974
+ intersectionObserver.observe(canvas);
1975
+ const rect = canvas.getBoundingClientRect();
1976
+ isVisible = rect.width > 0 && rect.height > 0 && rect.top < window.innerHeight && rect.bottom > 0 && rect.left < window.innerWidth && rect.right > 0;
1977
+ shouldAnimate = true;
1978
+ const { width, height } = canvas.getBoundingClientRect();
1979
+ const roundedWidth = Math.round(width);
1980
+ const roundedHeight = Math.round(height);
1981
+ if (roundedWidth > 0 && roundedHeight > 0) {
1982
+ currentWidth = roundedWidth;
1983
+ currentHeight = roundedHeight;
1984
+ hasInitialDimensions = true;
1985
+ renderer.setSize(roundedWidth, roundedHeight, false);
1986
+ const aspectRatio = roundedWidth / roundedHeight;
1987
+ const frustumHeight = 2;
1988
+ const frustumWidth = frustumHeight * aspectRatio;
1989
+ camera.left = -frustumWidth / 2;
1990
+ camera.right = frustumWidth / 2;
1991
+ camera.top = frustumHeight / 2;
1992
+ camera.bottom = -frustumHeight / 2;
1993
+ camera.updateProjectionMatrix();
1994
+ mesh.scale.set(frustumWidth, frustumHeight, 1);
1995
+ await renderFrame();
1996
+ } else hasInitialDimensions = false;
1997
+ if (shouldAnimate) startAnimation();
1998
+ if (!localAbortController.signal.aborted) {
1999
+ isInitialized = true;
2000
+ isRendererReady = true;
2001
+ processQueuedRegistrations();
2002
+ }
2003
+ } catch (error) {
2004
+ console.error("[Shaders] Initialization error:", error);
2005
+ } finally {
2006
+ isInitializing = false;
2007
+ if (initializationAbortController === localAbortController) initializationAbortController = null;
2008
+ }
2009
+ };
2010
+ const showLicenseWarning = () => {
2011
+ if (!isDevelopment() || hasLoggedLicenseInfo) return;
2012
+ console.warn("Shaders is running in development mode. Please purchase a license at https://shaders.com to use it in production.");
2013
+ hasLoggedLicenseInfo = true;
2014
+ };
2015
+ const cleanup = () => {
2016
+ if (initializationAbortController) initializationAbortController.abort();
2017
+ if (resizeObserver) {
2018
+ resizeObserver.disconnect();
2019
+ resizeObserver = null;
2020
+ }
2021
+ if (intersectionObserver) {
2022
+ intersectionObserver.disconnect();
2023
+ intersectionObserver = null;
2024
+ }
2025
+ if (globalEventUnregister) {
2026
+ globalEventUnregister();
2027
+ globalEventUnregister = null;
2028
+ }
2029
+ if (canvasElement) {
2030
+ canvasElement.removeEventListener("mousedown", canvasMouseDownHandler);
2031
+ canvasElement.removeEventListener("touchstart", canvasTouchStartHandler);
2032
+ }
2033
+ if (unloadHandler) {
2034
+ window.removeEventListener("beforeunload", unloadHandler);
2035
+ unloadHandler = null;
2036
+ }
2037
+ stopAnimation();
2038
+ disposePreviousTextures();
2039
+ currentTextures.forEach((texture) => {
2040
+ try {
2041
+ if (texture?.renderTarget?.dispose) texture.renderTarget.dispose();
2042
+ } catch (e) {}
2043
+ });
2044
+ currentTextures.clear();
2045
+ nodeRegistry.nodes.clear();
2046
+ nodeRegistry.rootId = null;
2047
+ nodeRegistry.idToNodeId.clear();
2048
+ parentToChildren.clear();
2049
+ pendingRegistrationQueue = [];
2050
+ isRendererReady = false;
2051
+ registrationQueue = [];
2052
+ if (registrationBatchRAF !== null) {
2053
+ cancelAnimationFrame(registrationBatchRAF);
2054
+ registrationBatchRAF = null;
2055
+ }
2056
+ metadataUpdateQueue = [];
2057
+ if (metadataUpdateBatchRAF !== null) {
2058
+ cancelAnimationFrame(metadataUpdateBatchRAF);
2059
+ metadataUpdateBatchRAF = null;
2060
+ }
2061
+ pendingResize = null;
2062
+ isResizeScheduled = false;
2063
+ if (mesh) {
2064
+ if (scene) scene.remove(mesh);
2065
+ try {
2066
+ if (mesh.geometry && typeof mesh.geometry.dispose === "function") mesh.geometry.dispose();
2067
+ } catch (e) {}
2068
+ try {
2069
+ if (mesh.material instanceof Material && typeof mesh.material.dispose === "function") mesh.material.dispose();
2070
+ } catch (e) {}
2071
+ }
2072
+ if (renderer && typeof renderer.dispose === "function") try {
2073
+ renderer.dispose();
2074
+ } catch (e) {}
2075
+ canvasElement = null;
2076
+ renderer = null;
2077
+ camera = null;
2078
+ scene = null;
2079
+ mesh = null;
2080
+ material = null;
2081
+ isInitialized = false;
2082
+ isInitializing = false;
2083
+ hasInitialDimensions = false;
2084
+ initializationAbortController = null;
2085
+ currentWidth = 0;
2086
+ currentHeight = 0;
2087
+ isVisible = false;
2088
+ shouldAnimate = true;
2089
+ pointerX = .5;
2090
+ pointerY = .5;
2091
+ pointerActive = false;
2092
+ };
2093
+ const getRendererType = () => {
2094
+ if (!renderer) return null;
2095
+ return renderer instanceof WebGPURenderer ? "webgpu" : "webgl";
2096
+ };
2097
+ return {
2098
+ initialize,
2099
+ cleanup,
2100
+ registerNode,
2101
+ removeNode,
2102
+ updateUniformValue: updateUniformValue$1,
2103
+ updateNodeMetadata,
2104
+ showLicenseWarning,
2105
+ isInitialized: () => isInitialized,
2106
+ startAnimation,
2107
+ stopAnimation,
2108
+ getPerformanceStats,
2109
+ getNodeRegistry: () => ({ nodes: new Map(nodeRegistry.nodes) }),
2110
+ getRendererType,
2111
+ __testing: {
2112
+ isUVComposable,
2113
+ canSkipRTT,
2114
+ hasUVPropagationOpportunity,
2115
+ needsTransformation,
2116
+ findUVChain,
2117
+ findSiblingUVChain,
2118
+ findChildNodes,
2119
+ composeUVContextChain,
2120
+ composeUVChain,
2121
+ composeSiblingUVChain,
2122
+ composeSiblingsWithUVContext,
2123
+ applyMaskIfNeeded,
2124
+ applyNodeTransformation,
2125
+ getNodeRegistry: () => nodeRegistry,
2126
+ getParentToChildren: () => parentToChildren
2127
+ }
2128
+ };
1498
2129
  }
1499
- function si(e) {
1500
- const n = /* @__PURE__ */ new Map(), s = /* @__PURE__ */ new Map(), t = {
1501
- processingOrder: [],
1502
- maskSources: /* @__PURE__ */ new Map(),
1503
- circularDependencies: []
1504
- };
1505
- return e.forEach((u) => {
1506
- u.elementId && n.set(u.elementId, u.id);
1507
- }), e.forEach((u) => {
1508
- if (u.mask?.source) {
1509
- const p = u.mask.source.startsWith("#") ? u.mask.source.substring(1) : u.mask.source, h = n.get(p);
1510
- h ? (s.has(u.id) || s.set(u.id, []), s.get(u.id)?.push(h), t.maskSources.set(u.id, h)) : console.warn(`Mask source "${p}" not found for node "${u.id}"`);
1511
- }
1512
- }), t.processingOrder = Gr(s, t.circularDependencies), t;
2130
+ function resolveMaskDependencies(nodes) {
2131
+ const elementIdToNodeId = /* @__PURE__ */ new Map();
2132
+ const maskDependencies = /* @__PURE__ */ new Map();
2133
+ const result = {
2134
+ processingOrder: [],
2135
+ maskSources: /* @__PURE__ */ new Map(),
2136
+ circularDependencies: []
2137
+ };
2138
+ nodes.forEach((node) => {
2139
+ if (node.elementId) elementIdToNodeId.set(node.elementId, node.id);
2140
+ });
2141
+ nodes.forEach((node) => {
2142
+ if (node.mask?.source) {
2143
+ const sourceElementId = node.mask.source.startsWith("#") ? node.mask.source.substring(1) : node.mask.source;
2144
+ const sourceNodeId = elementIdToNodeId.get(sourceElementId);
2145
+ if (sourceNodeId) {
2146
+ if (!maskDependencies.has(node.id)) maskDependencies.set(node.id, []);
2147
+ maskDependencies.get(node.id)?.push(sourceNodeId);
2148
+ result.maskSources.set(node.id, sourceNodeId);
2149
+ } else console.warn(`Mask source "${sourceElementId}" not found for node "${node.id}"`);
2150
+ }
2151
+ });
2152
+ result.processingOrder = topologicalSort(maskDependencies, result.circularDependencies);
2153
+ return result;
1513
2154
  }
1514
- function Gr(e, n) {
1515
- const s = [], t = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Set();
1516
- function p(d, k = []) {
1517
- if (t.has(d)) return;
1518
- if (u.has(d)) {
1519
- const B = [...k.slice(k.indexOf(d)), d];
1520
- n.push(B);
1521
- return;
1522
- }
1523
- u.add(d), k.push(d);
1524
- const U = e.get(d) || [];
1525
- for (const B of U) p(B, [...k]);
1526
- u.delete(d), t.add(d), s.push(d);
1527
- }
1528
- for (const d of e.keys()) t.has(d) || p(d);
1529
- const h = new Set([...e.values()].flat());
1530
- for (const d of h) !t.has(d) && !e.has(d) && s.push(d);
1531
- return s.reverse();
2155
+ function topologicalSort(dependencies, circularDependencies) {
2156
+ const result = [];
2157
+ const visited = /* @__PURE__ */ new Set();
2158
+ const tempVisited = /* @__PURE__ */ new Set();
2159
+ function visit(nodeId, path = []) {
2160
+ if (visited.has(nodeId)) return;
2161
+ if (tempVisited.has(nodeId)) {
2162
+ const cycle = [...path.slice(path.indexOf(nodeId)), nodeId];
2163
+ circularDependencies.push(cycle);
2164
+ return;
2165
+ }
2166
+ tempVisited.add(nodeId);
2167
+ path.push(nodeId);
2168
+ const deps = dependencies.get(nodeId) || [];
2169
+ for (const depId of deps) visit(depId, [...path]);
2170
+ tempVisited.delete(nodeId);
2171
+ visited.add(nodeId);
2172
+ result.push(nodeId);
2173
+ }
2174
+ for (const nodeId of dependencies.keys()) if (!visited.has(nodeId)) visit(nodeId);
2175
+ const allSourceNodeIds = new Set([...dependencies.values()].flat());
2176
+ for (const sourceId of allSourceNodeIds) if (!visited.has(sourceId) && !dependencies.has(sourceId)) result.push(sourceId);
2177
+ return result.reverse();
1532
2178
  }
1533
- var { vec2: Nr, fract: Vr, sin: qr, dot: Pr } = le;
1534
- const Xr = (e) => Vr(qr(Pr(e, Nr(12.12345, 78.12345))).mul(40000.12345)), li = (e = 0.03) => (n) => Xr(n).mul(e).mul(0.10012345);
1535
- var { vec2: Yr } = le;
1536
- const ci = (e = Yr(0), n = 0.02, s = 1, t = 1) => {
1537
- const { vec2: u, sin: p, cos: h, time: d } = le, k = t * 1.618033988749895, U = t * 2.718281828459045, B = (Math.sin(t) + 2) * 5, O = (Math.cos(t) + 2) * 5, Q = u(p(e.x.mul(s).mul(B).add(d.mul(0.1)).add(k)), h(e.y.mul(s).mul(B).add(d.mul(0.1)).add(U))), V = u(p(e.y.mul(s).mul(O).add(d.mul(0.05)).add(U)), h(e.x.mul(s).mul(O).add(d.mul(0.05)).add(k))), q = Q.add(V).mul(n);
1538
- return e.add(q);
1539
- }, fi = (e, n, s = 0.6, t = 0.3, u = 1) => {
1540
- const { max: p, smoothstep: h, vec4: d } = le, k = p(p(e.r, e.g), e.b), U = h(s, s + t, k).mul(u).mul(1);
1541
- return d(e.rgb.add(n.rgb.mul(U)), e.a);
1542
- }, ui = (e = {}) => {
1543
- const { inset: n = 0.4, softness: s = 0.5, offsetX: t = 0, offsetY: u = 0 } = e, { float: p, smoothstep: h, uv: d } = le, k = d(), U = k.x.sub(0.5).sub(p(t)).mul(2), B = k.y.sub(0.5).add(p(u)).mul(2), O = U.mul(U).add(B.mul(B)).sqrt();
1544
- return p(1).sub(h(p(1).sub(p(n)), p(1).sub(p(n)).add(p(s)), O.mul(p(1).add(p(s)))));
2179
+ var { vec2: vec2$2, fract, sin: sin$1, dot: dot$1 } = TSL;
2180
+ const noise = (st) => fract(sin$1(dot$1(st, vec2$2(12.12345, 78.12345))).mul(40000.12345));
2181
+ const grain = (intensity = .03) => (st) => noise(st).mul(intensity).mul(.10012345);
2182
+ var { vec2: vec2$1 } = TSL;
2183
+ const distort = (uv = vec2$1(0), intensity = .02, frequency = 1, seed = 1) => {
2184
+ const { vec2: vec2$4, sin: sin$3, cos: cos$2, time } = TSL;
2185
+ const phaseX = seed * 1.618033988749895;
2186
+ const phaseY = seed * 2.718281828459045;
2187
+ const freqMod1 = (Math.sin(seed) + 2) * 5;
2188
+ const freqMod2 = (Math.cos(seed) + 2) * 5;
2189
+ const flow1 = vec2$4(sin$3(uv.x.mul(frequency).mul(freqMod1).add(time.mul(.1)).add(phaseX)), cos$2(uv.y.mul(frequency).mul(freqMod1).add(time.mul(.1)).add(phaseY)));
2190
+ const flow2 = vec2$4(sin$3(uv.y.mul(frequency).mul(freqMod2).add(time.mul(.05)).add(phaseY)), cos$2(uv.x.mul(frequency).mul(freqMod2).add(time.mul(.05)).add(phaseX)));
2191
+ const offset = flow1.add(flow2).mul(intensity);
2192
+ return uv.add(offset);
1545
2193
  };
1546
- var Ir = () => {
1547
- const e = {};
1548
- return Object.entries({
1549
- AngularBlur: Zn,
1550
- Ascii: Kn,
1551
- Beam: et,
1552
- Blob: nt,
1553
- Blur: tt,
1554
- Bulge: rt,
1555
- ChannelBlur: ot,
1556
- Checkerboard: it,
1557
- ChromaFlow: at,
1558
- ChromaticAberration: st,
1559
- Circle: lt,
1560
- CRTScreen: ct,
1561
- CursorTrail: ft,
1562
- DiffuseBlur: ut,
1563
- Dither: mt,
1564
- DotGrid: dt,
1565
- Duotone: ht,
1566
- FilmGrain: pt,
1567
- FloatingParticles: gt,
1568
- GlassTiles: bt,
1569
- Glow: vt,
1570
- Godrays: Ct,
1571
- Grayscale: Rt,
1572
- Grid: kt,
1573
- GridDistortion: Tt,
1574
- Group: yt,
1575
- Halftone: wt,
1576
- HueShift: Ut,
1577
- ImageTexture: St,
1578
- Invert: Mt,
1579
- LinearBlur: xt,
1580
- LinearGradient: At,
1581
- Liquify: Dt,
1582
- Pixelate: zt,
1583
- PolarCoordinates: Et,
1584
- Posterize: Ft,
1585
- ProgressiveBlur: $t,
1586
- RadialGradient: Ot,
1587
- RectangularCoordinates: Bt,
1588
- Ripples: _t,
1589
- Saturation: Lt,
1590
- SimplexNoise: Gt,
1591
- SineWave: Nt,
1592
- SolidColor: Vt,
1593
- Spherize: qt,
1594
- Spiral: Pt,
1595
- Strands: Xt,
1596
- Stretch: Yt,
1597
- Swirl: It,
1598
- TiltShift: Ht,
1599
- Tritone: Wt,
1600
- Twirl: jt,
1601
- Vibrance: Qt,
1602
- WaveDistortion: Jt,
1603
- ZoomBlur: Zt
1604
- }).forEach(([s, t]) => {
1605
- const u = {};
1606
- t.props && Object.entries(t.props).forEach(([p, h]) => {
1607
- h.ui && (u[p] = {
1608
- ui: h.ui,
1609
- default: h.default,
1610
- description: h.description
1611
- });
1612
- }), e[t.name] = {
1613
- name: t.name,
1614
- fileName: s,
1615
- category: t.category || "Uncategorized",
1616
- definition: t,
1617
- propsMetadata: u
1618
- };
1619
- }), e;
2194
+ const glow = (color, glowColor, threshold = .6, softness = .3, intensity = 1) => {
2195
+ const { max: max$1, smoothstep, vec4: vec4$1 } = TSL;
2196
+ const brightness = max$1(max$1(color.r, color.g), color.b);
2197
+ const glowAmount = smoothstep(threshold, threshold + softness, brightness).mul(intensity).mul(1);
2198
+ return vec4$1(color.rgb.add(glowColor.rgb.mul(glowAmount)), color.a);
1620
2199
  };
1621
- const Le = Ir();
1622
- function mi() {
1623
- return Object.values(Le);
2200
+ const edgeMask = (options = {}) => {
2201
+ const { inset = .4, softness = .5, offsetX = 0, offsetY = 0 } = options;
2202
+ const { float: float$2, smoothstep, uv } = TSL;
2203
+ const rawUV = uv();
2204
+ const ovalX = rawUV.x.sub(.5).sub(float$2(offsetX)).mul(2);
2205
+ const ovalY = rawUV.y.sub(.5).add(float$2(offsetY)).mul(2);
2206
+ const ovalDistance = ovalX.mul(ovalX).add(ovalY.mul(ovalY)).sqrt();
2207
+ return float$2(1).sub(smoothstep(float$2(1).sub(float$2(inset)), float$2(1).sub(float$2(inset)).add(float$2(softness)), ovalDistance.mul(float$2(1).add(float$2(softness)))));
2208
+ };
2209
+ var createShaderRegistry = () => {
2210
+ const registry = {};
2211
+ const shaderDefinitions = {
2212
+ AngularBlur: componentDefinition,
2213
+ Ascii: componentDefinition$1,
2214
+ Beam: componentDefinition$2,
2215
+ Blob: componentDefinition$3,
2216
+ Blur: componentDefinition$4,
2217
+ Bulge: componentDefinition$5,
2218
+ ChannelBlur: componentDefinition$6,
2219
+ Checkerboard: componentDefinition$7,
2220
+ ChromaFlow: componentDefinition$8,
2221
+ ChromaticAberration: componentDefinition$9,
2222
+ Circle: componentDefinition$10,
2223
+ CRTScreen: componentDefinition$11,
2224
+ CursorTrail: componentDefinition$12,
2225
+ DiffuseBlur: componentDefinition$13,
2226
+ Dither: componentDefinition$14,
2227
+ DotGrid: componentDefinition$15,
2228
+ Duotone: componentDefinition$16,
2229
+ FilmGrain: componentDefinition$17,
2230
+ FloatingParticles: componentDefinition$18,
2231
+ GlassTiles: componentDefinition$19,
2232
+ Glow: componentDefinition$20,
2233
+ Godrays: componentDefinition$21,
2234
+ Grayscale: componentDefinition$22,
2235
+ Grid: componentDefinition$23,
2236
+ GridDistortion: componentDefinition$24,
2237
+ Group: componentDefinition$25,
2238
+ Halftone: componentDefinition$26,
2239
+ HueShift: componentDefinition$27,
2240
+ ImageTexture: componentDefinition$28,
2241
+ Invert: componentDefinition$29,
2242
+ LinearBlur: componentDefinition$30,
2243
+ LinearGradient: componentDefinition$31,
2244
+ Liquify: componentDefinition$32,
2245
+ Pixelate: componentDefinition$33,
2246
+ PolarCoordinates: componentDefinition$34,
2247
+ Posterize: componentDefinition$35,
2248
+ ProgressiveBlur: componentDefinition$36,
2249
+ RadialGradient: componentDefinition$37,
2250
+ RectangularCoordinates: componentDefinition$38,
2251
+ Ripples: componentDefinition$39,
2252
+ Saturation: componentDefinition$40,
2253
+ SimplexNoise: componentDefinition$41,
2254
+ SineWave: componentDefinition$42,
2255
+ SolidColor: componentDefinition$43,
2256
+ Spherize: componentDefinition$44,
2257
+ Spiral: componentDefinition$45,
2258
+ Strands: componentDefinition$46,
2259
+ Stretch: componentDefinition$47,
2260
+ Swirl: componentDefinition$48,
2261
+ TiltShift: componentDefinition$49,
2262
+ Tritone: componentDefinition$50,
2263
+ Twirl: componentDefinition$51,
2264
+ Vibrance: componentDefinition$52,
2265
+ WaveDistortion: componentDefinition$53,
2266
+ ZoomBlur: componentDefinition$54
2267
+ };
2268
+ Object.entries(shaderDefinitions).forEach(([fileName, def]) => {
2269
+ const propsMetadata = {};
2270
+ if (def.props) Object.entries(def.props).forEach(([propName, propConfig]) => {
2271
+ if (propConfig.ui) propsMetadata[propName] = {
2272
+ ui: propConfig.ui,
2273
+ default: propConfig.default,
2274
+ description: propConfig.description
2275
+ };
2276
+ });
2277
+ registry[def.name] = {
2278
+ name: def.name,
2279
+ fileName,
2280
+ category: def.category || "Uncategorized",
2281
+ definition: def,
2282
+ propsMetadata
2283
+ };
2284
+ });
2285
+ return registry;
2286
+ };
2287
+ const shaderRegistry = createShaderRegistry();
2288
+ function getAllShaders() {
2289
+ return Object.values(shaderRegistry);
1624
2290
  }
1625
- function di(e) {
1626
- return Le[e];
2291
+ function getShaderByName(name) {
2292
+ return shaderRegistry[name];
1627
2293
  }
1628
- function hi(e) {
1629
- return Object.values(Le).filter((n) => n.category === e);
2294
+ function getShadersByCategory(category) {
2295
+ return Object.values(shaderRegistry).filter((shader) => shader.category === category);
1630
2296
  }
1631
- function pi() {
1632
- const e = new Set(Object.values(Le).map((n) => n.category));
1633
- return Array.from(e).sort();
2297
+ function getShaderCategories() {
2298
+ const categories = new Set(Object.values(shaderRegistry).map((shader) => shader.category));
2299
+ return Array.from(categories).sort();
1634
2300
  }
1635
- export {
1636
- Jr as createAnimatedTime,
1637
- ii as createUniformsMap,
1638
- ci as distort,
1639
- ui as edgeMask,
1640
- mi as getAllShaders,
1641
- di as getShaderByName,
1642
- pi as getShaderCategories,
1643
- hi as getShadersByCategory,
1644
- fi as glow,
1645
- li as grain,
1646
- si as resolveMaskDependencies,
1647
- Le as shaderRegistry,
1648
- ai as shaderRenderer,
1649
- Br as updateUniformValue
1650
- };
2301
+ export { createAnimatedTime, createUniformsMap, distort, edgeMask, getAllShaders, getShaderByName, getShaderCategories, getShadersByCategory, glow, grain, resolveMaskDependencies, shaderRegistry, shaderRenderer, updateUniformValue };