minerva-design 1.5.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (457) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/custom-elements.json +122 -5
  3. package/dist/angular/fesm2022/minerva-angular.mjs +55 -0
  4. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  5. package/dist/angular/types/minerva-angular.d.ts +23 -2
  6. package/dist/charts/canvas.d.cts +2 -1
  7. package/dist/charts/canvas.d.ts +2 -1
  8. package/dist/charts/core.d.cts +1 -1
  9. package/dist/charts/core.d.ts +1 -1
  10. package/dist/charts/engine/canvas.cjs +1 -1
  11. package/dist/charts/engine/canvas.cjs.map +1 -1
  12. package/dist/charts/engine/canvas.js +2 -1
  13. package/dist/charts/engine/canvas.js.map +1 -1
  14. package/dist/charts/engine/chart.cjs +1 -1
  15. package/dist/charts/engine/chart.cjs.map +1 -1
  16. package/dist/charts/engine/chart.js +144 -143
  17. package/dist/charts/engine/chart.js.map +1 -1
  18. package/dist/charts/engine/controller.cjs +2 -2
  19. package/dist/charts/engine/controller.cjs.map +1 -1
  20. package/dist/charts/engine/controller.d.cts +3 -1
  21. package/dist/charts/engine/controller.d.ts +3 -1
  22. package/dist/charts/engine/controller.js +130 -132
  23. package/dist/charts/engine/controller.js.map +1 -1
  24. package/dist/charts/engine/defaults.cjs.map +1 -1
  25. package/dist/charts/engine/defaults.d.cts +4 -4
  26. package/dist/charts/engine/defaults.d.ts +4 -4
  27. package/dist/charts/engine/defaults.js.map +1 -1
  28. package/dist/charts/engine/graph/chart.cjs +1 -1
  29. package/dist/charts/engine/graph/chart.cjs.map +1 -1
  30. package/dist/charts/engine/graph/chart.js +740 -597
  31. package/dist/charts/engine/graph/chart.js.map +1 -1
  32. package/dist/charts/engine/graph/dag.cjs +1 -1
  33. package/dist/charts/engine/graph/dag.cjs.map +1 -1
  34. package/dist/charts/engine/graph/dag.js +191 -166
  35. package/dist/charts/engine/graph/dag.js.map +1 -1
  36. package/dist/charts/engine/graph/force.cjs +1 -1
  37. package/dist/charts/engine/graph/force.cjs.map +1 -1
  38. package/dist/charts/engine/graph/force.d.cts +9 -0
  39. package/dist/charts/engine/graph/force.d.ts +9 -0
  40. package/dist/charts/engine/graph/force.js +279 -181
  41. package/dist/charts/engine/graph/force.js.map +1 -1
  42. package/dist/charts/engine/graph/geometry.cjs +1 -1
  43. package/dist/charts/engine/graph/geometry.cjs.map +1 -1
  44. package/dist/charts/engine/graph/geometry.d.cts +14 -1
  45. package/dist/charts/engine/graph/geometry.d.ts +14 -1
  46. package/dist/charts/engine/graph/geometry.js +77 -24
  47. package/dist/charts/engine/graph/geometry.js.map +1 -1
  48. package/dist/charts/engine/graph/model.cjs +1 -1
  49. package/dist/charts/engine/graph/model.cjs.map +1 -1
  50. package/dist/charts/engine/graph/model.d.cts +9 -0
  51. package/dist/charts/engine/graph/model.d.ts +9 -0
  52. package/dist/charts/engine/graph/model.js +63 -43
  53. package/dist/charts/engine/graph/model.js.map +1 -1
  54. package/dist/charts/engine/graph/types.d.cts +14 -0
  55. package/dist/charts/engine/graph/types.d.ts +14 -0
  56. package/dist/charts/engine/graph/worker.cjs +12 -6
  57. package/dist/charts/engine/graph/worker.cjs.map +1 -1
  58. package/dist/charts/engine/graph/worker.js +12 -6
  59. package/dist/charts/engine/graph/worker.js.map +1 -1
  60. package/dist/charts/engine/labels.cjs.map +1 -1
  61. package/dist/charts/engine/labels.d.cts +17 -0
  62. package/dist/charts/engine/labels.d.ts +17 -0
  63. package/dist/charts/engine/labels.js.map +1 -1
  64. package/dist/charts/engine/model.cjs +1 -1
  65. package/dist/charts/engine/model.cjs.map +1 -1
  66. package/dist/charts/engine/model.d.cts +33 -0
  67. package/dist/charts/engine/model.d.ts +33 -0
  68. package/dist/charts/engine/model.js +149 -126
  69. package/dist/charts/engine/model.js.map +1 -1
  70. package/dist/charts/engine/orderbook/field.cjs +37 -0
  71. package/dist/charts/engine/orderbook/field.cjs.map +1 -0
  72. package/dist/charts/engine/orderbook/field.d.cts +92 -0
  73. package/dist/charts/engine/orderbook/field.d.ts +92 -0
  74. package/dist/charts/engine/orderbook/field.js +297 -0
  75. package/dist/charts/engine/orderbook/field.js.map +1 -0
  76. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  77. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  78. package/dist/charts/engine/orderbook/heatmap.js +413 -441
  79. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  80. package/dist/charts/engine/orderbook/host.cjs +1 -1
  81. package/dist/charts/engine/orderbook/host.cjs.map +1 -1
  82. package/dist/charts/engine/orderbook/host.d.cts +8 -1
  83. package/dist/charts/engine/orderbook/host.d.ts +8 -1
  84. package/dist/charts/engine/orderbook/host.js +27 -5
  85. package/dist/charts/engine/orderbook/host.js.map +1 -1
  86. package/dist/charts/engine/orderbook/ladder.cjs +1 -1
  87. package/dist/charts/engine/orderbook/ladder.cjs.map +1 -1
  88. package/dist/charts/engine/orderbook/ladder.js +1 -1
  89. package/dist/charts/engine/orderbook/ladder.js.map +1 -1
  90. package/dist/charts/engine/orderbook/layout.cjs +1 -1
  91. package/dist/charts/engine/orderbook/layout.cjs.map +1 -1
  92. package/dist/charts/engine/orderbook/layout.d.cts +5 -0
  93. package/dist/charts/engine/orderbook/layout.d.ts +5 -0
  94. package/dist/charts/engine/orderbook/layout.js +8 -2
  95. package/dist/charts/engine/orderbook/layout.js.map +1 -1
  96. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  97. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  98. package/dist/charts/engine/orderbook/tape.js +3 -3
  99. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  100. package/dist/charts/engine/orderbook/types.d.cts +12 -4
  101. package/dist/charts/engine/orderbook/types.d.ts +12 -4
  102. package/dist/charts/engine/overlay.cjs +1 -1
  103. package/dist/charts/engine/overlay.cjs.map +1 -1
  104. package/dist/charts/engine/overlay.d.cts +17 -0
  105. package/dist/charts/engine/overlay.d.ts +17 -0
  106. package/dist/charts/engine/overlay.js +29 -13
  107. package/dist/charts/engine/overlay.js.map +1 -1
  108. package/dist/charts/engine/presets.cjs +1 -1
  109. package/dist/charts/engine/presets.cjs.map +1 -1
  110. package/dist/charts/engine/presets.d.cts +12 -2
  111. package/dist/charts/engine/presets.d.ts +12 -2
  112. package/dist/charts/engine/presets.js +8 -2
  113. package/dist/charts/engine/presets.js.map +1 -1
  114. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  115. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  116. package/dist/charts/engine/renderers/canvas2d.js +13 -9
  117. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  118. package/dist/charts/engine/renderers/follow.cjs +2 -0
  119. package/dist/charts/engine/renderers/follow.cjs.map +1 -0
  120. package/dist/charts/engine/renderers/follow.d.cts +8 -0
  121. package/dist/charts/engine/renderers/follow.d.ts +8 -0
  122. package/dist/charts/engine/renderers/follow.js +10 -0
  123. package/dist/charts/engine/renderers/follow.js.map +1 -0
  124. package/dist/charts/engine/renderers/gl-budget.cjs +2 -0
  125. package/dist/charts/engine/renderers/gl-budget.cjs.map +1 -0
  126. package/dist/charts/engine/renderers/gl-budget.d.cts +32 -0
  127. package/dist/charts/engine/renderers/gl-budget.d.ts +32 -0
  128. package/dist/charts/engine/renderers/gl-budget.js +95 -0
  129. package/dist/charts/engine/renderers/gl-budget.js.map +1 -0
  130. package/dist/charts/engine/renderers/gl.cjs +1 -1
  131. package/dist/charts/engine/renderers/gl.cjs.map +1 -1
  132. package/dist/charts/engine/renderers/gl.js +1 -1
  133. package/dist/charts/engine/renderers/gl.js.map +1 -1
  134. package/dist/charts/engine/renderers/shaders.cjs +9 -6
  135. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  136. package/dist/charts/engine/renderers/shaders.d.cts +1 -1
  137. package/dist/charts/engine/renderers/shaders.d.ts +1 -1
  138. package/dist/charts/engine/renderers/shaders.js +9 -6
  139. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  140. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  141. package/dist/charts/engine/renderers/types.d.cts +2 -0
  142. package/dist/charts/engine/renderers/types.d.ts +2 -0
  143. package/dist/charts/engine/renderers/types.js.map +1 -1
  144. package/dist/charts/engine/renderers/webgl.cjs +1 -1
  145. package/dist/charts/engine/renderers/webgl.cjs.map +1 -1
  146. package/dist/charts/engine/renderers/webgl.js +85 -64
  147. package/dist/charts/engine/renderers/webgl.js.map +1 -1
  148. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  149. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  150. package/dist/charts/engine/renderers/webgl2.js +72 -58
  151. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  152. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  153. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  154. package/dist/charts/engine/renderers/webgpu.js +1 -1
  155. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  156. package/dist/charts/engine/scene.cjs +1 -1
  157. package/dist/charts/engine/scene.cjs.map +1 -1
  158. package/dist/charts/engine/scene.d.cts +51 -4
  159. package/dist/charts/engine/scene.d.ts +51 -4
  160. package/dist/charts/engine/scene.js +188 -122
  161. package/dist/charts/engine/scene.js.map +1 -1
  162. package/dist/charts/engine/shapes/chord.cjs +1 -1
  163. package/dist/charts/engine/shapes/chord.cjs.map +1 -1
  164. package/dist/charts/engine/shapes/chord.js +108 -103
  165. package/dist/charts/engine/shapes/chord.js.map +1 -1
  166. package/dist/charts/engine/shapes/types.d.cts +5 -3
  167. package/dist/charts/engine/shapes/types.d.ts +5 -3
  168. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  169. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  170. package/dist/charts/engine/three-d/canvas2d.d.cts +36 -1
  171. package/dist/charts/engine/three-d/canvas2d.d.ts +36 -1
  172. package/dist/charts/engine/three-d/canvas2d.js +155 -80
  173. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  174. package/dist/charts/engine/three-d/chart.cjs +1 -1
  175. package/dist/charts/engine/three-d/chart.cjs.map +1 -1
  176. package/dist/charts/engine/three-d/chart.js +219 -215
  177. package/dist/charts/engine/three-d/chart.js.map +1 -1
  178. package/dist/charts/engine/three-d/oit.cjs +109 -0
  179. package/dist/charts/engine/three-d/oit.cjs.map +1 -0
  180. package/dist/charts/engine/three-d/oit.d.cts +34 -0
  181. package/dist/charts/engine/three-d/oit.d.ts +34 -0
  182. package/dist/charts/engine/three-d/oit.js +111 -0
  183. package/dist/charts/engine/three-d/oit.js.map +1 -0
  184. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  185. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  186. package/dist/charts/engine/three-d/render-types.d.cts +16 -3
  187. package/dist/charts/engine/three-d/render-types.d.ts +16 -3
  188. package/dist/charts/engine/three-d/render-types.js +6 -9
  189. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  190. package/dist/charts/engine/three-d/shaders.cjs +52 -26
  191. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  192. package/dist/charts/engine/three-d/shaders.d.cts +11 -3
  193. package/dist/charts/engine/three-d/shaders.d.ts +11 -3
  194. package/dist/charts/engine/three-d/shaders.js +84 -40
  195. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  196. package/dist/charts/engine/three-d/sort.cjs +1 -1
  197. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  198. package/dist/charts/engine/three-d/sort.d.cts +6 -4
  199. package/dist/charts/engine/three-d/sort.d.ts +6 -4
  200. package/dist/charts/engine/three-d/sort.js +51 -39
  201. package/dist/charts/engine/three-d/sort.js.map +1 -1
  202. package/dist/charts/engine/three-d/types.d.cts +9 -0
  203. package/dist/charts/engine/three-d/types.d.ts +9 -0
  204. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  205. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  206. package/dist/charts/engine/three-d/webgl.d.cts +9 -0
  207. package/dist/charts/engine/three-d/webgl.d.ts +9 -0
  208. package/dist/charts/engine/three-d/webgl.js +199 -76
  209. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  210. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  211. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  212. package/dist/charts/engine/three-d/webgpu.js +225 -99
  213. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  214. package/dist/charts/engine/trading/chart.cjs +1 -1
  215. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  216. package/dist/charts/engine/trading/chart.d.cts +0 -1
  217. package/dist/charts/engine/trading/chart.d.ts +0 -1
  218. package/dist/charts/engine/trading/chart.js +1048 -883
  219. package/dist/charts/engine/trading/chart.js.map +1 -1
  220. package/dist/charts/engine/trading/drawings.cjs +2 -2
  221. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  222. package/dist/charts/engine/trading/drawings.d.cts +6 -0
  223. package/dist/charts/engine/trading/drawings.d.ts +6 -0
  224. package/dist/charts/engine/trading/drawings.js +100 -88
  225. package/dist/charts/engine/trading/drawings.js.map +1 -1
  226. package/dist/charts/engine/trading/format.cjs +1 -1
  227. package/dist/charts/engine/trading/format.cjs.map +1 -1
  228. package/dist/charts/engine/trading/format.d.cts +6 -0
  229. package/dist/charts/engine/trading/format.d.ts +6 -0
  230. package/dist/charts/engine/trading/format.js +42 -30
  231. package/dist/charts/engine/trading/format.js.map +1 -1
  232. package/dist/charts/engine/trading/geometry.cjs +1 -1
  233. package/dist/charts/engine/trading/geometry.cjs.map +1 -1
  234. package/dist/charts/engine/trading/geometry.d.cts +16 -0
  235. package/dist/charts/engine/trading/geometry.d.ts +16 -0
  236. package/dist/charts/engine/trading/geometry.js +19 -4
  237. package/dist/charts/engine/trading/geometry.js.map +1 -1
  238. package/dist/charts/engine/trading/labels.cjs +1 -1
  239. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  240. package/dist/charts/engine/trading/labels.js +24 -4
  241. package/dist/charts/engine/trading/labels.js.map +1 -1
  242. package/dist/charts/engine/trading/studies.cjs +1 -1
  243. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  244. package/dist/charts/engine/trading/studies.d.cts +8 -0
  245. package/dist/charts/engine/trading/studies.d.ts +8 -0
  246. package/dist/charts/engine/trading/studies.js +4 -1
  247. package/dist/charts/engine/trading/studies.js.map +1 -1
  248. package/dist/charts/engine/trading/types.d.cts +34 -11
  249. package/dist/charts/engine/trading/types.d.ts +34 -11
  250. package/dist/charts/engine/types.d.cts +25 -4
  251. package/dist/charts/engine/types.d.ts +25 -4
  252. package/dist/charts/react/charts.cjs +1 -1
  253. package/dist/charts/react/charts.cjs.map +1 -1
  254. package/dist/charts/react/charts.js +20 -15
  255. package/dist/charts/react/charts.js.map +1 -1
  256. package/dist/charts/react/graph.cjs +1 -1
  257. package/dist/charts/react/graph.cjs.map +1 -1
  258. package/dist/charts/react/graph.d.cts +6 -0
  259. package/dist/charts/react/graph.d.ts +6 -0
  260. package/dist/charts/react/graph.js +28 -27
  261. package/dist/charts/react/graph.js.map +1 -1
  262. package/dist/charts/react/orderbook.cjs +1 -1
  263. package/dist/charts/react/orderbook.cjs.map +1 -1
  264. package/dist/charts/react/orderbook.d.cts +3 -1
  265. package/dist/charts/react/orderbook.d.ts +3 -1
  266. package/dist/charts/react/orderbook.js +1 -0
  267. package/dist/charts/react/orderbook.js.map +1 -1
  268. package/dist/charts/react/shapes.cjs.map +1 -1
  269. package/dist/charts/react/shapes.d.cts +4 -3
  270. package/dist/charts/react/shapes.d.ts +4 -3
  271. package/dist/charts/react/shapes.js.map +1 -1
  272. package/dist/charts/react/three-d.cjs +1 -1
  273. package/dist/charts/react/three-d.cjs.map +1 -1
  274. package/dist/charts/react/three-d.d.cts +7 -0
  275. package/dist/charts/react/three-d.d.ts +7 -0
  276. package/dist/charts/react/three-d.js +14 -13
  277. package/dist/charts/react/three-d.js.map +1 -1
  278. package/dist/charts/react/trading.cjs.map +1 -1
  279. package/dist/charts/react/trading.d.cts +3 -3
  280. package/dist/charts/react/trading.d.ts +3 -3
  281. package/dist/charts/react/trading.js.map +1 -1
  282. package/dist/core/contracts.cjs +1 -1
  283. package/dist/core/contracts.cjs.map +1 -1
  284. package/dist/core/contracts.js +1 -1
  285. package/dist/core/contracts.js.map +1 -1
  286. package/dist/native/charts/src/canvas.cjs +1 -1
  287. package/dist/native/charts/src/canvas.js +4 -3
  288. package/dist/native/charts/src/engine/controller.cjs +2 -2
  289. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  290. package/dist/native/charts/src/engine/controller.js +102 -104
  291. package/dist/native/charts/src/engine/controller.js.map +1 -1
  292. package/dist/native/charts/src/engine/labels.cjs +1 -1
  293. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  294. package/dist/native/charts/src/engine/labels.js +14 -1
  295. package/dist/native/charts/src/engine/labels.js.map +1 -1
  296. package/dist/native/charts/src/engine/model.cjs +1 -1
  297. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  298. package/dist/native/charts/src/engine/model.js +180 -157
  299. package/dist/native/charts/src/engine/model.js.map +1 -1
  300. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  301. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  302. package/dist/native/charts/src/engine/presets.cjs +1 -1
  303. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  304. package/dist/native/charts/src/engine/presets.js +8 -2
  305. package/dist/native/charts/src/engine/presets.js.map +1 -1
  306. package/dist/native/charts/src/engine/scene.cjs +1 -1
  307. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  308. package/dist/native/charts/src/engine/scene.js +188 -122
  309. package/dist/native/charts/src/engine/scene.js.map +1 -1
  310. package/dist/native/charts/src/engine/shapes/chord.cjs +1 -1
  311. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -1
  312. package/dist/native/charts/src/engine/shapes/chord.js +108 -103
  313. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -1
  314. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  315. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  316. package/dist/native/charts/src/engine/shapes/layout.js +88 -73
  317. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  318. package/dist/native/components/Chart/ChartBase.cjs +1 -1
  319. package/dist/native/components/Chart/ChartBase.cjs.map +1 -1
  320. package/dist/native/components/Chart/ChartBase.js +127 -115
  321. package/dist/native/components/Chart/ChartBase.js.map +1 -1
  322. package/dist/native/components/Chart/charts.cjs +1 -1
  323. package/dist/native/components/Chart/charts.cjs.map +1 -1
  324. package/dist/native/components/Chart/charts.js +8 -5
  325. package/dist/native/components/Chart/charts.js.map +1 -1
  326. package/dist/native/components/Chart/scene.cjs +1 -1
  327. package/dist/native/components/Chart/scene.cjs.map +1 -1
  328. package/dist/native/components/Chart/scene.d.cts +6 -1
  329. package/dist/native/components/Chart/scene.d.ts +6 -1
  330. package/dist/native/components/Chart/scene.js +99 -50
  331. package/dist/native/components/Chart/scene.js.map +1 -1
  332. package/dist/native/components/Chart/types.d.cts +7 -1
  333. package/dist/native/components/Chart/types.d.ts +7 -1
  334. package/dist/native/components/Charts/charts.cjs +1 -1
  335. package/dist/native/components/Charts/charts.cjs.map +1 -1
  336. package/dist/native/components/Charts/charts.js +23 -18
  337. package/dist/native/components/Charts/charts.js.map +1 -1
  338. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  339. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  340. package/dist/native/components/ShapeChart/ShapeChartBase.d.cts +1 -1
  341. package/dist/native/components/ShapeChart/ShapeChartBase.d.ts +1 -1
  342. package/dist/native/components/ShapeChart/ShapeChartBase.js +97 -107
  343. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  344. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  345. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  346. package/dist/native/components/ShapeChart/geometry.js +120 -36
  347. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  348. package/dist/native/components/ShapeChart/types.d.cts +6 -4
  349. package/dist/native/components/ShapeChart/types.d.ts +6 -4
  350. package/dist/native/source/components/Chart/ChartBase.tsx +19 -6
  351. package/dist/native/source/components/Chart/charts.tsx +10 -3
  352. package/dist/native/source/components/Chart/scene.tsx +85 -0
  353. package/dist/native/source/components/Chart/types.ts +7 -0
  354. package/dist/native/source/components/Charts/charts.tsx +7 -0
  355. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +10 -36
  356. package/dist/native/source/components/ShapeChart/geometry.ts +188 -18
  357. package/dist/native/source/components/ShapeChart/types.ts +6 -4
  358. package/dist/taro/chart-a11y.d.ts +7 -0
  359. package/dist/taro/charts.d.ts +4 -1
  360. package/dist/taro/index.js +3212 -3049
  361. package/dist/taro/shape-charts.d.ts +6 -4
  362. package/dist/uni/AreaChart.vue +2 -1
  363. package/dist/uni/AreaChart.vue.d.ts +1 -1
  364. package/dist/uni/BarChart.vue +2 -1
  365. package/dist/uni/BarChart.vue.d.ts +1 -1
  366. package/dist/uni/BoxPlotChart.vue +2 -1
  367. package/dist/uni/BubbleChart.vue +2 -1
  368. package/dist/uni/CandlestickChart.vue +2 -1
  369. package/dist/uni/Chart.vue +2 -1
  370. package/dist/uni/Divider.vue.d.ts +1 -1
  371. package/dist/uni/DonutChart.vue.d.ts +1 -1
  372. package/dist/uni/GanttChart.vue +2 -1
  373. package/dist/uni/GanttChart.vue.d.ts +11 -0
  374. package/dist/uni/GaugeChart.vue.d.ts +1 -1
  375. package/dist/uni/HeatmapChart.vue +2 -1
  376. package/dist/uni/HistogramChart.vue +2 -1
  377. package/dist/uni/HorizontalBarChart.vue +2 -1
  378. package/dist/uni/HorizontalBarChart.vue.d.ts +1 -1
  379. package/dist/uni/LineChart.vue +2 -1
  380. package/dist/uni/MixedChart.vue +2 -1
  381. package/dist/uni/PieChart.vue.d.ts +1 -1
  382. package/dist/uni/QuadrantChart.vue +2 -1
  383. package/dist/uni/RangeAreaChart.vue +2 -1
  384. package/dist/uni/ScatterChart.vue +2 -1
  385. package/dist/uni/Sparkline.vue +2 -1
  386. package/dist/uni/WaterfallChart.vue +2 -1
  387. package/dist/uni/chart-a11y.d.ts +7 -0
  388. package/dist/uni/chart-a11y.js +29 -0
  389. package/dist/uni/chart-canvas.d.ts +9 -0
  390. package/dist/uni/chart-canvas.js +11 -1
  391. package/dist/uni/chart-types.d.ts +8 -1
  392. package/dist/uni/chart-types.js +5 -1
  393. package/dist/uni/charts-canvas.js +2 -1
  394. package/dist/uni/named-chart-options.d.ts +2 -0
  395. package/dist/uni/named-chart-options.js +3 -0
  396. package/dist/uni/shape-chart-canvas.d.ts +0 -2
  397. package/dist/uni/shape-chart-canvas.js +4 -36
  398. package/dist/uni/shape-chart-types.d.ts +2 -2
  399. package/dist/uni/shape-chart-types.js +2 -2
  400. package/dist/vue/components/Chart/Bar3DChart.vue.d.ts +2 -0
  401. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +2 -0
  402. package/dist/vue/components/Chart/GanttChart.vue.d.ts +15 -0
  403. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  404. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +8 -0
  405. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  406. package/dist/vue/components/Chart/GraphChart.vue.d.ts +2 -0
  407. package/dist/vue/components/Chart/Line3DChart.vue.d.ts +2 -0
  408. package/dist/vue/components/Chart/Scatter3DChart.vue.d.ts +2 -0
  409. package/dist/vue/components/Chart/Surface3DChart.vue.d.ts +2 -0
  410. package/dist/vue/components/Chart/TradingChart.vue.d.ts +9 -0
  411. package/dist/vue/components/Chart/TreeChart.vue.d.ts +2 -0
  412. package/dist/vue/components/Chart/graph.d.ts +3 -0
  413. package/dist/vue/components/Chart/graph.js +2 -0
  414. package/dist/vue/components/Chart/graph.js.map +1 -1
  415. package/dist/vue/components/Chart/three-d.d.ts +3 -0
  416. package/dist/vue/components/Chart/three-d.js +2 -0
  417. package/dist/vue/components/Chart/three-d.js.map +1 -1
  418. package/dist/vue/components/Chart/trading.d.ts +7 -2
  419. package/dist/vue/components/Chart/trading.js +1 -0
  420. package/dist/vue/components/Chart/trading.js.map +1 -1
  421. package/dist/weapp/area-chart/index.wxml +1 -1
  422. package/dist/weapp/bar-chart/index.wxml +1 -1
  423. package/dist/weapp/box-plot-chart/index.wxml +1 -1
  424. package/dist/weapp/bubble-chart/index.wxml +1 -1
  425. package/dist/weapp/candlestick-chart/index.wxml +1 -1
  426. package/dist/weapp/chart/index.wxml +1 -1
  427. package/dist/weapp/charts/canvas.js +326 -54
  428. package/dist/weapp/charts/core.js +2 -0
  429. package/dist/weapp/controls.js +58 -27
  430. package/dist/weapp/gantt-chart/index.wxml +1 -1
  431. package/dist/weapp/heatmap-chart/index.wxml +1 -1
  432. package/dist/weapp/histogram-chart/index.wxml +1 -1
  433. package/dist/weapp/horizontal-bar-chart/index.wxml +1 -1
  434. package/dist/weapp/line-chart/index.wxml +1 -1
  435. package/dist/weapp/mixed-chart/index.wxml +1 -1
  436. package/dist/weapp/quadrant-chart/index.wxml +1 -1
  437. package/dist/weapp/range-area-chart/index.wxml +1 -1
  438. package/dist/weapp/scatter-chart/index.wxml +1 -1
  439. package/dist/weapp/sparkline/index.wxml +1 -1
  440. package/dist/weapp/types.d.ts +11 -2
  441. package/dist/weapp/waterfall-chart/index.wxml +1 -1
  442. package/dist/web-components/components/chart/extended.d.ts +4 -0
  443. package/dist/web-components/components/chart/extended.js +8 -2
  444. package/dist/web-components/components/chart/extended.js.map +1 -1
  445. package/dist/web-components/components/chart-3d/chart-3d.d.ts +1 -1
  446. package/dist/web-components/components/chart-3d/chart-3d.js.map +1 -1
  447. package/dist/web-components/components/graph/graph.d.ts +2 -0
  448. package/dist/web-components/components/graph/graph.js +3 -2
  449. package/dist/web-components/components/graph/graph.js.map +1 -1
  450. package/dist/web-components/components/trading-chart/trading-chart.d.ts +1 -1
  451. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  452. package/dist/web-components/html-custom-data.json +45 -0
  453. package/dist/web-components/types/react.d.ts +4 -4
  454. package/dist/web-components/types/solid.d.ts +8 -8
  455. package/dist/web-components/types/svelte.d.ts +8 -8
  456. package/dist/web-components/types/vue.d.ts +4 -4
  457. package/package.json +1 -1
@@ -1,8 +1,9 @@
1
1
  import { compileProgram as e, glContextAttributes as t, isSoftwareRenderer as n, itemParams as r } from "./gl.js";
2
- import { instanceRange as i } from "./range.js";
3
- import { GLSL1_AREA as a, GLSL1_BAR as o, GLSL1_LINE as s, GLSL1_SCATTER as c } from "./shaders.js";
2
+ import { claimGlSlot as i } from "./gl-budget.js";
3
+ import { instanceRange as a } from "./range.js";
4
+ import { GLSL1_AREA as o, GLSL1_BAR as s, GLSL1_LINE as c, GLSL1_SCATTER as l } from "./shaders.js";
4
5
  //#region src/engine/renderers/webgl.ts
5
- var l = {
6
+ var u = {
6
7
  line: [
7
8
  "a_corner",
8
9
  "a_a",
@@ -24,7 +25,7 @@ var l = {
24
25
  "a_size",
25
26
  "a_color"
26
27
  ]
27
- }, u = 4, d = new Float32Array([
28
+ }, d = 4, f = new Float32Array([
28
29
  0,
29
30
  0,
30
31
  1,
@@ -33,101 +34,121 @@ var l = {
33
34
  1,
34
35
  1,
35
36
  1
36
- ]), f = (f, p, m = !1) => {
37
- let h = f.getContext("webgl", t(m));
38
- if (!h) return null;
39
- let g = () => h.getExtension("WEBGL_lose_context")?.loseContext(), _ = h.getExtension("ANGLE_instanced_arrays");
40
- if (!_ || m && n(h)) return g(), null;
41
- let v = e(h, s, l.line), y = e(h, a, l.area), b = e(h, o, l.bar), x = e(h, c, l.scatter), S = h.createBuffer();
42
- if (!v || !y || !b || !x || !S) return g(), null;
43
- let C = {
44
- line: v,
45
- area: y,
46
- bar: b,
47
- scatter: x
48
- };
49
- h.bindBuffer(h.ARRAY_BUFFER, S), h.bufferData(h.ARRAY_BUFFER, d, h.STATIC_DRAW);
50
- let w = !1, T = (e) => {
51
- e.preventDefault(), w = !0, p();
52
- };
53
- f.addEventListener("webglcontextlost", T);
54
- let E = /* @__PURE__ */ new Map(), D = (e, t, n, r, i) => {
55
- h.enableVertexAttribArray(e), h.vertexAttribPointer(e, t, n, n === h.UNSIGNED_BYTE, r, i), _.vertexAttribDivisorANGLE(e, 1);
56
- }, O = (e, t, n) => {
57
- let r = h.FLOAT;
58
- switch (h.bindBuffer(h.ARRAY_BUFFER, S), h.enableVertexAttribArray(0), h.vertexAttribPointer(0, 2, r, !1, 0, 0), _.vertexAttribDivisorANGLE(0, 0), h.bindBuffer(h.ARRAY_BUFFER, t), e.kind) {
37
+ ]), p = (p, m, h = !1) => {
38
+ let g = p.getContext("webgl", t(h));
39
+ if (!g) return null;
40
+ let _ = () => g.getExtension("WEBGL_lose_context")?.loseContext(), v = g.getExtension("ANGLE_instanced_arrays");
41
+ if (!v || h && n(g)) return _(), null;
42
+ let y = v, b = () => {
43
+ let t = g.getExtension("ANGLE_instanced_arrays");
44
+ if (!t) return null;
45
+ y = t;
46
+ let n = e(g, c, u.line), r = e(g, o, u.area), i = e(g, s, u.bar), a = e(g, l, u.scatter), d = g.createBuffer();
47
+ return !n || !r || !i || !a || !d ? null : (g.bindBuffer(g.ARRAY_BUFFER, d), g.bufferData(g.ARRAY_BUFFER, f, g.STATIC_DRAW), {
48
+ programs: {
49
+ line: n,
50
+ area: r,
51
+ bar: i,
52
+ scatter: a
53
+ },
54
+ corners: d
55
+ });
56
+ }, x = b();
57
+ if (!x) return _(), null;
58
+ let S = !1, C = null, w = /* @__PURE__ */ new Map(), T = i(p, g, {
59
+ suspend: () => w.clear(),
60
+ restore: () => {
61
+ x = b(), x ? C && k(C.items, C.frame) : (S = !0, m());
62
+ },
63
+ lost: () => {
64
+ S = !0, m();
65
+ }
66
+ }), E = (e, t, n, r, i) => {
67
+ g.enableVertexAttribArray(e), g.vertexAttribPointer(e, t, n, n === g.UNSIGNED_BYTE, r, i), y.vertexAttribDivisorANGLE(e, 1);
68
+ }, D = (e, t, n, r) => {
69
+ let i = g.FLOAT;
70
+ switch (g.bindBuffer(g.ARRAY_BUFFER, r), g.enableVertexAttribArray(0), g.vertexAttribPointer(0, 2, i, !1, 0, 0), y.vertexAttribDivisorANGLE(0, 0), g.bindBuffer(g.ARRAY_BUFFER, t), e.kind) {
59
71
  case "line":
60
- D(1, 2, r, 8, n * 8), D(2, 2, r, 8, n * 8 + 8);
72
+ E(1, 2, i, 8, n * 8), E(2, 2, i, 8, n * 8 + 8);
61
73
  break;
62
74
  case "area":
63
- D(1, 3, r, 12, n * 12), D(2, 3, r, 12, (n + 1) * 12);
75
+ E(1, 3, i, 12, n * 12), E(2, 3, i, 12, (n + 1) * 12);
64
76
  break;
65
77
  case "bar":
66
- D(1, 3, r, 16, n * 16), D(2, 4, h.UNSIGNED_BYTE, 16, n * 16 + 12);
78
+ E(1, 3, i, 16, n * 16), E(2, 4, g.UNSIGNED_BYTE, 16, n * 16 + 12);
67
79
  break;
68
80
  default: {
69
81
  let e = n * 16;
70
- D(1, 2, r, 16, e), D(2, 1, r, 16, e + 8), D(3, 4, h.UNSIGNED_BYTE, 16, e + 12);
82
+ E(1, 2, i, 16, e), E(2, 1, i, 16, e + 8), E(3, 4, g.UNSIGNED_BYTE, 16, e + 12);
71
83
  break;
72
84
  }
73
85
  }
74
- for (let t = l[e.kind].length; t < u; t++) h.disableVertexAttribArray(t), _.vertexAttribDivisorANGLE(t, 0);
75
- }, k = (e) => {
76
- let t = E.get(e.key);
86
+ for (let t = u[e.kind].length; t < d; t++) g.disableVertexAttribArray(t), y.vertexAttribDivisorANGLE(t, 0);
87
+ }, O = (e) => {
88
+ let t = w.get(e.key);
77
89
  if (t && t.version === e.version && t.kind === e.kind) return t;
78
- t && h.deleteBuffer(t.buffer);
79
- let n = h.createBuffer();
90
+ t && g.deleteBuffer(t.buffer);
91
+ let n = g.createBuffer();
80
92
  if (!n) return null;
81
- switch (h.bindBuffer(h.ARRAY_BUFFER, n), e.kind) {
93
+ switch (g.bindBuffer(g.ARRAY_BUFFER, n), e.kind) {
82
94
  case "line":
83
- h.bufferData(h.ARRAY_BUFFER, e.points.subarray(0, e.count * 2), h.STATIC_DRAW);
95
+ g.bufferData(g.ARRAY_BUFFER, e.points.subarray(0, e.count * 2), g.STATIC_DRAW);
84
96
  break;
85
97
  case "area":
86
- h.bufferData(h.ARRAY_BUFFER, e.points.subarray(0, e.count * 3), h.STATIC_DRAW);
98
+ g.bufferData(g.ARRAY_BUFFER, e.points.subarray(0, e.count * 3), g.STATIC_DRAW);
87
99
  break;
88
- default: h.bufferData(h.ARRAY_BUFFER, e.instances, h.STATIC_DRAW);
100
+ default: g.bufferData(g.ARRAY_BUFFER, e.instances, g.STATIC_DRAW);
89
101
  }
90
102
  let r = {
91
103
  version: e.version,
92
104
  kind: e.kind,
93
105
  buffer: n
94
106
  };
95
- return E.set(e.key, r), r;
107
+ return w.set(e.key, r), r;
108
+ }, k = (e, t) => {
109
+ if (!x) return;
110
+ let { programs: n, corners: i } = x;
111
+ g.viewport(0, 0, p.width, p.height), g.clearColor(0, 0, 0, 0), g.clear(g.COLOR_BUFFER_BIT), g.enable(g.BLEND), g.blendFunc(g.ONE, g.ONE_MINUS_SRC_ALPHA);
112
+ let o = t.transform, s = /* @__PURE__ */ new Set();
113
+ for (let c of e) {
114
+ s.add(c.key);
115
+ let [e, l] = a(c, t);
116
+ if (l <= 0) continue;
117
+ let u = O(c);
118
+ if (!u) continue;
119
+ let d = n[c.kind];
120
+ g.useProgram(d.program), g.uniform4f(d.xform, o.xScale, o.xOffset, o.yScale, o.yOffset), g.uniform4f(d.viewport, t.width, t.height, t.dpr, 0), g.uniform4f(d.color, c.color[0], c.color[1], c.color[2], c.color[3]);
121
+ let [f, p, m, h] = r(c, t);
122
+ g.uniform4f(d.params, f, p, m, h), D(c, u.buffer, e, i), y.drawArraysInstancedANGLE(g.TRIANGLE_STRIP, 0, 4, l);
123
+ }
124
+ for (let [e, t] of w) s.has(e) || (g.deleteBuffer(t.buffer), w.delete(e));
96
125
  };
97
126
  return {
98
127
  kind: "webgl",
99
- canvas: f,
128
+ canvas: p,
100
129
  resize(e, t) {
101
- f.width = Math.max(1, e), f.height = Math.max(1, t);
130
+ p.width = Math.max(1, e), p.height = Math.max(1, t);
102
131
  },
103
132
  render(e, t) {
104
- if (w || h.isContextLost()) return;
105
- h.viewport(0, 0, f.width, f.height), h.clearColor(0, 0, 0, 0), h.clear(h.COLOR_BUFFER_BIT), h.enable(h.BLEND), h.blendFunc(h.ONE, h.ONE_MINUS_SRC_ALPHA);
106
- let n = t.transform, a = /* @__PURE__ */ new Set();
107
- for (let o of e) {
108
- a.add(o.key);
109
- let [e, s] = i(o, t);
110
- if (s <= 0) continue;
111
- let c = k(o);
112
- if (!c) continue;
113
- let l = C[o.kind];
114
- h.useProgram(l.program), h.uniform4f(l.xform, n.xScale, n.xOffset, n.yScale, n.yOffset), h.uniform4f(l.viewport, t.width, t.height, t.dpr, 0), h.uniform4f(l.color, o.color[0], o.color[1], o.color[2], o.color[3]);
115
- let [u, d, f, p] = r(o, t);
116
- h.uniform4f(l.params, u, d, f, p), O(o, c.buffer, e), _.drawArraysInstancedANGLE(h.TRIANGLE_STRIP, 0, 4, s);
117
- }
118
- for (let [e, t] of E) a.has(e) || (h.deleteBuffer(t.buffer), E.delete(e));
133
+ C = {
134
+ items: e,
135
+ frame: t
136
+ }, !(S || !T.use() || g.isContextLost()) && k(e, t);
119
137
  },
120
138
  destroy() {
121
- if (f.removeEventListener("webglcontextlost", T), !h.isContextLost()) {
122
- for (let e of E.values()) h.deleteBuffer(e.buffer);
123
- for (let e of Object.values(C)) h.deleteProgram(e.program);
124
- h.deleteBuffer(S);
139
+ if (T.release(), C = null, !g.isContextLost()) {
140
+ for (let e of w.values()) g.deleteBuffer(e.buffer);
141
+ if (x) {
142
+ for (let e of Object.values(x.programs)) g.deleteProgram(e.program);
143
+ g.deleteBuffer(x.corners);
144
+ }
145
+ _();
125
146
  }
126
- E.clear(), g();
147
+ w.clear();
127
148
  }
128
149
  };
129
150
  };
130
151
  //#endregion
131
- export { f as createWebGlRenderer };
152
+ export { p as createWebGlRenderer };
132
153
 
133
154
  //# sourceMappingURL=webgl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webgl.js","names":["ATTRIBUTES","MAX_LOCATIONS","CORNERS","createWebGlRenderer","gl","canvas","glContextAttributes","requireHardware","loseContext","instancing","isSoftwareRenderer","line","compileProgram","GLSL1_LINE","area","GLSL1_AREA","bar","GLSL1_BAR","scatter","GLSL1_SCATTER","corners","programs","lost","handleLost","event","onLost","resources","instanced","location","size","type","stride","offset","bindAttributes","F","buffer","item","first","i","upload","existing","res","width","height","t","frame","seen","items","instances","instanceRange","program","p0","p1","p2","p3","itemParams","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl.ts"],"sourcesContent":["// WebGL (1) backend: the WebGL2 primitives in GLSL ES 1.0 for browsers and\n// GPUs without WebGL2. Instancing comes from ANGLE_instanced_arrays (exposed\n// virtually everywhere); without it the chain moves on to Canvas2D. Vertex\n// array objects are optional in WebGL 1, so the attributes are bound for\n// every draw (a handful of calls per series).\n\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n itemParams,\n} from \"./gl\";\nimport { instanceRange } from \"./range\";\nimport { GLSL1_AREA, GLSL1_BAR, GLSL1_LINE, GLSL1_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n}\n\n/** Location 0 is the per-vertex corner, the others are per instance */\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_corner\", \"a_a\", \"a_b\"],\n area: [\"a_corner\", \"a_a\", \"a_b\"],\n bar: [\"a_corner\", \"a_inst\", \"a_color\"],\n scatter: [\"a_corner\", \"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst MAX_LOCATIONS = 4;\n\n/** Corners of the triangle strip, as gl_VertexID gives them in WebGL2: (vi & 1, vi >> 1) */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n\nexport const createWebGlRenderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\n \"webgl\",\n glContextAttributes(requireHardware),\n ) as WebGLRenderingContext | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const instancing = gl.getExtension(\"ANGLE_instanced_arrays\");\n if (!instancing || (requireHardware && isSoftwareRenderer(gl))) {\n loseContext();\n return null;\n }\n\n const line = compileProgram(gl, GLSL1_LINE, ATTRIBUTES.line);\n const area = compileProgram(gl, GLSL1_AREA, ATTRIBUTES.area);\n const bar = compileProgram(gl, GLSL1_BAR, ATTRIBUTES.bar);\n const scatter = compileProgram(gl, GLSL1_SCATTER, ATTRIBUTES.scatter);\n const corners = gl.createBuffer();\n if (!line || !area || !bar || !scatter || !corners) {\n loseContext();\n return null;\n }\n const programs = { line, area, bar, scatter };\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** Float or normalized unorm8x4 attribute advancing once per instance */\n const instanced = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n instancing.vertexAttribDivisorANGLE(location, 1);\n };\n\n /** Binds the corner and the instance attributes starting at instance `first` */\n const bindAttributes = (\n item: RenderItem,\n buffer: WebGLBuffer,\n first: number,\n ) => {\n const F = gl.FLOAT;\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 0, 0);\n instancing.vertexAttribDivisorANGLE(0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n instanced(1, 2, F, 8, first * 8);\n instanced(2, 2, F, 8, first * 8 + 8);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n instanced(1, 3, F, stride, first * stride);\n instanced(2, 3, F, stride, (first + 1) * stride);\n break;\n }\n case \"bar\":\n instanced(1, 3, F, BAR_STRIDE, first * BAR_STRIDE);\n instanced(2, 4, gl.UNSIGNED_BYTE, BAR_STRIDE, first * BAR_STRIDE + 12);\n break;\n default: {\n const offset = first * SCATTER_STRIDE;\n instanced(1, 2, F, SCATTER_STRIDE, offset);\n instanced(2, 1, F, SCATTER_STRIDE, offset + 8);\n instanced(3, 4, gl.UNSIGNED_BYTE, SCATTER_STRIDE, offset + 12);\n break;\n }\n }\n // attribute state is global without vertex array objects\n for (let i = ATTRIBUTES[item.kind].length; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n instancing.vertexAttribDivisorANGLE(i, 0);\n }\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) gl.deleteBuffer(existing.buffer);\n const buffer = gl.createBuffer();\n if (!buffer) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points.subarray(0, item.count * 2),\n gl.STATIC_DRAW,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points.subarray(0, item.count * AREA_STRIDE),\n gl.STATIC_DRAW,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n const res = { version: item.version, kind: item.kind, buffer };\n resources.set(item.key, res);\n return res;\n };\n\n return {\n kind: \"webgl\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = itemParams(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n bindAttributes(item, res.buffer, first);\n instancing.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.buffer);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) gl.deleteBuffer(res.buffer);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n gl.deleteBuffer(corners);\n }\n resources.clear();\n loseContext();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"webgl.js","names":["ATTRIBUTES","MAX_LOCATIONS","CORNERS","createWebGlRenderer","gl","canvas","glContextAttributes","requireHardware","loseContext","firstInstancing","isSoftwareRenderer","instancing","build","ext","line","compileProgram","GLSL1_LINE","area","GLSL1_AREA","bar","GLSL1_BAR","scatter","GLSL1_SCATTER","corners","built","lost","last","resources","slot","claimGlSlot","draw","onLost","instanced","location","size","type","stride","offset","bindAttributes","F","buffer","item","first","i","upload","existing","res","t","frame","seen","items","instances","instanceRange","program","programs","p0","p1","p2","p3","itemParams","key","width","height","p"],"sources":["../../../../../charts/src/engine/renderers/webgl.ts"],"sourcesContent":["// WebGL (1) backend: the WebGL2 primitives in GLSL ES 1.0 for browsers and\n// GPUs without WebGL2. Instancing comes from ANGLE_instanced_arrays (exposed\n// virtually everywhere); without it the chain moves on to Canvas2D. Vertex\n// array objects are optional in WebGL 1, so the attributes are bound for\n// every draw (a handful of calls per series).\n\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n itemParams,\n type GlProgram,\n} from \"./gl\";\nimport { claimGlSlot } from \"./gl-budget\";\nimport { instanceRange } from \"./range\";\nimport { GLSL1_AREA, GLSL1_BAR, GLSL1_LINE, GLSL1_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n}\n\n/** Location 0 is the per-vertex corner, the others are per instance */\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_corner\", \"a_a\", \"a_b\"],\n area: [\"a_corner\", \"a_a\", \"a_b\"],\n bar: [\"a_corner\", \"a_inst\", \"a_color\"],\n scatter: [\"a_corner\", \"a_pos\", \"a_size\", \"a_color\"],\n};\n\nconst MAX_LOCATIONS = 4;\n\n/** Corners of the triangle strip, as gl_VertexID gives them in WebGL2: (vi & 1, vi >> 1) */\nconst CORNERS = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n\nexport const createWebGlRenderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\n \"webgl\",\n glContextAttributes(requireHardware),\n ) as WebGLRenderingContext | null;\n if (!gl) return null;\n const loseContext = () =>\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n const firstInstancing = gl.getExtension(\"ANGLE_instanced_arrays\");\n if (!firstInstancing || (requireHardware && isSoftwareRenderer(gl))) {\n loseContext();\n return null;\n }\n let instancing: ANGLE_instanced_arrays = firstInstancing;\n\n /** Programs and the shared corner buffer (built again after a restore) */\n const build = () => {\n // extension objects don't survive a context restore\n const ext = gl.getExtension(\"ANGLE_instanced_arrays\");\n if (!ext) return null;\n instancing = ext;\n const line = compileProgram(gl, GLSL1_LINE, ATTRIBUTES.line);\n const area = compileProgram(gl, GLSL1_AREA, ATTRIBUTES.area);\n const bar = compileProgram(gl, GLSL1_BAR, ATTRIBUTES.bar);\n const scatter = compileProgram(gl, GLSL1_SCATTER, ATTRIBUTES.scatter);\n const corners = gl.createBuffer();\n if (!line || !area || !bar || !scatter || !corners) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.bufferData(gl.ARRAY_BUFFER, CORNERS, gl.STATIC_DRAW);\n const programs: Record<RenderItem[\"kind\"], GlProgram> = {\n line,\n area,\n bar,\n scatter,\n };\n return { programs, corners };\n };\n let built = build();\n if (!built) {\n loseContext();\n return null;\n }\n\n let lost = false;\n let last: { items: readonly RenderItem[]; frame: RenderFrame } | null = null;\n const resources = new Map<string, ItemResources>();\n // past the page-wide context budget, the context may be suspended while\n // off-screen: its GPU objects go, and come back with the context\n const slot = claimGlSlot(canvas, gl, {\n suspend: () => resources.clear(),\n restore: () => {\n built = build();\n if (!built) {\n lost = true;\n onLost();\n } else if (last) draw(last.items, last.frame);\n },\n lost: () => {\n lost = true;\n onLost();\n },\n });\n\n /** Float or normalized unorm8x4 attribute advancing once per instance */\n const instanced = (\n location: number,\n size: number,\n type: number,\n stride: number,\n offset: number,\n ) => {\n gl.enableVertexAttribArray(location);\n gl.vertexAttribPointer(\n location,\n size,\n type,\n type === gl.UNSIGNED_BYTE,\n stride,\n offset,\n );\n instancing.vertexAttribDivisorANGLE(location, 1);\n };\n\n /** Binds the corner and the instance attributes starting at instance `first` */\n const bindAttributes = (\n item: RenderItem,\n buffer: WebGLBuffer,\n first: number,\n corners: WebGLBuffer,\n ) => {\n const F = gl.FLOAT;\n gl.bindBuffer(gl.ARRAY_BUFFER, corners);\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 0, 0);\n instancing.vertexAttribDivisorANGLE(0, 0);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n instanced(1, 2, F, 8, first * 8);\n instanced(2, 2, F, 8, first * 8 + 8);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n instanced(1, 3, F, stride, first * stride);\n instanced(2, 3, F, stride, (first + 1) * stride);\n break;\n }\n case \"bar\":\n instanced(1, 3, F, BAR_STRIDE, first * BAR_STRIDE);\n instanced(2, 4, gl.UNSIGNED_BYTE, BAR_STRIDE, first * BAR_STRIDE + 12);\n break;\n default: {\n const offset = first * SCATTER_STRIDE;\n instanced(1, 2, F, SCATTER_STRIDE, offset);\n instanced(2, 1, F, SCATTER_STRIDE, offset + 8);\n instanced(3, 4, gl.UNSIGNED_BYTE, SCATTER_STRIDE, offset + 12);\n break;\n }\n }\n // attribute state is global without vertex array objects\n for (let i = ATTRIBUTES[item.kind].length; i < MAX_LOCATIONS; i++) {\n gl.disableVertexAttribArray(i);\n instancing.vertexAttribDivisorANGLE(i, 0);\n }\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) gl.deleteBuffer(existing.buffer);\n const buffer = gl.createBuffer();\n if (!buffer) return null;\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points.subarray(0, item.count * 2),\n gl.STATIC_DRAW,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points.subarray(0, item.count * AREA_STRIDE),\n gl.STATIC_DRAW,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n const res = { version: item.version, kind: item.kind, buffer };\n resources.set(item.key, res);\n return res;\n };\n\n const draw = (items: readonly RenderItem[], frame: RenderFrame) => {\n if (!built) return;\n const { programs, corners } = built;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = itemParams(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n bindAttributes(item, res.buffer, first, corners);\n instancing.drawArraysInstancedANGLE(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n gl.deleteBuffer(res.buffer);\n resources.delete(key);\n }\n }\n };\n\n return {\n kind: \"webgl\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n last = { items, frame };\n if (lost || !slot.use() || gl.isContextLost()) return;\n draw(items, frame);\n },\n destroy() {\n slot.release();\n last = null;\n if (!gl.isContextLost()) {\n for (const res of resources.values()) gl.deleteBuffer(res.buffer);\n if (built) {\n for (const p of Object.values(built.programs)) {\n gl.deleteProgram(p.program);\n }\n gl.deleteBuffer(built.corners);\n }\n loseContext();\n }\n resources.clear();\n },\n };\n};\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- const e=require("./gl.cjs"),t=require("./range.cjs"),n=require("./shaders.cjs");var r={line:[`a_a`,`a_b`],area:[`a_a`,`a_b`],bar:[`a_inst`,`a_color`],scatter:[`a_pos`,`a_size`,`a_color`]},i=(i,a,o=!1)=>{let s=i.getContext(`webgl2`,e.glContextAttributes(o));if(!s)return null;if(o&&e.isSoftwareRenderer(s))return s.getExtension(`WEBGL_lose_context`)?.loseContext(),null;let c=e.compileProgram(s,n.GLSL_LINE,r.line),l=e.compileProgram(s,n.GLSL_AREA,r.area),u=e.compileProgram(s,n.GLSL_BAR,r.bar),d=e.compileProgram(s,n.GLSL_SCATTER,r.scatter);if(!c||!l||!u||!d)return null;let f={line:c,area:l,bar:u,scatter:d},p=!1,m=e=>{e.preventDefault(),p=!0,a()};i.addEventListener(`webglcontextlost`,m);let h=new Map,g=(e,t)=>{let n=s.FLOAT;switch(e.kind){case`line`:s.enableVertexAttribArray(0),s.vertexAttribPointer(0,2,n,!1,8,t*8),s.vertexAttribDivisor(0,1),s.enableVertexAttribArray(1),s.vertexAttribPointer(1,2,n,!1,8,t*8+8),s.vertexAttribDivisor(1,1);break;case`area`:s.enableVertexAttribArray(0),s.vertexAttribPointer(0,3,n,!1,12,t*12),s.vertexAttribDivisor(0,1),s.enableVertexAttribArray(1),s.vertexAttribPointer(1,3,n,!1,12,(t+1)*12),s.vertexAttribDivisor(1,1);break;case`bar`:s.enableVertexAttribArray(0),s.vertexAttribPointer(0,3,n,!1,16,t*16),s.vertexAttribDivisor(0,1),s.enableVertexAttribArray(1),s.vertexAttribPointer(1,4,s.UNSIGNED_BYTE,!0,16,t*16+12),s.vertexAttribDivisor(1,1);break;default:s.enableVertexAttribArray(0),s.vertexAttribPointer(0,2,n,!1,16,0),s.vertexAttribDivisor(0,1),s.enableVertexAttribArray(1),s.vertexAttribPointer(1,1,n,!1,16,8),s.vertexAttribDivisor(1,1),s.enableVertexAttribArray(2),s.vertexAttribPointer(2,4,s.UNSIGNED_BYTE,!0,16,12),s.vertexAttribDivisor(2,1)}},_=e=>{s.deleteBuffer(e.buffer),s.deleteVertexArray(e.vao)},v=e=>{let t=h.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t&&_(t);let n=s.createBuffer(),r=s.createVertexArray();if(!n||!r)return null;switch(s.bindVertexArray(r),s.bindBuffer(s.ARRAY_BUFFER,n),e.kind){case`line`:s.bufferData(s.ARRAY_BUFFER,e.points,s.STATIC_DRAW,0,e.count*2);break;case`area`:s.bufferData(s.ARRAY_BUFFER,e.points,s.STATIC_DRAW,0,e.count*3);break;default:s.bufferData(s.ARRAY_BUFFER,e.instances,s.STATIC_DRAW)}g(e,0),s.bindVertexArray(null);let i={version:e.version,kind:e.kind,buffer:n,vao:r,first:0};return h.set(e.key,i),i};return{kind:`webgl2`,canvas:i,resize(e,t){i.width=Math.max(1,e),i.height=Math.max(1,t)},render(n,r){if(p||s.isContextLost())return;s.viewport(0,0,i.width,i.height),s.clearColor(0,0,0,0),s.clear(s.COLOR_BUFFER_BIT),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA);let a=r.transform,o=new Set;for(let i of n){o.add(i.key);let[n,c]=t.instanceRange(i,r);if(c<=0)continue;let l=v(i);if(!l)continue;let u=f[i.kind];s.useProgram(u.program),s.uniform4f(u.xform,a.xScale,a.xOffset,a.yScale,a.yOffset),s.uniform4f(u.viewport,r.width,r.height,r.dpr,0),s.uniform4f(u.color,i.color[0],i.color[1],i.color[2],i.color[3]);let[d,p,m,h]=e.itemParams(i,r);s.uniform4f(u.params,d,p,m,h),s.bindVertexArray(l.vao),l.first!==n&&(s.bindBuffer(s.ARRAY_BUFFER,l.buffer),g(i,n),l.first=n),s.drawArraysInstanced(s.TRIANGLE_STRIP,0,4,c)}s.bindVertexArray(null);for(let[e,t]of h)o.has(e)||(_(t),h.delete(e))},destroy(){if(i.removeEventListener(`webglcontextlost`,m),!s.isContextLost()){for(let e of h.values())_(e);for(let e of Object.values(f))s.deleteProgram(e.program)}h.clear(),s.getExtension(`WEBGL_lose_context`)?.loseContext()}}};exports.createWebGl2Renderer=i;
1
+ const e=require("./gl.cjs"),t=require("./gl-budget.cjs"),n=require("./range.cjs"),r=require("./shaders.cjs");var i={line:[`a_a`,`a_b`],area:[`a_a`,`a_b`],bar:[`a_inst`,`a_color`],scatter:[`a_pos`,`a_size`,`a_color`]},a=(a,o,s=!1)=>{let c=a.getContext(`webgl2`,e.glContextAttributes(s));if(!c)return null;if(s&&e.isSoftwareRenderer(c))return c.getExtension(`WEBGL_lose_context`)?.loseContext(),null;let l=()=>{let t=e.compileProgram(c,r.GLSL_LINE,i.line),n=e.compileProgram(c,r.GLSL_AREA,i.area),a=e.compileProgram(c,r.GLSL_BAR,i.bar),o=e.compileProgram(c,r.GLSL_SCATTER,i.scatter);return t&&n&&a&&o?{line:t,area:n,bar:a,scatter:o}:null},u=l();if(!u)return null;let d=!1,f=null,p=new Map,m=t.claimGlSlot(a,c,{suspend:()=>p.clear(),restore:()=>{u=l(),u?f&&v(f.items,f.frame):(d=!0,o())},lost:()=>{d=!0,o()}}),h=(e,t)=>{let n=c.FLOAT;switch(e.kind){case`line`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,8,t*8),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,2,n,!1,8,t*8+8),c.vertexAttribDivisor(1,1);break;case`area`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,3,n,!1,12,t*12),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,3,n,!1,12,(t+1)*12),c.vertexAttribDivisor(1,1);break;case`bar`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,3,n,!1,16,t*16),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,4,c.UNSIGNED_BYTE,!0,16,t*16+12),c.vertexAttribDivisor(1,1);break;default:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,16,0),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,1,n,!1,16,8),c.vertexAttribDivisor(1,1),c.enableVertexAttribArray(2),c.vertexAttribPointer(2,4,c.UNSIGNED_BYTE,!0,16,12),c.vertexAttribDivisor(2,1)}},g=e=>{c.deleteBuffer(e.buffer),c.deleteVertexArray(e.vao)},_=e=>{let t=p.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t&&g(t);let n=c.createBuffer(),r=c.createVertexArray();if(!n||!r)return null;switch(c.bindVertexArray(r),c.bindBuffer(c.ARRAY_BUFFER,n),e.kind){case`line`:c.bufferData(c.ARRAY_BUFFER,e.points,c.STATIC_DRAW,0,e.count*2);break;case`area`:c.bufferData(c.ARRAY_BUFFER,e.points,c.STATIC_DRAW,0,e.count*3);break;default:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW)}h(e,0),c.bindVertexArray(null);let i={version:e.version,kind:e.kind,buffer:n,vao:r,first:0};return p.set(e.key,i),i},v=(t,r)=>{if(!u)return;c.viewport(0,0,a.width,a.height),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT),c.enable(c.BLEND),c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA);let i=r.transform,o=new Set;for(let a of t){o.add(a.key);let[t,s]=n.instanceRange(a,r);if(s<=0)continue;let l=_(a);if(!l)continue;let d=u[a.kind];c.useProgram(d.program),c.uniform4f(d.xform,i.xScale,i.xOffset,i.yScale,i.yOffset),c.uniform4f(d.viewport,r.width,r.height,r.dpr,0),c.uniform4f(d.color,a.color[0],a.color[1],a.color[2],a.color[3]);let[f,p,m,g]=e.itemParams(a,r);c.uniform4f(d.params,f,p,m,g),c.bindVertexArray(l.vao),l.first!==t&&(c.bindBuffer(c.ARRAY_BUFFER,l.buffer),h(a,t),l.first=t),c.drawArraysInstanced(c.TRIANGLE_STRIP,0,4,s)}c.bindVertexArray(null);for(let[e,t]of p)o.has(e)||(g(t),p.delete(e))};return{kind:`webgl2`,canvas:a,resize(e,t){a.width=Math.max(1,e),a.height=Math.max(1,t)},render(e,t){f={items:e,frame:t},!(d||!m.use()||c.isContextLost())&&v(e,t)},destroy(){if(m.release(),f=null,!c.isContextLost()){for(let e of p.values())g(e);for(let e of Object.values(u??{}))c.deleteProgram(e.program);c.getExtension(`WEBGL_lose_context`)?.loseContext()}p.clear()}}};exports.createWebGl2Renderer=a;
2
2
  //# sourceMappingURL=webgl2.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"webgl2.cjs","names":["glContextAttributes","isSoftwareRenderer","compileProgram","GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER","instanceRange","itemParams","require_gl","require_range","require_shaders","ATTRIBUTES","createWebGl2Renderer","gl","canvas","requireHardware","line","area","bar","scatter","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","width","height","t","frame","seen","items","instances","program","p0","p1","p2","p3","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n itemParams,\n} from \"./gl\";\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\", \"a_color\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", glContextAttributes(requireHardware));\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compileProgram(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compileProgram(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compileProgram(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compileProgram(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, stride, first * stride);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, F, false, stride, (first + 1) * stride);\n gl.vertexAttribDivisor(1, 1);\n break;\n }\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, BAR_STRIDE, first * BAR_STRIDE);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(\n 1,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n BAR_STRIDE,\n first * BAR_STRIDE + 12,\n );\n gl.vertexAttribDivisor(1, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * AREA_STRIDE,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = itemParams(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"webgl2.cjs","names":["glContextAttributes","isSoftwareRenderer","compileProgram","GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER","claimGlSlot","instanceRange","itemParams","require_gl","require_gl_budget","require_range","require_shaders","ATTRIBUTES","createWebGl2Renderer","gl","canvas","requireHardware","compile","line","area","bar","scatter","programs","lost","last","resources","slot","draw","onLost","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","t","frame","seen","items","instances","program","p0","p1","p2","p3","key","width","height","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n itemParams,\n type GlProgram,\n} from \"./gl\";\nimport { claimGlSlot } from \"./gl-budget\";\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\", \"a_color\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", glContextAttributes(requireHardware));\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const compile = (): Record<RenderItem[\"kind\"], GlProgram> | null => {\n const line = compileProgram(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compileProgram(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compileProgram(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compileProgram(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n return line && area && bar && scatter ? { line, area, bar, scatter } : null;\n };\n let programs = compile();\n if (!programs) return null;\n\n let lost = false;\n let last: { items: readonly RenderItem[]; frame: RenderFrame } | null = null;\n const resources = new Map<string, ItemResources>();\n // past the page-wide context budget, the context may be suspended while\n // off-screen: its GPU objects go, and come back with the context\n const slot = claimGlSlot(canvas, gl, {\n suspend: () => resources.clear(),\n restore: () => {\n programs = compile();\n if (!programs) {\n lost = true;\n onLost();\n } else if (last) draw(last.items, last.frame);\n },\n lost: () => {\n lost = true;\n onLost();\n },\n });\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, stride, first * stride);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, F, false, stride, (first + 1) * stride);\n gl.vertexAttribDivisor(1, 1);\n break;\n }\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, BAR_STRIDE, first * BAR_STRIDE);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(\n 1,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n BAR_STRIDE,\n first * BAR_STRIDE + 12,\n );\n gl.vertexAttribDivisor(1, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * AREA_STRIDE,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const draw = (items: readonly RenderItem[], frame: RenderFrame) => {\n if (!programs) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = itemParams(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n last = { items, frame };\n if (lost || !slot.use() || gl.isContextLost()) return;\n draw(items, frame);\n },\n destroy() {\n slot.release();\n last = null;\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs ?? {})) {\n gl.deleteProgram(p.program);\n }\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n }\n resources.clear();\n },\n };\n};\n"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { compileProgram as e, glContextAttributes as t, isSoftwareRenderer as n, itemParams as r } from "./gl.js";
2
- import { instanceRange as i } from "./range.js";
3
- import { GLSL_AREA as a, GLSL_BAR as o, GLSL_LINE as s, GLSL_SCATTER as c } from "./shaders.js";
2
+ import { claimGlSlot as i } from "./gl-budget.js";
3
+ import { instanceRange as a } from "./range.js";
4
+ import { GLSL_AREA as o, GLSL_BAR as s, GLSL_LINE as c, GLSL_SCATTER as l } from "./shaders.js";
4
5
  //#region src/engine/renderers/webgl2.ts
5
- var l = {
6
+ var u = {
6
7
  line: ["a_a", "a_b"],
7
8
  area: ["a_a", "a_b"],
8
9
  bar: ["a_inst", "a_color"],
@@ -11,53 +12,60 @@ var l = {
11
12
  "a_size",
12
13
  "a_color"
13
14
  ]
14
- }, u = (u, d, f = !1) => {
15
- let p = u.getContext("webgl2", t(f));
16
- if (!p) return null;
17
- if (f && n(p)) return p.getExtension("WEBGL_lose_context")?.loseContext(), null;
18
- let m = e(p, s, l.line), h = e(p, a, l.area), g = e(p, o, l.bar), _ = e(p, c, l.scatter);
19
- if (!m || !h || !g || !_) return null;
20
- let v = {
21
- line: m,
22
- area: h,
23
- bar: g,
24
- scatter: _
25
- }, y = !1, b = (e) => {
26
- e.preventDefault(), y = !0, d();
27
- };
28
- u.addEventListener("webglcontextlost", b);
29
- let x = /* @__PURE__ */ new Map(), S = (e, t) => {
30
- let n = p.FLOAT;
15
+ }, d = (d, f, p = !1) => {
16
+ let m = d.getContext("webgl2", t(p));
17
+ if (!m) return null;
18
+ if (p && n(m)) return m.getExtension("WEBGL_lose_context")?.loseContext(), null;
19
+ let h = () => {
20
+ let t = e(m, c, u.line), n = e(m, o, u.area), r = e(m, s, u.bar), i = e(m, l, u.scatter);
21
+ return t && n && r && i ? {
22
+ line: t,
23
+ area: n,
24
+ bar: r,
25
+ scatter: i
26
+ } : null;
27
+ }, g = h();
28
+ if (!g) return null;
29
+ let _ = !1, v = null, y = /* @__PURE__ */ new Map(), b = i(d, m, {
30
+ suspend: () => y.clear(),
31
+ restore: () => {
32
+ g = h(), g ? v && w(v.items, v.frame) : (_ = !0, f());
33
+ },
34
+ lost: () => {
35
+ _ = !0, f();
36
+ }
37
+ }), x = (e, t) => {
38
+ let n = m.FLOAT;
31
39
  switch (e.kind) {
32
40
  case "line":
33
- p.enableVertexAttribArray(0), p.vertexAttribPointer(0, 2, n, !1, 8, t * 8), p.vertexAttribDivisor(0, 1), p.enableVertexAttribArray(1), p.vertexAttribPointer(1, 2, n, !1, 8, t * 8 + 8), p.vertexAttribDivisor(1, 1);
41
+ m.enableVertexAttribArray(0), m.vertexAttribPointer(0, 2, n, !1, 8, t * 8), m.vertexAttribDivisor(0, 1), m.enableVertexAttribArray(1), m.vertexAttribPointer(1, 2, n, !1, 8, t * 8 + 8), m.vertexAttribDivisor(1, 1);
34
42
  break;
35
43
  case "area":
36
- p.enableVertexAttribArray(0), p.vertexAttribPointer(0, 3, n, !1, 12, t * 12), p.vertexAttribDivisor(0, 1), p.enableVertexAttribArray(1), p.vertexAttribPointer(1, 3, n, !1, 12, (t + 1) * 12), p.vertexAttribDivisor(1, 1);
44
+ m.enableVertexAttribArray(0), m.vertexAttribPointer(0, 3, n, !1, 12, t * 12), m.vertexAttribDivisor(0, 1), m.enableVertexAttribArray(1), m.vertexAttribPointer(1, 3, n, !1, 12, (t + 1) * 12), m.vertexAttribDivisor(1, 1);
37
45
  break;
38
46
  case "bar":
39
- p.enableVertexAttribArray(0), p.vertexAttribPointer(0, 3, n, !1, 16, t * 16), p.vertexAttribDivisor(0, 1), p.enableVertexAttribArray(1), p.vertexAttribPointer(1, 4, p.UNSIGNED_BYTE, !0, 16, t * 16 + 12), p.vertexAttribDivisor(1, 1);
47
+ m.enableVertexAttribArray(0), m.vertexAttribPointer(0, 3, n, !1, 16, t * 16), m.vertexAttribDivisor(0, 1), m.enableVertexAttribArray(1), m.vertexAttribPointer(1, 4, m.UNSIGNED_BYTE, !0, 16, t * 16 + 12), m.vertexAttribDivisor(1, 1);
40
48
  break;
41
- default: p.enableVertexAttribArray(0), p.vertexAttribPointer(0, 2, n, !1, 16, 0), p.vertexAttribDivisor(0, 1), p.enableVertexAttribArray(1), p.vertexAttribPointer(1, 1, n, !1, 16, 8), p.vertexAttribDivisor(1, 1), p.enableVertexAttribArray(2), p.vertexAttribPointer(2, 4, p.UNSIGNED_BYTE, !0, 16, 12), p.vertexAttribDivisor(2, 1);
49
+ default: m.enableVertexAttribArray(0), m.vertexAttribPointer(0, 2, n, !1, 16, 0), m.vertexAttribDivisor(0, 1), m.enableVertexAttribArray(1), m.vertexAttribPointer(1, 1, n, !1, 16, 8), m.vertexAttribDivisor(1, 1), m.enableVertexAttribArray(2), m.vertexAttribPointer(2, 4, m.UNSIGNED_BYTE, !0, 16, 12), m.vertexAttribDivisor(2, 1);
42
50
  }
51
+ }, S = (e) => {
52
+ m.deleteBuffer(e.buffer), m.deleteVertexArray(e.vao);
43
53
  }, C = (e) => {
44
- p.deleteBuffer(e.buffer), p.deleteVertexArray(e.vao);
45
- }, w = (e) => {
46
- let t = x.get(e.key);
54
+ let t = y.get(e.key);
47
55
  if (t && t.version === e.version && t.kind === e.kind) return t;
48
- t && C(t);
49
- let n = p.createBuffer(), r = p.createVertexArray();
56
+ t && S(t);
57
+ let n = m.createBuffer(), r = m.createVertexArray();
50
58
  if (!n || !r) return null;
51
- switch (p.bindVertexArray(r), p.bindBuffer(p.ARRAY_BUFFER, n), e.kind) {
59
+ switch (m.bindVertexArray(r), m.bindBuffer(m.ARRAY_BUFFER, n), e.kind) {
52
60
  case "line":
53
- p.bufferData(p.ARRAY_BUFFER, e.points, p.STATIC_DRAW, 0, e.count * 2);
61
+ m.bufferData(m.ARRAY_BUFFER, e.points, m.STATIC_DRAW, 0, e.count * 2);
54
62
  break;
55
63
  case "area":
56
- p.bufferData(p.ARRAY_BUFFER, e.points, p.STATIC_DRAW, 0, e.count * 3);
64
+ m.bufferData(m.ARRAY_BUFFER, e.points, m.STATIC_DRAW, 0, e.count * 3);
57
65
  break;
58
- default: p.bufferData(p.ARRAY_BUFFER, e.instances, p.STATIC_DRAW);
66
+ default: m.bufferData(m.ARRAY_BUFFER, e.instances, m.STATIC_DRAW);
59
67
  }
60
- S(e, 0), p.bindVertexArray(null);
68
+ x(e, 0), m.bindVertexArray(null);
61
69
  let i = {
62
70
  version: e.version,
63
71
  kind: e.kind,
@@ -65,42 +73,48 @@ var l = {
65
73
  vao: r,
66
74
  first: 0
67
75
  };
68
- return x.set(e.key, i), i;
76
+ return y.set(e.key, i), i;
77
+ }, w = (e, t) => {
78
+ if (!g) return;
79
+ m.viewport(0, 0, d.width, d.height), m.clearColor(0, 0, 0, 0), m.clear(m.COLOR_BUFFER_BIT), m.enable(m.BLEND), m.blendFunc(m.ONE, m.ONE_MINUS_SRC_ALPHA);
80
+ let n = t.transform, i = /* @__PURE__ */ new Set();
81
+ for (let o of e) {
82
+ i.add(o.key);
83
+ let [e, s] = a(o, t);
84
+ if (s <= 0) continue;
85
+ let c = C(o);
86
+ if (!c) continue;
87
+ let l = g[o.kind];
88
+ m.useProgram(l.program), m.uniform4f(l.xform, n.xScale, n.xOffset, n.yScale, n.yOffset), m.uniform4f(l.viewport, t.width, t.height, t.dpr, 0), m.uniform4f(l.color, o.color[0], o.color[1], o.color[2], o.color[3]);
89
+ let [u, d, f, p] = r(o, t);
90
+ m.uniform4f(l.params, u, d, f, p), m.bindVertexArray(c.vao), c.first !== e && (m.bindBuffer(m.ARRAY_BUFFER, c.buffer), x(o, e), c.first = e), m.drawArraysInstanced(m.TRIANGLE_STRIP, 0, 4, s);
91
+ }
92
+ m.bindVertexArray(null);
93
+ for (let [e, t] of y) i.has(e) || (S(t), y.delete(e));
69
94
  };
70
95
  return {
71
96
  kind: "webgl2",
72
- canvas: u,
97
+ canvas: d,
73
98
  resize(e, t) {
74
- u.width = Math.max(1, e), u.height = Math.max(1, t);
99
+ d.width = Math.max(1, e), d.height = Math.max(1, t);
75
100
  },
76
101
  render(e, t) {
77
- if (y || p.isContextLost()) return;
78
- p.viewport(0, 0, u.width, u.height), p.clearColor(0, 0, 0, 0), p.clear(p.COLOR_BUFFER_BIT), p.enable(p.BLEND), p.blendFunc(p.ONE, p.ONE_MINUS_SRC_ALPHA);
79
- let n = t.transform, a = /* @__PURE__ */ new Set();
80
- for (let o of e) {
81
- a.add(o.key);
82
- let [e, s] = i(o, t);
83
- if (s <= 0) continue;
84
- let c = w(o);
85
- if (!c) continue;
86
- let l = v[o.kind];
87
- p.useProgram(l.program), p.uniform4f(l.xform, n.xScale, n.xOffset, n.yScale, n.yOffset), p.uniform4f(l.viewport, t.width, t.height, t.dpr, 0), p.uniform4f(l.color, o.color[0], o.color[1], o.color[2], o.color[3]);
88
- let [u, d, f, m] = r(o, t);
89
- p.uniform4f(l.params, u, d, f, m), p.bindVertexArray(c.vao), c.first !== e && (p.bindBuffer(p.ARRAY_BUFFER, c.buffer), S(o, e), c.first = e), p.drawArraysInstanced(p.TRIANGLE_STRIP, 0, 4, s);
90
- }
91
- p.bindVertexArray(null);
92
- for (let [e, t] of x) a.has(e) || (C(t), x.delete(e));
102
+ v = {
103
+ items: e,
104
+ frame: t
105
+ }, !(_ || !b.use() || m.isContextLost()) && w(e, t);
93
106
  },
94
107
  destroy() {
95
- if (u.removeEventListener("webglcontextlost", b), !p.isContextLost()) {
96
- for (let e of x.values()) C(e);
97
- for (let e of Object.values(v)) p.deleteProgram(e.program);
108
+ if (b.release(), v = null, !m.isContextLost()) {
109
+ for (let e of y.values()) S(e);
110
+ for (let e of Object.values(g ?? {})) m.deleteProgram(e.program);
111
+ m.getExtension("WEBGL_lose_context")?.loseContext();
98
112
  }
99
- x.clear(), p.getExtension("WEBGL_lose_context")?.loseContext();
113
+ y.clear();
100
114
  }
101
115
  };
102
116
  };
103
117
  //#endregion
104
- export { u as createWebGl2Renderer };
118
+ export { d as createWebGl2Renderer };
105
119
 
106
120
  //# sourceMappingURL=webgl2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webgl2.js","names":["ATTRIBUTES","createWebGl2Renderer","gl","canvas","glContextAttributes","requireHardware","isSoftwareRenderer","line","compileProgram","GLSL_LINE","area","GLSL_AREA","bar","GLSL_BAR","scatter","GLSL_SCATTER","programs","lost","handleLost","event","onLost","resources","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","width","height","t","frame","seen","items","instances","instanceRange","program","p0","p1","p2","p3","itemParams","key","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n itemParams,\n} from \"./gl\";\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\", \"a_color\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", glContextAttributes(requireHardware));\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const line = compileProgram(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compileProgram(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compileProgram(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compileProgram(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n if (!line || !area || !bar || !scatter) return null;\n const programs = { line, area, bar, scatter };\n\n let lost = false;\n const handleLost = (event: Event) => {\n event.preventDefault();\n lost = true;\n onLost();\n };\n canvas.addEventListener(\"webglcontextlost\", handleLost);\n\n const resources = new Map<string, ItemResources>();\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, stride, first * stride);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, F, false, stride, (first + 1) * stride);\n gl.vertexAttribDivisor(1, 1);\n break;\n }\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, BAR_STRIDE, first * BAR_STRIDE);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(\n 1,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n BAR_STRIDE,\n first * BAR_STRIDE + 12,\n );\n gl.vertexAttribDivisor(1, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * AREA_STRIDE,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n if (lost || gl.isContextLost()) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = itemParams(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n },\n destroy() {\n canvas.removeEventListener(\"webglcontextlost\", handleLost);\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs)) gl.deleteProgram(p.program);\n }\n resources.clear();\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n },\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"webgl2.js","names":["ATTRIBUTES","createWebGl2Renderer","gl","canvas","glContextAttributes","requireHardware","isSoftwareRenderer","compile","line","compileProgram","GLSL_LINE","area","GLSL_AREA","bar","GLSL_BAR","scatter","GLSL_SCATTER","programs","lost","last","resources","slot","claimGlSlot","draw","onLost","setupAttributes","F","item","first","release","res","upload","existing","buffer","vao","t","frame","seen","items","instances","instanceRange","program","p0","p1","p2","p3","itemParams","key","width","height","p"],"sources":["../../../../../charts/src/engine/renderers/webgl2.ts"],"sourcesContent":["// WebGL2 backend: same instanced primitives as WebGPU, in GLSL ES 3.0.\n\nimport {\n compileProgram,\n glContextAttributes,\n isSoftwareRenderer,\n itemParams,\n type GlProgram,\n} from \"./gl\";\nimport { claimGlSlot } from \"./gl-budget\";\nimport { instanceRange } from \"./range\";\nimport { GLSL_AREA, GLSL_BAR, GLSL_LINE, GLSL_SCATTER } from \"./shaders\";\nimport {\n AREA_STRIDE,\n BAR_STRIDE,\n SCATTER_STRIDE,\n type ChartRenderer,\n type RenderFrame,\n type RenderItem,\n type RendererLostHandler,\n} from \"./types\";\n\ninterface ItemResources {\n version: number;\n kind: RenderItem[\"kind\"];\n buffer: WebGLBuffer;\n vao: WebGLVertexArrayObject;\n /** First instance the attribute pointers start at */\n first: number;\n}\n\nconst ATTRIBUTES: Record<RenderItem[\"kind\"], string[]> = {\n line: [\"a_a\", \"a_b\"],\n area: [\"a_a\", \"a_b\"],\n bar: [\"a_inst\", \"a_color\"],\n scatter: [\"a_pos\", \"a_size\", \"a_color\"],\n};\n\nexport const createWebGl2Renderer = (\n canvas: HTMLCanvasElement,\n onLost: RendererLostHandler,\n /** Refuses software rendering (SwiftShader, blocklisted GPUs): Canvas2D with decimation is faster there */\n requireHardware = false,\n): ChartRenderer | null => {\n const gl = canvas.getContext(\"webgl2\", glContextAttributes(requireHardware));\n if (!gl) return null;\n if (requireHardware && isSoftwareRenderer(gl)) {\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n return null;\n }\n\n const compile = (): Record<RenderItem[\"kind\"], GlProgram> | null => {\n const line = compileProgram(gl, GLSL_LINE, ATTRIBUTES.line);\n const area = compileProgram(gl, GLSL_AREA, ATTRIBUTES.area);\n const bar = compileProgram(gl, GLSL_BAR, ATTRIBUTES.bar);\n const scatter = compileProgram(gl, GLSL_SCATTER, ATTRIBUTES.scatter);\n return line && area && bar && scatter ? { line, area, bar, scatter } : null;\n };\n let programs = compile();\n if (!programs) return null;\n\n let lost = false;\n let last: { items: readonly RenderItem[]; frame: RenderFrame } | null = null;\n const resources = new Map<string, ItemResources>();\n // past the page-wide context budget, the context may be suspended while\n // off-screen: its GPU objects go, and come back with the context\n const slot = claimGlSlot(canvas, gl, {\n suspend: () => resources.clear(),\n restore: () => {\n programs = compile();\n if (!programs) {\n lost = true;\n onLost();\n } else if (last) draw(last.items, last.frame);\n },\n lost: () => {\n lost = true;\n onLost();\n },\n });\n\n /** WebGL2 has no base instance: the pointers start at the first instance */\n const setupAttributes = (item: RenderItem, first: number) => {\n const F = gl.FLOAT;\n switch (item.kind) {\n case \"line\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, 8, first * 8);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 2, F, false, 8, first * 8 + 8);\n gl.vertexAttribDivisor(1, 1);\n break;\n case \"area\": {\n const stride = AREA_STRIDE * 4;\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, stride, first * stride);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 3, F, false, stride, (first + 1) * stride);\n gl.vertexAttribDivisor(1, 1);\n break;\n }\n case \"bar\":\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 3, F, false, BAR_STRIDE, first * BAR_STRIDE);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(\n 1,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n BAR_STRIDE,\n first * BAR_STRIDE + 12,\n );\n gl.vertexAttribDivisor(1, 1);\n break;\n default:\n gl.enableVertexAttribArray(0);\n gl.vertexAttribPointer(0, 2, F, false, SCATTER_STRIDE, 0);\n gl.vertexAttribDivisor(0, 1);\n gl.enableVertexAttribArray(1);\n gl.vertexAttribPointer(1, 1, F, false, SCATTER_STRIDE, 8);\n gl.vertexAttribDivisor(1, 1);\n gl.enableVertexAttribArray(2);\n gl.vertexAttribPointer(\n 2,\n 4,\n gl.UNSIGNED_BYTE,\n true,\n SCATTER_STRIDE,\n 12,\n );\n gl.vertexAttribDivisor(2, 1);\n break;\n }\n };\n\n const release = (res: ItemResources) => {\n gl.deleteBuffer(res.buffer);\n gl.deleteVertexArray(res.vao);\n };\n\n const upload = (item: RenderItem): ItemResources | null => {\n const existing = resources.get(item.key);\n if (\n existing &&\n existing.version === item.version &&\n existing.kind === item.kind\n ) {\n return existing;\n }\n if (existing) release(existing);\n const buffer = gl.createBuffer();\n const vao = gl.createVertexArray();\n if (!buffer || !vao) return null;\n gl.bindVertexArray(vao);\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n switch (item.kind) {\n case \"line\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * 2,\n );\n break;\n case \"area\":\n gl.bufferData(\n gl.ARRAY_BUFFER,\n item.points,\n gl.STATIC_DRAW,\n 0,\n item.count * AREA_STRIDE,\n );\n break;\n default:\n gl.bufferData(gl.ARRAY_BUFFER, item.instances, gl.STATIC_DRAW);\n break;\n }\n setupAttributes(item, 0);\n gl.bindVertexArray(null);\n const res = {\n version: item.version,\n kind: item.kind,\n buffer,\n vao,\n first: 0,\n };\n resources.set(item.key, res);\n return res;\n };\n\n const draw = (items: readonly RenderItem[], frame: RenderFrame) => {\n if (!programs) return;\n gl.viewport(0, 0, canvas.width, canvas.height);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const t = frame.transform;\n const seen = new Set<string>();\n for (const item of items) {\n seen.add(item.key);\n const [first, instances] = instanceRange(item, frame);\n if (instances <= 0) continue;\n const res = upload(item);\n if (!res) continue;\n const program = programs[item.kind];\n gl.useProgram(program.program);\n gl.uniform4f(program.xform, t.xScale, t.xOffset, t.yScale, t.yOffset);\n gl.uniform4f(program.viewport, frame.width, frame.height, frame.dpr, 0);\n gl.uniform4f(\n program.color,\n item.color[0],\n item.color[1],\n item.color[2],\n item.color[3],\n );\n const [p0, p1, p2, p3] = itemParams(item, frame);\n gl.uniform4f(program.params, p0, p1, p2, p3);\n gl.bindVertexArray(res.vao);\n if (res.first !== first) {\n gl.bindBuffer(gl.ARRAY_BUFFER, res.buffer);\n setupAttributes(item, first);\n res.first = first;\n }\n gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, instances);\n }\n gl.bindVertexArray(null);\n for (const [key, res] of resources) {\n if (!seen.has(key)) {\n release(res);\n resources.delete(key);\n }\n }\n };\n\n return {\n kind: \"webgl2\",\n canvas,\n resize(width, height) {\n canvas.width = Math.max(1, width);\n canvas.height = Math.max(1, height);\n },\n render(items, frame) {\n last = { items, frame };\n if (lost || !slot.use() || gl.isContextLost()) return;\n draw(items, frame);\n },\n destroy() {\n slot.release();\n last = null;\n if (!gl.isContextLost()) {\n for (const res of resources.values()) release(res);\n for (const p of Object.values(programs ?? {})) {\n gl.deleteProgram(p.program);\n }\n gl.getExtension(\"WEBGL_lose_context\")?.loseContext();\n }\n resources.clear();\n },\n };\n};\n"],"mappings":"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"}