minerva-design 1.4.0 → 1.5.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 (670) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +21 -21
  3. package/custom-elements.json +4047 -1703
  4. package/dist/angular/fesm2022/minerva-angular.mjs +1436 -5
  5. package/dist/angular/fesm2022/minerva-angular.mjs.map +1 -1
  6. package/dist/angular/types/minerva-angular.d.ts +573 -4
  7. package/dist/charts/canvas.d.cts +2 -2
  8. package/dist/charts/canvas.d.ts +2 -2
  9. package/dist/charts/core.cjs +1 -1
  10. package/dist/charts/core.d.cts +6 -4
  11. package/dist/charts/core.d.ts +6 -4
  12. package/dist/charts/core.js +24 -16
  13. package/dist/charts/engine/axis.cjs +1 -1
  14. package/dist/charts/engine/axis.cjs.map +1 -1
  15. package/dist/charts/engine/axis.js +42 -19
  16. package/dist/charts/engine/axis.js.map +1 -1
  17. package/dist/charts/engine/canvas.cjs +1 -1
  18. package/dist/charts/engine/canvas.cjs.map +1 -1
  19. package/dist/charts/engine/canvas.js +154 -127
  20. package/dist/charts/engine/canvas.js.map +1 -1
  21. package/dist/charts/engine/chart.cjs +1 -1
  22. package/dist/charts/engine/chart.cjs.map +1 -1
  23. package/dist/charts/engine/chart.js +365 -251
  24. package/dist/charts/engine/chart.js.map +1 -1
  25. package/dist/charts/engine/color.cjs +1 -1
  26. package/dist/charts/engine/color.cjs.map +1 -1
  27. package/dist/charts/engine/color.d.cts +18 -0
  28. package/dist/charts/engine/color.d.ts +18 -0
  29. package/dist/charts/engine/color.js +48 -2
  30. package/dist/charts/engine/color.js.map +1 -1
  31. package/dist/charts/engine/controller.cjs +2 -2
  32. package/dist/charts/engine/controller.cjs.map +1 -1
  33. package/dist/charts/engine/controller.d.cts +32 -1
  34. package/dist/charts/engine/controller.d.ts +32 -1
  35. package/dist/charts/engine/controller.js +310 -263
  36. package/dist/charts/engine/controller.js.map +1 -1
  37. package/dist/charts/engine/data.cjs +1 -1
  38. package/dist/charts/engine/data.cjs.map +1 -1
  39. package/dist/charts/engine/data.d.cts +3 -1
  40. package/dist/charts/engine/data.d.ts +3 -1
  41. package/dist/charts/engine/data.js +6 -4
  42. package/dist/charts/engine/data.js.map +1 -1
  43. package/dist/charts/engine/defaults.cjs +2 -0
  44. package/dist/charts/engine/defaults.cjs.map +1 -0
  45. package/dist/charts/engine/defaults.d.cts +20 -0
  46. package/dist/charts/engine/defaults.d.ts +20 -0
  47. package/dist/charts/engine/defaults.js +35 -0
  48. package/dist/charts/engine/defaults.js.map +1 -0
  49. package/dist/charts/engine/format.cjs +1 -1
  50. package/dist/charts/engine/format.cjs.map +1 -1
  51. package/dist/charts/engine/format.d.cts +6 -0
  52. package/dist/charts/engine/format.d.ts +6 -0
  53. package/dist/charts/engine/format.js +15 -2
  54. package/dist/charts/engine/format.js.map +1 -1
  55. package/dist/charts/engine/graph/chart.cjs +2 -0
  56. package/dist/charts/engine/graph/chart.cjs.map +1 -0
  57. package/dist/charts/engine/graph/chart.d.cts +3 -0
  58. package/dist/charts/engine/graph/chart.d.ts +3 -0
  59. package/dist/charts/engine/graph/chart.js +1565 -0
  60. package/dist/charts/engine/graph/chart.js.map +1 -0
  61. package/dist/charts/engine/graph/circular.cjs +2 -0
  62. package/dist/charts/engine/graph/circular.cjs.map +1 -0
  63. package/dist/charts/engine/graph/circular.d.cts +16 -0
  64. package/dist/charts/engine/graph/circular.d.ts +16 -0
  65. package/dist/charts/engine/graph/circular.js +62 -0
  66. package/dist/charts/engine/graph/circular.js.map +1 -0
  67. package/dist/charts/engine/graph/dag.cjs +2 -0
  68. package/dist/charts/engine/graph/dag.cjs.map +1 -0
  69. package/dist/charts/engine/graph/dag.d.cts +34 -0
  70. package/dist/charts/engine/graph/dag.d.ts +34 -0
  71. package/dist/charts/engine/graph/dag.js +314 -0
  72. package/dist/charts/engine/graph/dag.js.map +1 -0
  73. package/dist/charts/engine/graph/dom.cjs +2 -0
  74. package/dist/charts/engine/graph/dom.cjs.map +1 -0
  75. package/dist/charts/engine/graph/dom.d.cts +23 -0
  76. package/dist/charts/engine/graph/dom.d.ts +23 -0
  77. package/dist/charts/engine/graph/dom.js +158 -0
  78. package/dist/charts/engine/graph/dom.js.map +1 -0
  79. package/dist/charts/engine/graph/force.cjs +2 -0
  80. package/dist/charts/engine/graph/force.cjs.map +1 -0
  81. package/dist/charts/engine/graph/force.d.cts +67 -0
  82. package/dist/charts/engine/graph/force.d.ts +67 -0
  83. package/dist/charts/engine/graph/force.js +325 -0
  84. package/dist/charts/engine/graph/force.js.map +1 -0
  85. package/dist/charts/engine/graph/geometry.cjs +2 -0
  86. package/dist/charts/engine/graph/geometry.cjs.map +1 -0
  87. package/dist/charts/engine/graph/geometry.d.cts +37 -0
  88. package/dist/charts/engine/graph/geometry.d.ts +37 -0
  89. package/dist/charts/engine/graph/geometry.js +144 -0
  90. package/dist/charts/engine/graph/geometry.js.map +1 -0
  91. package/dist/charts/engine/graph/index.cjs +1 -0
  92. package/dist/charts/engine/graph/index.d.cts +6 -0
  93. package/dist/charts/engine/graph/index.d.ts +6 -0
  94. package/dist/charts/engine/graph/index.js +6 -0
  95. package/dist/charts/engine/graph/labels.cjs +2 -0
  96. package/dist/charts/engine/graph/labels.cjs.map +1 -0
  97. package/dist/charts/engine/graph/labels.d.cts +12 -0
  98. package/dist/charts/engine/graph/labels.d.ts +12 -0
  99. package/dist/charts/engine/graph/labels.js +128 -0
  100. package/dist/charts/engine/graph/labels.js.map +1 -0
  101. package/dist/charts/engine/graph/model.cjs +2 -0
  102. package/dist/charts/engine/graph/model.cjs.map +1 -0
  103. package/dist/charts/engine/graph/model.d.cts +43 -0
  104. package/dist/charts/engine/graph/model.d.ts +43 -0
  105. package/dist/charts/engine/graph/model.js +88 -0
  106. package/dist/charts/engine/graph/model.js.map +1 -0
  107. package/dist/charts/engine/graph/sizing.cjs +2 -0
  108. package/dist/charts/engine/graph/sizing.cjs.map +1 -0
  109. package/dist/charts/engine/graph/sizing.d.cts +33 -0
  110. package/dist/charts/engine/graph/sizing.d.ts +33 -0
  111. package/dist/charts/engine/graph/sizing.js +60 -0
  112. package/dist/charts/engine/graph/sizing.js.map +1 -0
  113. package/dist/charts/engine/graph/tree.cjs +2 -0
  114. package/dist/charts/engine/graph/tree.cjs.map +1 -0
  115. package/dist/charts/engine/graph/tree.d.cts +30 -0
  116. package/dist/charts/engine/graph/tree.d.ts +30 -0
  117. package/dist/charts/engine/graph/tree.js +218 -0
  118. package/dist/charts/engine/graph/tree.js.map +1 -0
  119. package/dist/charts/engine/graph/types.d.cts +626 -0
  120. package/dist/charts/engine/graph/types.d.ts +626 -0
  121. package/dist/charts/engine/graph/worker.cjs +46 -0
  122. package/dist/charts/engine/graph/worker.cjs.map +1 -0
  123. package/dist/charts/engine/graph/worker.d.cts +36 -0
  124. package/dist/charts/engine/graph/worker.d.ts +36 -0
  125. package/dist/charts/engine/graph/worker.js +129 -0
  126. package/dist/charts/engine/graph/worker.js.map +1 -0
  127. package/dist/charts/engine/items.cjs +1 -1
  128. package/dist/charts/engine/items.cjs.map +1 -1
  129. package/dist/charts/engine/items.d.cts +15 -2
  130. package/dist/charts/engine/items.d.ts +15 -2
  131. package/dist/charts/engine/items.js +131 -112
  132. package/dist/charts/engine/items.js.map +1 -1
  133. package/dist/charts/engine/labels.cjs +1 -1
  134. package/dist/charts/engine/labels.cjs.map +1 -1
  135. package/dist/charts/engine/labels.js +28 -4
  136. package/dist/charts/engine/labels.js.map +1 -1
  137. package/dist/charts/engine/layout.cjs +1 -1
  138. package/dist/charts/engine/layout.cjs.map +1 -1
  139. package/dist/charts/engine/layout.d.cts +9 -0
  140. package/dist/charts/engine/layout.d.ts +9 -0
  141. package/dist/charts/engine/layout.js +11 -2
  142. package/dist/charts/engine/layout.js.map +1 -1
  143. package/dist/charts/engine/model.cjs +1 -1
  144. package/dist/charts/engine/model.cjs.map +1 -1
  145. package/dist/charts/engine/model.d.cts +40 -3
  146. package/dist/charts/engine/model.d.ts +40 -3
  147. package/dist/charts/engine/model.js +246 -165
  148. package/dist/charts/engine/model.js.map +1 -1
  149. package/dist/charts/engine/orderbook/format.cjs +1 -1
  150. package/dist/charts/engine/orderbook/format.cjs.map +1 -1
  151. package/dist/charts/engine/orderbook/format.d.cts +3 -2
  152. package/dist/charts/engine/orderbook/format.d.ts +3 -2
  153. package/dist/charts/engine/orderbook/format.js +5 -5
  154. package/dist/charts/engine/orderbook/format.js.map +1 -1
  155. package/dist/charts/engine/orderbook/heatmap.cjs +1 -1
  156. package/dist/charts/engine/orderbook/heatmap.cjs.map +1 -1
  157. package/dist/charts/engine/orderbook/heatmap.js +527 -408
  158. package/dist/charts/engine/orderbook/heatmap.js.map +1 -1
  159. package/dist/charts/engine/orderbook/layout.cjs +2 -0
  160. package/dist/charts/engine/orderbook/layout.cjs.map +1 -0
  161. package/dist/charts/engine/orderbook/layout.d.cts +37 -0
  162. package/dist/charts/engine/orderbook/layout.d.ts +37 -0
  163. package/dist/charts/engine/orderbook/layout.js +70 -0
  164. package/dist/charts/engine/orderbook/layout.js.map +1 -0
  165. package/dist/charts/engine/orderbook/tape.cjs +1 -1
  166. package/dist/charts/engine/orderbook/tape.cjs.map +1 -1
  167. package/dist/charts/engine/orderbook/tape.js +1 -1
  168. package/dist/charts/engine/orderbook/tape.js.map +1 -1
  169. package/dist/charts/engine/orderbook/types.d.cts +18 -2
  170. package/dist/charts/engine/orderbook/types.d.ts +18 -2
  171. package/dist/charts/engine/overlay.cjs +1 -1
  172. package/dist/charts/engine/overlay.cjs.map +1 -1
  173. package/dist/charts/engine/overlay.d.cts +10 -0
  174. package/dist/charts/engine/overlay.d.ts +10 -0
  175. package/dist/charts/engine/overlay.js +6 -0
  176. package/dist/charts/engine/overlay.js.map +1 -1
  177. package/dist/charts/engine/presets.cjs +2 -2
  178. package/dist/charts/engine/presets.cjs.map +1 -1
  179. package/dist/charts/engine/presets.d.cts +25 -3
  180. package/dist/charts/engine/presets.d.ts +25 -3
  181. package/dist/charts/engine/presets.js +115 -101
  182. package/dist/charts/engine/presets.js.map +1 -1
  183. package/dist/charts/engine/renderers/detect.cjs +1 -1
  184. package/dist/charts/engine/renderers/detect.cjs.map +1 -1
  185. package/dist/charts/engine/renderers/detect.d.cts +2 -1
  186. package/dist/charts/engine/renderers/detect.d.ts +2 -1
  187. package/dist/charts/engine/renderers/detect.js +23 -21
  188. package/dist/charts/engine/renderers/detect.js.map +1 -1
  189. package/dist/charts/engine/scene.cjs +1 -1
  190. package/dist/charts/engine/scene.cjs.map +1 -1
  191. package/dist/charts/engine/scene.d.cts +57 -4
  192. package/dist/charts/engine/scene.d.ts +57 -4
  193. package/dist/charts/engine/scene.js +335 -182
  194. package/dist/charts/engine/scene.js.map +1 -1
  195. package/dist/charts/engine/shapes/bullet.cjs +1 -1
  196. package/dist/charts/engine/shapes/bullet.cjs.map +1 -1
  197. package/dist/charts/engine/shapes/bullet.js +110 -110
  198. package/dist/charts/engine/shapes/bullet.js.map +1 -1
  199. package/dist/charts/engine/shapes/chart.cjs +1 -1
  200. package/dist/charts/engine/shapes/chart.cjs.map +1 -1
  201. package/dist/charts/engine/shapes/chart.js +4 -1
  202. package/dist/charts/engine/shapes/chart.js.map +1 -1
  203. package/dist/charts/engine/shapes/chord.cjs +2 -0
  204. package/dist/charts/engine/shapes/chord.cjs.map +1 -0
  205. package/dist/charts/engine/shapes/chord.d.cts +18 -0
  206. package/dist/charts/engine/shapes/chord.d.ts +18 -0
  207. package/dist/charts/engine/shapes/chord.js +414 -0
  208. package/dist/charts/engine/shapes/chord.js.map +1 -0
  209. package/dist/charts/engine/shapes/draw.cjs +1 -1
  210. package/dist/charts/engine/shapes/draw.cjs.map +1 -1
  211. package/dist/charts/engine/shapes/draw.d.cts +5 -1
  212. package/dist/charts/engine/shapes/draw.d.ts +5 -1
  213. package/dist/charts/engine/shapes/draw.js +47 -17
  214. package/dist/charts/engine/shapes/draw.js.map +1 -1
  215. package/dist/charts/engine/shapes/hit.cjs +1 -1
  216. package/dist/charts/engine/shapes/hit.cjs.map +1 -1
  217. package/dist/charts/engine/shapes/hit.d.cts +3 -1
  218. package/dist/charts/engine/shapes/hit.d.ts +3 -1
  219. package/dist/charts/engine/shapes/hit.js +75 -46
  220. package/dist/charts/engine/shapes/hit.js.map +1 -1
  221. package/dist/charts/engine/shapes/index.d.cts +3 -2
  222. package/dist/charts/engine/shapes/index.d.ts +3 -2
  223. package/dist/charts/engine/shapes/labels.cjs +1 -1
  224. package/dist/charts/engine/shapes/labels.cjs.map +1 -1
  225. package/dist/charts/engine/shapes/labels.js +12 -4
  226. package/dist/charts/engine/shapes/labels.js.map +1 -1
  227. package/dist/charts/engine/shapes/layout.cjs +2 -2
  228. package/dist/charts/engine/shapes/layout.cjs.map +1 -1
  229. package/dist/charts/engine/shapes/layout.d.cts +3 -1
  230. package/dist/charts/engine/shapes/layout.d.ts +3 -1
  231. package/dist/charts/engine/shapes/layout.js +106 -78
  232. package/dist/charts/engine/shapes/layout.js.map +1 -1
  233. package/dist/charts/engine/shapes/scene.cjs +1 -1
  234. package/dist/charts/engine/shapes/scene.cjs.map +1 -1
  235. package/dist/charts/engine/shapes/scene.d.cts +33 -3
  236. package/dist/charts/engine/shapes/scene.d.ts +33 -3
  237. package/dist/charts/engine/shapes/scene.js +62 -19
  238. package/dist/charts/engine/shapes/scene.js.map +1 -1
  239. package/dist/charts/engine/shapes/types.d.cts +119 -8
  240. package/dist/charts/engine/shapes/types.d.ts +119 -8
  241. package/dist/charts/engine/signature.cjs +1 -1
  242. package/dist/charts/engine/signature.cjs.map +1 -1
  243. package/dist/charts/engine/signature.js +1 -1
  244. package/dist/charts/engine/signature.js.map +1 -1
  245. package/dist/charts/engine/three-d/canvas2d.cjs +1 -1
  246. package/dist/charts/engine/three-d/canvas2d.cjs.map +1 -1
  247. package/dist/charts/engine/three-d/canvas2d.d.cts +5 -2
  248. package/dist/charts/engine/three-d/canvas2d.d.ts +5 -2
  249. package/dist/charts/engine/three-d/canvas2d.js +89 -65
  250. package/dist/charts/engine/three-d/canvas2d.js.map +1 -1
  251. package/dist/charts/engine/three-d/detect.cjs +1 -1
  252. package/dist/charts/engine/three-d/detect.cjs.map +1 -1
  253. package/dist/charts/engine/three-d/detect.d.cts +3 -2
  254. package/dist/charts/engine/three-d/detect.d.ts +3 -2
  255. package/dist/charts/engine/three-d/detect.js +22 -20
  256. package/dist/charts/engine/three-d/detect.js.map +1 -1
  257. package/dist/charts/engine/three-d/geometry.cjs +1 -1
  258. package/dist/charts/engine/three-d/geometry.cjs.map +1 -1
  259. package/dist/charts/engine/three-d/geometry.d.cts +6 -0
  260. package/dist/charts/engine/three-d/geometry.d.ts +6 -0
  261. package/dist/charts/engine/three-d/geometry.js +106 -90
  262. package/dist/charts/engine/three-d/geometry.js.map +1 -1
  263. package/dist/charts/engine/three-d/model.cjs +1 -1
  264. package/dist/charts/engine/three-d/model.cjs.map +1 -1
  265. package/dist/charts/engine/three-d/model.d.cts +2 -0
  266. package/dist/charts/engine/three-d/model.d.ts +2 -0
  267. package/dist/charts/engine/three-d/model.js +2 -0
  268. package/dist/charts/engine/three-d/model.js.map +1 -1
  269. package/dist/charts/engine/three-d/overlay.cjs +1 -1
  270. package/dist/charts/engine/three-d/overlay.cjs.map +1 -1
  271. package/dist/charts/engine/three-d/overlay.js +43 -36
  272. package/dist/charts/engine/three-d/overlay.js.map +1 -1
  273. package/dist/charts/engine/three-d/render-types.cjs +1 -1
  274. package/dist/charts/engine/three-d/render-types.cjs.map +1 -1
  275. package/dist/charts/engine/three-d/render-types.d.cts +24 -3
  276. package/dist/charts/engine/three-d/render-types.d.ts +24 -3
  277. package/dist/charts/engine/three-d/render-types.js +6 -7
  278. package/dist/charts/engine/three-d/render-types.js.map +1 -1
  279. package/dist/charts/engine/three-d/shaders.cjs +63 -28
  280. package/dist/charts/engine/three-d/shaders.cjs.map +1 -1
  281. package/dist/charts/engine/three-d/shaders.d.cts +2 -3
  282. package/dist/charts/engine/three-d/shaders.d.ts +2 -3
  283. package/dist/charts/engine/three-d/shaders.js +41 -22
  284. package/dist/charts/engine/three-d/shaders.js.map +1 -1
  285. package/dist/charts/engine/three-d/sort.cjs +1 -1
  286. package/dist/charts/engine/three-d/sort.cjs.map +1 -1
  287. package/dist/charts/engine/three-d/sort.d.cts +15 -4
  288. package/dist/charts/engine/three-d/sort.d.ts +15 -4
  289. package/dist/charts/engine/three-d/sort.js +117 -43
  290. package/dist/charts/engine/three-d/sort.js.map +1 -1
  291. package/dist/charts/engine/three-d/types.d.cts +27 -0
  292. package/dist/charts/engine/three-d/types.d.ts +27 -0
  293. package/dist/charts/engine/three-d/webgl.cjs +1 -1
  294. package/dist/charts/engine/three-d/webgl.cjs.map +1 -1
  295. package/dist/charts/engine/three-d/webgl.js +15 -13
  296. package/dist/charts/engine/three-d/webgl.js.map +1 -1
  297. package/dist/charts/engine/three-d/webgpu.cjs +1 -1
  298. package/dist/charts/engine/three-d/webgpu.cjs.map +1 -1
  299. package/dist/charts/engine/three-d/webgpu.js +50 -39
  300. package/dist/charts/engine/three-d/webgpu.js.map +1 -1
  301. package/dist/charts/engine/trading/chart.cjs +1 -1
  302. package/dist/charts/engine/trading/chart.cjs.map +1 -1
  303. package/dist/charts/engine/trading/chart.d.cts +10 -0
  304. package/dist/charts/engine/trading/chart.d.ts +10 -0
  305. package/dist/charts/engine/trading/chart.js +1475 -776
  306. package/dist/charts/engine/trading/chart.js.map +1 -1
  307. package/dist/charts/engine/trading/drawings.cjs +2 -1
  308. package/dist/charts/engine/trading/drawings.cjs.map +1 -1
  309. package/dist/charts/engine/trading/drawings.d.cts +47 -9
  310. package/dist/charts/engine/trading/drawings.d.ts +47 -9
  311. package/dist/charts/engine/trading/drawings.js +338 -75
  312. package/dist/charts/engine/trading/drawings.js.map +1 -1
  313. package/dist/charts/engine/trading/format.cjs +1 -1
  314. package/dist/charts/engine/trading/format.cjs.map +1 -1
  315. package/dist/charts/engine/trading/format.d.cts +13 -0
  316. package/dist/charts/engine/trading/format.d.ts +13 -0
  317. package/dist/charts/engine/trading/format.js +51 -19
  318. package/dist/charts/engine/trading/format.js.map +1 -1
  319. package/dist/charts/engine/trading/index.cjs +1 -1
  320. package/dist/charts/engine/trading/index.d.cts +2 -1
  321. package/dist/charts/engine/trading/index.d.ts +2 -1
  322. package/dist/charts/engine/trading/index.js +4 -3
  323. package/dist/charts/engine/trading/indicators.cjs +1 -1
  324. package/dist/charts/engine/trading/indicators.cjs.map +1 -1
  325. package/dist/charts/engine/trading/indicators.d.cts +180 -10
  326. package/dist/charts/engine/trading/indicators.d.ts +180 -10
  327. package/dist/charts/engine/trading/indicators.js +449 -173
  328. package/dist/charts/engine/trading/indicators.js.map +1 -1
  329. package/dist/charts/engine/trading/labels.cjs +1 -1
  330. package/dist/charts/engine/trading/labels.cjs.map +1 -1
  331. package/dist/charts/engine/trading/labels.js +84 -4
  332. package/dist/charts/engine/trading/labels.js.map +1 -1
  333. package/dist/charts/engine/trading/store.cjs +1 -1
  334. package/dist/charts/engine/trading/store.cjs.map +1 -1
  335. package/dist/charts/engine/trading/store.d.cts +21 -0
  336. package/dist/charts/engine/trading/store.d.ts +21 -0
  337. package/dist/charts/engine/trading/store.js +22 -1
  338. package/dist/charts/engine/trading/store.js.map +1 -1
  339. package/dist/charts/engine/trading/studies.cjs +1 -1
  340. package/dist/charts/engine/trading/studies.cjs.map +1 -1
  341. package/dist/charts/engine/trading/studies.d.cts +41 -8
  342. package/dist/charts/engine/trading/studies.d.ts +41 -8
  343. package/dist/charts/engine/trading/studies.js +349 -93
  344. package/dist/charts/engine/trading/studies.js.map +1 -1
  345. package/dist/charts/engine/trading/sync.cjs +2 -0
  346. package/dist/charts/engine/trading/sync.cjs.map +1 -0
  347. package/dist/charts/engine/trading/sync.d.cts +8 -0
  348. package/dist/charts/engine/trading/sync.d.ts +8 -0
  349. package/dist/charts/engine/trading/sync.js +25 -0
  350. package/dist/charts/engine/trading/sync.js.map +1 -0
  351. package/dist/charts/engine/trading/types.d.cts +484 -9
  352. package/dist/charts/engine/trading/types.d.ts +484 -9
  353. package/dist/charts/engine/types.d.cts +82 -8
  354. package/dist/charts/engine/types.d.ts +82 -8
  355. package/dist/charts/index.cjs +1 -1
  356. package/dist/charts/index.d.cts +3 -2
  357. package/dist/charts/index.d.ts +3 -2
  358. package/dist/charts/index.js +30 -22
  359. package/dist/charts/react/charts.cjs +1 -1
  360. package/dist/charts/react/charts.cjs.map +1 -1
  361. package/dist/charts/react/charts.js +46 -34
  362. package/dist/charts/react/charts.js.map +1 -1
  363. package/dist/charts/react/graph.cjs +2 -0
  364. package/dist/charts/react/graph.cjs.map +1 -0
  365. package/dist/charts/react/graph.d.cts +213 -0
  366. package/dist/charts/react/graph.d.ts +213 -0
  367. package/dist/charts/react/graph.js +159 -0
  368. package/dist/charts/react/graph.js.map +1 -0
  369. package/dist/charts/react/shapes.cjs +1 -1
  370. package/dist/charts/react/shapes.cjs.map +1 -1
  371. package/dist/charts/react/shapes.d.cts +87 -4
  372. package/dist/charts/react/shapes.d.ts +87 -4
  373. package/dist/charts/react/shapes.js +55 -12
  374. package/dist/charts/react/shapes.js.map +1 -1
  375. package/dist/charts/react/trading.cjs +1 -1
  376. package/dist/charts/react/trading.cjs.map +1 -1
  377. package/dist/charts/react/trading.d.cts +53 -1
  378. package/dist/charts/react/trading.d.ts +53 -1
  379. package/dist/charts/react/trading.js +68 -37
  380. package/dist/charts/react/trading.js.map +1 -1
  381. package/dist/charts/react/types.d.cts +11 -0
  382. package/dist/charts/react/types.d.ts +11 -0
  383. package/dist/core/contracts.cjs +1 -1
  384. package/dist/core/contracts.cjs.map +1 -1
  385. package/dist/core/contracts.js +1 -1
  386. package/dist/core/contracts.js.map +1 -1
  387. package/dist/native/charts/src/canvas.cjs +1 -1
  388. package/dist/native/charts/src/canvas.js +3 -3
  389. package/dist/native/charts/src/engine/axis.cjs +1 -1
  390. package/dist/native/charts/src/engine/axis.cjs.map +1 -1
  391. package/dist/native/charts/src/engine/axis.js +42 -19
  392. package/dist/native/charts/src/engine/axis.js.map +1 -1
  393. package/dist/native/charts/src/engine/color.cjs +1 -1
  394. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  395. package/dist/native/charts/src/engine/color.js +47 -5
  396. package/dist/native/charts/src/engine/color.js.map +1 -1
  397. package/dist/native/charts/src/engine/controller.cjs +2 -2
  398. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  399. package/dist/native/charts/src/engine/controller.js +300 -253
  400. package/dist/native/charts/src/engine/controller.js.map +1 -1
  401. package/dist/native/charts/src/engine/data.cjs +1 -1
  402. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  403. package/dist/native/charts/src/engine/data.js +6 -4
  404. package/dist/native/charts/src/engine/data.js.map +1 -1
  405. package/dist/native/charts/src/engine/format.cjs +1 -1
  406. package/dist/native/charts/src/engine/format.cjs.map +1 -1
  407. package/dist/native/charts/src/engine/format.js +15 -2
  408. package/dist/native/charts/src/engine/format.js.map +1 -1
  409. package/dist/native/charts/src/engine/labels.cjs +1 -1
  410. package/dist/native/charts/src/engine/labels.cjs.map +1 -1
  411. package/dist/native/charts/src/engine/labels.js +28 -4
  412. package/dist/native/charts/src/engine/labels.js.map +1 -1
  413. package/dist/native/charts/src/engine/layout.cjs +1 -1
  414. package/dist/native/charts/src/engine/layout.cjs.map +1 -1
  415. package/dist/native/charts/src/engine/layout.js +11 -2
  416. package/dist/native/charts/src/engine/layout.js.map +1 -1
  417. package/dist/native/charts/src/engine/model.cjs +1 -1
  418. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  419. package/dist/native/charts/src/engine/model.js +252 -171
  420. package/dist/native/charts/src/engine/model.js.map +1 -1
  421. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  422. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  423. package/dist/native/charts/src/engine/presets.cjs +2 -2
  424. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  425. package/dist/native/charts/src/engine/presets.js +104 -90
  426. package/dist/native/charts/src/engine/presets.js.map +1 -1
  427. package/dist/native/charts/src/engine/scene.cjs +1 -1
  428. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  429. package/dist/native/charts/src/engine/scene.js +341 -188
  430. package/dist/native/charts/src/engine/scene.js.map +1 -1
  431. package/dist/native/charts/src/engine/shapes/bullet.cjs +1 -1
  432. package/dist/native/charts/src/engine/shapes/bullet.cjs.map +1 -1
  433. package/dist/native/charts/src/engine/shapes/bullet.js +110 -110
  434. package/dist/native/charts/src/engine/shapes/bullet.js.map +1 -1
  435. package/dist/native/charts/src/engine/shapes/calendar.cjs +1 -1
  436. package/dist/native/charts/src/engine/shapes/calendar.cjs.map +1 -1
  437. package/dist/native/charts/src/engine/shapes/calendar.js +21 -16
  438. package/dist/native/charts/src/engine/shapes/calendar.js.map +1 -1
  439. package/dist/native/charts/src/engine/shapes/chord.cjs +2 -0
  440. package/dist/native/charts/src/engine/shapes/chord.cjs.map +1 -0
  441. package/dist/native/charts/src/engine/shapes/chord.js +414 -0
  442. package/dist/native/charts/src/engine/shapes/chord.js.map +1 -0
  443. package/dist/native/charts/src/engine/shapes/draw.cjs +1 -1
  444. package/dist/native/charts/src/engine/shapes/draw.cjs.map +1 -1
  445. package/dist/native/charts/src/engine/shapes/draw.js +47 -17
  446. package/dist/native/charts/src/engine/shapes/draw.js.map +1 -1
  447. package/dist/native/charts/src/engine/shapes/hit.cjs +1 -1
  448. package/dist/native/charts/src/engine/shapes/hit.cjs.map +1 -1
  449. package/dist/native/charts/src/engine/shapes/hit.js +73 -44
  450. package/dist/native/charts/src/engine/shapes/hit.js.map +1 -1
  451. package/dist/native/charts/src/engine/shapes/labels.cjs +1 -1
  452. package/dist/native/charts/src/engine/shapes/labels.cjs.map +1 -1
  453. package/dist/native/charts/src/engine/shapes/labels.js +12 -4
  454. package/dist/native/charts/src/engine/shapes/labels.js.map +1 -1
  455. package/dist/native/charts/src/engine/shapes/layout.cjs +2 -2
  456. package/dist/native/charts/src/engine/shapes/layout.cjs.map +1 -1
  457. package/dist/native/charts/src/engine/shapes/layout.js +117 -90
  458. package/dist/native/charts/src/engine/shapes/layout.js.map +1 -1
  459. package/dist/native/charts/src/engine/shapes/scene.cjs +1 -1
  460. package/dist/native/charts/src/engine/shapes/scene.cjs.map +1 -1
  461. package/dist/native/charts/src/engine/shapes/scene.js +62 -19
  462. package/dist/native/charts/src/engine/shapes/scene.js.map +1 -1
  463. package/dist/native/components/Chart/scene.cjs +1 -1
  464. package/dist/native/components/Chart/scene.cjs.map +1 -1
  465. package/dist/native/components/Chart/scene.js +140 -71
  466. package/dist/native/components/Chart/scene.js.map +1 -1
  467. package/dist/native/components/Charts/charts.cjs +1 -1
  468. package/dist/native/components/Charts/charts.cjs.map +1 -1
  469. package/dist/native/components/Charts/charts.js +54 -42
  470. package/dist/native/components/Charts/charts.js.map +1 -1
  471. package/dist/native/components/Charts/types.d.cts +11 -0
  472. package/dist/native/components/Charts/types.d.ts +11 -0
  473. package/dist/native/components/ShapeChart/ShapeChartBase.cjs +1 -1
  474. package/dist/native/components/ShapeChart/ShapeChartBase.cjs.map +1 -1
  475. package/dist/native/components/ShapeChart/ShapeChartBase.js +1 -0
  476. package/dist/native/components/ShapeChart/ShapeChartBase.js.map +1 -1
  477. package/dist/native/components/ShapeChart/charts.cjs +1 -1
  478. package/dist/native/components/ShapeChart/charts.cjs.map +1 -1
  479. package/dist/native/components/ShapeChart/charts.d.cts +6 -1
  480. package/dist/native/components/ShapeChart/charts.d.ts +6 -1
  481. package/dist/native/components/ShapeChart/charts.js +138 -96
  482. package/dist/native/components/ShapeChart/charts.js.map +1 -1
  483. package/dist/native/components/ShapeChart/draw.cjs +1 -1
  484. package/dist/native/components/ShapeChart/draw.cjs.map +1 -1
  485. package/dist/native/components/ShapeChart/draw.d.cts +1 -1
  486. package/dist/native/components/ShapeChart/draw.d.ts +1 -1
  487. package/dist/native/components/ShapeChart/draw.js +26 -17
  488. package/dist/native/components/ShapeChart/draw.js.map +1 -1
  489. package/dist/native/components/ShapeChart/geometry.cjs +1 -1
  490. package/dist/native/components/ShapeChart/geometry.cjs.map +1 -1
  491. package/dist/native/components/ShapeChart/geometry.js +138 -59
  492. package/dist/native/components/ShapeChart/geometry.js.map +1 -1
  493. package/dist/native/components/ShapeChart/index.cjs +1 -1
  494. package/dist/native/components/ShapeChart/index.d.cts +1 -1
  495. package/dist/native/components/ShapeChart/index.d.ts +1 -1
  496. package/dist/native/components/ShapeChart/index.js +2 -2
  497. package/dist/native/components/ShapeChart/recorder.cjs +1 -1
  498. package/dist/native/components/ShapeChart/recorder.cjs.map +1 -1
  499. package/dist/native/components/ShapeChart/recorder.d.cts +10 -1
  500. package/dist/native/components/ShapeChart/recorder.d.ts +10 -1
  501. package/dist/native/components/ShapeChart/recorder.js +19 -10
  502. package/dist/native/components/ShapeChart/recorder.js.map +1 -1
  503. package/dist/native/components/ShapeChart/types.d.cts +92 -7
  504. package/dist/native/components/ShapeChart/types.d.ts +92 -7
  505. package/dist/native/index.cjs +1 -1
  506. package/dist/native/index.js +2 -2
  507. package/dist/native/source/components/Chart/scene.tsx +158 -14
  508. package/dist/native/source/components/Charts/charts.tsx +30 -2
  509. package/dist/native/source/components/Charts/types.ts +11 -0
  510. package/dist/native/source/components/ShapeChart/ShapeChartBase.tsx +2 -0
  511. package/dist/native/source/components/ShapeChart/charts.tsx +91 -35
  512. package/dist/native/source/components/ShapeChart/draw.tsx +39 -8
  513. package/dist/native/source/components/ShapeChart/geometry.ts +189 -8
  514. package/dist/native/source/components/ShapeChart/index.ts +1 -0
  515. package/dist/native/source/components/ShapeChart/recorder.ts +20 -5
  516. package/dist/native/source/components/ShapeChart/types.ts +96 -5
  517. package/dist/native/source/manifest.ts +1 -0
  518. package/dist/taro/charts.d.ts +25 -5
  519. package/dist/taro/index.js +3900 -2836
  520. package/dist/taro/shape-charts.d.ts +96 -4
  521. package/dist/uni/AreaChart.vue.d.ts +5 -1
  522. package/dist/uni/Badge.vue.d.ts +1 -1
  523. package/dist/uni/BarChart.vue.d.ts +5 -1
  524. package/dist/uni/BoxPlotChart.vue.d.ts +8 -0
  525. package/dist/uni/BubbleChart.vue.d.ts +4 -0
  526. package/dist/uni/BulletChart.vue.d.ts +4 -0
  527. package/dist/uni/CalendarHeatmap.vue.d.ts +2 -0
  528. package/dist/uni/CandlestickChart.vue.d.ts +4 -0
  529. package/dist/uni/Chart.vue.d.ts +4 -0
  530. package/dist/uni/ChordChart.vue +93 -0
  531. package/dist/uni/ChordChart.vue.d.ts +136 -0
  532. package/dist/uni/DonutChart.vue.d.ts +4 -0
  533. package/dist/uni/FunnelChart.vue.d.ts +4 -0
  534. package/dist/uni/GanttChart.vue.d.ts +4 -0
  535. package/dist/uni/GaugeChart.vue.d.ts +4 -0
  536. package/dist/uni/HeatmapChart.vue.d.ts +8 -2
  537. package/dist/uni/HistogramChart.vue.d.ts +4 -0
  538. package/dist/uni/HorizontalBarChart.vue.d.ts +3 -1
  539. package/dist/uni/LineChart.vue.d.ts +4 -0
  540. package/dist/uni/MixedChart.vue.d.ts +4 -0
  541. package/dist/uni/PieChart.vue.d.ts +4 -0
  542. package/dist/uni/QuadrantChart.vue.d.ts +4 -0
  543. package/dist/uni/RadarChart.vue.d.ts +4 -0
  544. package/dist/uni/RadialBarChart.vue.d.ts +4 -0
  545. package/dist/uni/RangeAreaChart.vue.d.ts +4 -0
  546. package/dist/uni/SankeyChart.vue.d.ts +4 -0
  547. package/dist/uni/ScatterChart.vue.d.ts +4 -0
  548. package/dist/uni/Sparkline.vue.d.ts +4 -0
  549. package/dist/uni/SunburstChart.vue.d.ts +4 -0
  550. package/dist/uni/ToastProvider.vue.d.ts +1 -1
  551. package/dist/uni/TreemapChart.vue.d.ts +4 -0
  552. package/dist/uni/WaterfallChart.vue.d.ts +9 -0
  553. package/dist/uni/chart-canvas.d.ts +3 -0
  554. package/dist/uni/chart-canvas.js +4 -0
  555. package/dist/uni/chart-types.d.ts +28 -4
  556. package/dist/uni/chart-types.js +26 -2
  557. package/dist/uni/charts-canvas.js +1 -1
  558. package/dist/uni/index.d.ts +2 -1
  559. package/dist/uni/index.js +1 -0
  560. package/dist/uni/manifest.d.ts +7 -0
  561. package/dist/uni/manifest.js +10 -0
  562. package/dist/uni/named-chart-options.d.ts +9 -2
  563. package/dist/uni/named-chart-options.js +18 -1
  564. package/dist/uni/shape-chart-canvas.d.ts +3 -1
  565. package/dist/uni/shape-chart-canvas.js +15 -24
  566. package/dist/uni/shape-chart-types.d.ts +52 -2
  567. package/dist/uni/shape-chart-types.js +44 -0
  568. package/dist/vue/charts-global.d.ts +48 -0
  569. package/dist/vue/charts.d.ts +18 -0
  570. package/dist/vue/charts.js +56 -0
  571. package/dist/vue/charts.js.map +1 -0
  572. package/dist/vue/components/Chart/BoxPlotChart.vue.d.ts +8 -0
  573. package/dist/vue/components/Chart/BoxPlotChart.vue.js.map +1 -1
  574. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js +8 -2
  575. package/dist/vue/components/Chart/BoxPlotChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  576. package/dist/vue/components/Chart/ChordChart.vue.d.ts +153 -0
  577. package/dist/vue/components/Chart/ChordChart.vue.js +7 -0
  578. package/dist/vue/components/Chart/ChordChart.vue.js.map +1 -0
  579. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js +81 -0
  580. package/dist/vue/components/Chart/ChordChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  581. package/dist/vue/components/Chart/DependencyGraph.vue.d.ts +179 -0
  582. package/dist/vue/components/Chart/DependencyGraph.vue.js +7 -0
  583. package/dist/vue/components/Chart/DependencyGraph.vue.js.map +1 -0
  584. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js +65 -0
  585. package/dist/vue/components/Chart/DependencyGraph.vue_vue_type_script_setup_true_lang.js.map +1 -0
  586. package/dist/vue/components/Chart/GanttChart.vue.d.ts +4 -0
  587. package/dist/vue/components/Chart/GanttChart.vue.js.map +1 -1
  588. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js +4 -1
  589. package/dist/vue/components/Chart/GanttChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  590. package/dist/vue/components/Chart/GraphChart.vue.d.ts +184 -0
  591. package/dist/vue/components/Chart/GraphChart.vue.js +7 -0
  592. package/dist/vue/components/Chart/GraphChart.vue.js.map +1 -0
  593. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js +62 -0
  594. package/dist/vue/components/Chart/GraphChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  595. package/dist/vue/components/Chart/HeatmapChart.vue.d.ts +9 -5
  596. package/dist/vue/components/Chart/HeatmapChart.vue.js.map +1 -1
  597. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js +3 -1
  598. package/dist/vue/components/Chart/HeatmapChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  599. package/dist/vue/components/Chart/OrderBookHeatmap.vue.d.ts +2 -0
  600. package/dist/vue/components/Chart/TimeAndSales.vue.d.ts +2 -0
  601. package/dist/vue/components/Chart/TradingChart.vue.d.ts +49 -1
  602. package/dist/vue/components/Chart/TradingChart.vue.js.map +1 -1
  603. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js +31 -0
  604. package/dist/vue/components/Chart/TradingChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  605. package/dist/vue/components/Chart/TreeChart.vue.d.ts +172 -0
  606. package/dist/vue/components/Chart/TreeChart.vue.js +7 -0
  607. package/dist/vue/components/Chart/TreeChart.vue.js.map +1 -0
  608. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js +56 -0
  609. package/dist/vue/components/Chart/TreeChart.vue_vue_type_script_setup_true_lang.js.map +1 -0
  610. package/dist/vue/components/Chart/WaterfallChart.vue.d.ts +12 -1
  611. package/dist/vue/components/Chart/WaterfallChart.vue.js.map +1 -1
  612. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js +8 -2
  613. package/dist/vue/components/Chart/WaterfallChart.vue_vue_type_script_setup_true_lang.js.map +1 -1
  614. package/dist/vue/components/Chart/graph.d.ts +153 -0
  615. package/dist/vue/components/Chart/graph.js +135 -0
  616. package/dist/vue/components/Chart/graph.js.map +1 -0
  617. package/dist/vue/components/Chart/index.d.ts +5 -1
  618. package/dist/vue/components/Chart/index.js +5 -1
  619. package/dist/vue/components/Chart/orderbook.d.ts +5 -1
  620. package/dist/vue/components/Chart/orderbook.js +2 -0
  621. package/dist/vue/components/Chart/orderbook.js.map +1 -1
  622. package/dist/vue/components/Chart/trading.d.ts +24 -2
  623. package/dist/vue/components/Chart/trading.js +8 -0
  624. package/dist/vue/components/Chart/trading.js.map +1 -1
  625. package/dist/vue/components/Chart/types.d.ts +74 -2
  626. package/dist/vue/global.d.ts +2 -38
  627. package/dist/vue/groups/charts.js +10 -2
  628. package/dist/vue/groups/charts.js.map +1 -1
  629. package/dist/vue/index.js +6 -2
  630. package/dist/vue/internal/register.d.ts +7 -0
  631. package/dist/vue/internal/register.js +14 -0
  632. package/dist/vue/internal/register.js.map +1 -0
  633. package/dist/vue/plugin.d.ts +9 -4
  634. package/dist/vue/plugin.js +6 -11
  635. package/dist/vue/plugin.js.map +1 -1
  636. package/dist/weapp/charts/canvas.js +1687 -147
  637. package/dist/weapp/charts/core.js +1 -0
  638. package/dist/weapp/chord-chart/index.js +1 -0
  639. package/dist/weapp/chord-chart/index.json +1 -0
  640. package/dist/weapp/chord-chart/index.wxml +1 -0
  641. package/dist/weapp/chord-chart/index.wxss +1 -0
  642. package/dist/weapp/controls.js +92 -32
  643. package/dist/weapp/types.d.ts +87 -4
  644. package/dist/web-components/components/chart/charts.d.ts +4 -2
  645. package/dist/web-components/components/chart/charts.js +8 -1
  646. package/dist/web-components/components/chart/charts.js.map +1 -1
  647. package/dist/web-components/components/chart/extended.d.ts +17 -7
  648. package/dist/web-components/components/chart/extended.js +23 -9
  649. package/dist/web-components/components/chart/extended.js.map +1 -1
  650. package/dist/web-components/components/chart/shapes-extended.d.ts +37 -1
  651. package/dist/web-components/components/chart/shapes-extended.js +27 -1
  652. package/dist/web-components/components/chart/shapes-extended.js.map +1 -1
  653. package/dist/web-components/components/graph/graph.d.ts +154 -0
  654. package/dist/web-components/components/graph/graph.js +149 -0
  655. package/dist/web-components/components/graph/graph.js.map +1 -0
  656. package/dist/web-components/components/trading-chart/trading-chart.d.ts +49 -2
  657. package/dist/web-components/components/trading-chart/trading-chart.js +62 -0
  658. package/dist/web-components/components/trading-chart/trading-chart.js.map +1 -1
  659. package/dist/web-components/elements/chart.d.ts +1 -1
  660. package/dist/web-components/elements/chart.js +6 -5
  661. package/dist/web-components/elements/chart.js.map +1 -1
  662. package/dist/web-components/elements/graph.d.ts +2 -0
  663. package/dist/web-components/elements/graph.js +12 -0
  664. package/dist/web-components/elements/graph.js.map +1 -0
  665. package/dist/web-components/html-custom-data.json +273 -4
  666. package/dist/web-components/types/react.d.ts +63 -4
  667. package/dist/web-components/types/solid.d.ts +55 -8
  668. package/dist/web-components/types/svelte.d.ts +55 -8
  669. package/dist/web-components/types/vue.d.ts +55 -4
  670. package/package.json +16 -1
@@ -1,7 +1,8 @@
1
+ import { writesDepth as e } from "./render-types.js";
1
2
  //#region src/engine/three-d/shaders.ts
2
- var e = (e, t, n, r, i, a, o, s) => (e.set(t, 0), e.set(n, 16), e.set(r, 20), e.set(i, 24), e.set(a, 28), e.set(o, 32), e.set(s, 36), e), t = (t, n, r) => {
3
- let i = t.kind === "points" ? +!!t.perspective : t.kind === "lines" ? t.width : 0;
4
- return e(r, n.viewProj, [
3
+ var t = (e, t, n, r, i, a, o, s) => (e.set(t, 0), e.set(n, 16), e.set(r, 20), e.set(i, 24), e.set(a, 28), e.set(o, 32), e.set(s, 36), e), n = (e, n, r) => {
4
+ let i = e.kind === "points" ? +!!e.perspective : e.kind === "lines" ? e.width : 0;
5
+ return t(r, n.viewProj, [
5
6
  n.width,
6
7
  n.height,
7
8
  n.dpr,
@@ -10,14 +11,14 @@ var e = (e, t, n, r, i, a, o, s) => (e.set(t, 0), e.set(n, 16), e.set(r, 20), e.
10
11
  n.eye[0],
11
12
  n.eye[1],
12
13
  n.eye[2],
13
- t.kind === "lines" ? t.bias : 0
14
+ e.kind === "lines" ? e.bias : e.kind === "points" ? e.style ?? 0 : 0
14
15
  ], [
15
16
  n.light[0],
16
17
  n.light[1],
17
18
  n.light[2],
18
- 0
19
+ e.kind === "points" && e.additive ? 1 : 0
19
20
  ], n.lighting, [
20
- t.opacity,
21
+ e.opacity,
21
22
  i,
22
23
  n.distance,
23
24
  n.radius
@@ -27,13 +28,14 @@ var e = (e, t, n, r, i, a, o, s) => (e.set(t, 0), e.set(n, 16), e.set(r, 20), e.
27
28
  n.fog[2],
28
29
  1
29
30
  ]);
30
- }, n = (e) => e.opacity >= 1, r = "\nstruct U {\n viewProj: mat4x4f,\n viewport: vec4f,\n eye: vec4f,\n light: vec4f,\n material: vec4f,\n params: vec4f,\n fog: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn toWebGpuDepth(p: vec4f) -> vec4f {\n return vec4f(p.x, p.y, (p.z + p.w) * 0.5, p.w);\n}\n\nfn depthCue(world: vec3f) -> f32 {\n let near = u.params.z - u.params.w;\n return clamp((length(world - u.eye.xyz) - near) / (2.0 * u.params.w), 0.0, 1.0);\n}\n", i = `${r}
31
+ }, r = "\nstruct U {\n viewProj: mat4x4f,\n viewport: vec4f,\n eye: vec4f,\n light: vec4f,\n material: vec4f,\n params: vec4f,\n fog: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn toWebGpuDepth(p: vec4f) -> vec4f {\n return vec4f(p.x, p.y, (p.z + p.w) * 0.5, p.w);\n}\n\nfn depthCue(world: vec3f) -> f32 {\n let near = u.params.z - u.params.w;\n return clamp((length(world - u.eye.xyz) - near) / (2.0 * u.params.w), 0.0, 1.0);\n}\n", i = `${r}
31
32
  struct Out {
32
33
  @builtin(position) position: vec4f,
33
34
  @location(0) offset: vec2f,
34
35
  @location(1) radius: f32,
35
36
  @location(2) color: vec4f,
36
37
  @location(3) fog: f32,
38
+ @location(4) coverage: f32,
37
39
  };
38
40
 
39
41
  @vertex
@@ -50,31 +52,48 @@ fn vs(
50
52
  if (u.params.y > 0.5 && u.viewport.w < 0.5) {
51
53
  factor = clamp(u.params.z / max(clip.w, 1e-6), 0.5, 2.0);
52
54
  }
53
- let radius = max(0.5, size * u.viewport.z * factor * 0.5);
54
- let reach = radius + 1.0;
55
+ let glow = u.eye.w > 1.5;
56
+ let raw = max(size, 0.0) * u.viewport.z * factor * 0.5;
57
+ let radius = max(raw, select(0.5, 0.75, glow));
58
+ let reach = select(radius + 1.0, radius * 2.2 + 1.0, glow);
55
59
  let shift = corner * reach * 2.0 / u.viewport.xy * clip.w;
56
60
  out.position = toWebGpuDepth(vec4f(clip.xy + shift, clip.z, clip.w));
57
61
  out.offset = corner * reach;
58
62
  out.radius = radius;
59
63
  out.color = color;
60
64
  out.fog = depthCue(pos) * 0.45;
65
+ out.coverage = min(1.0, raw * raw / (radius * radius));
61
66
  return out;
62
67
  }
63
68
 
64
69
  @fragment
65
70
  fn fs(in: Out) -> @location(0) vec4f {
66
71
  let d = length(in.offset);
67
- var alpha = clamp(in.radius + 0.5 - d, 0.0, 1.0);
68
- if (alpha <= 0.0) { discard; }
69
- let q = min(d / in.radius, 1.0);
70
- let n = vec3f(in.offset.x / in.radius, in.offset.y / in.radius, sqrt(max(0.0, 1.0 - q * q)));
71
- let l = normalize(vec3f(-0.45, 0.55, 0.7));
72
- let lambert = max(dot(n, l), 0.0);
73
- let shaded = in.color.rgb * (0.62 + 0.45 * lambert) + vec3f(pow(lambert, 18.0) * 0.28);
74
- let sphere = smoothstep(1.5, 3.5, in.radius);
75
- var rgb = mix(in.color.rgb, shaded, sphere);
76
- rgb = mix(rgb, u.fog.rgb, in.fog);
77
- alpha = alpha * in.color.a * u.params.x;
72
+ let r = in.radius;
73
+ var alpha = clamp(r + 0.5 - d, 0.0, 1.0);
74
+ var rgb = in.color.rgb;
75
+ if (u.eye.w > 1.5) {
76
+ // glow: an anti-aliased core and a gaussian halo
77
+ let core = clamp(r * 0.6 + 0.5 - d, 0.0, 1.0);
78
+ let q = d / r;
79
+ alpha = core + (1.0 - core) * exp(-1.2 * q * q);
80
+ rgb = rgb + (vec3f(1.0) - rgb) * (0.2 * core);
81
+ } else if (u.eye.w < 0.5) {
82
+ let q = min(d / r, 1.0);
83
+ let n = vec3f(in.offset.x / r, in.offset.y / r, sqrt(max(0.0, 1.0 - q * q)));
84
+ let l = normalize(vec3f(-0.45, 0.55, 0.7));
85
+ let lambert = max(dot(n, l), 0.0);
86
+ let shaded = rgb * (0.62 + 0.45 * lambert) + vec3f(pow(lambert, 18.0) * 0.28);
87
+ rgb = mix(rgb, shaded, smoothstep(1.5, 3.5, r));
88
+ }
89
+ if (alpha <= 0.004) { discard; }
90
+ if (u.light.w > 0.5) {
91
+ // additive light fades with the distance
92
+ alpha = alpha * (1.0 - in.fog);
93
+ } else {
94
+ rgb = mix(rgb, u.fog.rgb, in.fog);
95
+ }
96
+ alpha = alpha * in.coverage * in.color.a * u.params.x;
78
97
  return vec4f(rgb * alpha, alpha);
79
98
  }
80
99
  `, a = `${r}
@@ -156,7 +175,7 @@ fn fs(in: Out) -> @location(0) vec4f {
156
175
  if (alpha <= 0.0) { discard; }
157
176
  return vec4f(in.color.rgb * alpha, alpha);
158
177
  }
159
- `, s = "\nuniform mat4 u_viewProj;\nuniform vec4 u_viewport;\nuniform vec4 u_eye;\nuniform vec4 u_light;\nuniform vec4 u_material;\nuniform vec4 u_params;\nuniform vec4 u_fog;\n", c = "\nattribute vec2 a_corner;\nattribute vec3 a_pos;\nattribute float a_size;\nattribute vec4 a_color;\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvoid main() {\n vec2 corner = a_corner * 2.0 - 1.0;\n vec4 clip = u_viewProj * vec4(a_pos, 1.0);\n float factor = 1.0;\n if (u_params.y > 0.5 && u_viewport.w < 0.5) {\n factor = clamp(u_params.z / max(clip.w, 1e-6), 0.5, 2.0);\n }\n float radius = max(0.5, a_size * u_viewport.z * factor * 0.5);\n float reach = radius + 1.0;\n vec2 shift = corner * reach * 2.0 / u_viewport.xy * clip.w;\n gl_Position = vec4(clip.xy + shift, clip.z, clip.w);\n v_offset = corner * reach;\n v_radius = radius;\n v_color = a_color;\n float near = u_params.z - u_params.w;\n v_fog = clamp((length(a_pos - u_eye.xyz) - near) / (2.0 * u_params.w), 0.0, 1.0) * 0.45;\n}\n", l = "\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvoid main() {\n float d = length(v_offset);\n float alpha = clamp(v_radius + 0.5 - d, 0.0, 1.0);\n if (alpha <= 0.0) discard;\n float q = min(d / v_radius, 1.0);\n vec3 n = vec3(v_offset / v_radius, sqrt(max(0.0, 1.0 - q * q)));\n vec3 l = normalize(vec3(-0.45, 0.55, 0.7));\n float lambert = max(dot(n, l), 0.0);\n vec3 shaded = v_color.rgb * (0.62 + 0.45 * lambert) + vec3(pow(lambert, 18.0) * 0.28);\n float sphere = smoothstep(1.5, 3.5, v_radius);\n vec3 rgb = mix(v_color.rgb, shaded, sphere);\n rgb = mix(rgb, u_fog.rgb, v_fog);\n alpha = alpha * v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n", u = "\nattribute vec3 a_pos;\nattribute vec3 a_normal;\nattribute vec4 a_color;\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n gl_Position = u_viewProj * vec4(a_pos, 1.0);\n v_world = a_pos;\n v_normal = a_normal;\n v_color = a_color;\n}\n", d = "\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n vec3 n = normalize(v_normal);\n vec3 v = normalize(u_eye.xyz - v_world);\n if (dot(n, v) < 0.0) n = -n;\n vec3 l = u_light.xyz;\n float diffuse = max(dot(n, l), 0.0);\n vec3 h = normalize(l + v);\n float specular = pow(max(dot(n, h), 0.0), u_material.w) * u_material.z;\n vec3 rgb = v_color.rgb * (u_material.x + u_material.y * diffuse) + vec3(specular);\n float alpha = v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n", f = "\nattribute vec2 a_corner;\nattribute vec3 a_a;\nattribute vec3 a_b;\nattribute vec4 a_color;\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n vec4 ca = u_viewProj * vec4(a_a, 1.0);\n vec4 cb = u_viewProj * vec4(a_b, 1.0);\n vec2 halfSize = u_viewport.xy * 0.5;\n vec2 sa = ca.xy / ca.w * halfSize;\n vec2 sb = cb.xy / cb.w * halfSize;\n vec2 dir = sb - sa;\n float len = length(dir);\n dir = len > 1e-6 ? dir / len : vec2(1.0, 0.0);\n vec2 normal = vec2(-dir.y, dir.x);\n float w = max(0.5, u_params.y * u_viewport.z * 0.5) + 0.5;\n bool atEnd = a_corner.x > 0.5;\n vec4 clip = atEnd ? cb : ca;\n float side = a_corner.y * 2.0 - 1.0;\n vec2 pixel = (atEnd ? sb : sa) + dir * (a_corner.x * 2.0 - 1.0) * w + normal * side * w;\n gl_Position = vec4(pixel / halfSize * clip.w, clip.z - u_eye.w * clip.w, clip.w);\n v_across = side * w;\n v_color = a_color;\n}\n", p = "\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n float core = u_params.y * u_viewport.z * 0.5;\n float coverage = clamp(max(core, 0.5) + 0.5 - abs(v_across), 0.0, 1.0) * min(1.0, core * 2.0);\n float alpha = coverage * v_color.a * u_params.x;\n if (alpha <= 0.0) discard;\n FRAG = vec4(v_color.rgb * alpha, alpha);\n}\n", m = "\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n", h = (e, t, n) => n === 2 ? {
178
+ `, s = "\nuniform mat4 u_viewProj;\nuniform vec4 u_viewport;\nuniform vec4 u_eye;\nuniform vec4 u_light;\nuniform vec4 u_material;\nuniform vec4 u_params;\nuniform vec4 u_fog;\n", c = "\nattribute vec2 a_corner;\nattribute vec3 a_pos;\nattribute float a_size;\nattribute vec4 a_color;\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvarying float v_coverage;\nvoid main() {\n vec2 corner = a_corner * 2.0 - 1.0;\n vec4 clip = u_viewProj * vec4(a_pos, 1.0);\n float factor = 1.0;\n if (u_params.y > 0.5 && u_viewport.w < 0.5) {\n factor = clamp(u_params.z / max(clip.w, 1e-6), 0.5, 2.0);\n }\n bool glow = u_eye.w > 1.5;\n float raw = max(a_size, 0.0) * u_viewport.z * factor * 0.5;\n float radius = max(raw, glow ? 0.75 : 0.5);\n float reach = glow ? radius * 2.2 + 1.0 : radius + 1.0;\n vec2 shift = corner * reach * 2.0 / u_viewport.xy * clip.w;\n gl_Position = vec4(clip.xy + shift, clip.z, clip.w);\n v_offset = corner * reach;\n v_radius = radius;\n v_color = a_color;\n float near = u_params.z - u_params.w;\n v_fog = clamp((length(a_pos - u_eye.xyz) - near) / (2.0 * u_params.w), 0.0, 1.0) * 0.45;\n v_coverage = min(1.0, raw * raw / (radius * radius));\n}\n", l = "\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvarying float v_coverage;\nvoid main() {\n float d = length(v_offset);\n float r = v_radius;\n float alpha = clamp(r + 0.5 - d, 0.0, 1.0);\n vec3 rgb = v_color.rgb;\n if (u_eye.w > 1.5) {\n float core = clamp(r * 0.6 + 0.5 - d, 0.0, 1.0);\n float q = d / r;\n alpha = core + (1.0 - core) * exp(-1.2 * q * q);\n rgb = rgb + (vec3(1.0) - rgb) * (0.2 * core);\n } else if (u_eye.w < 0.5) {\n float q = min(d / r, 1.0);\n vec3 n = vec3(v_offset / r, sqrt(max(0.0, 1.0 - q * q)));\n vec3 l = normalize(vec3(-0.45, 0.55, 0.7));\n float lambert = max(dot(n, l), 0.0);\n vec3 shaded = rgb * (0.62 + 0.45 * lambert) + vec3(pow(lambert, 18.0) * 0.28);\n rgb = mix(rgb, shaded, smoothstep(1.5, 3.5, r));\n }\n if (alpha <= 0.004) discard;\n if (u_light.w > 0.5) {\n alpha = alpha * (1.0 - v_fog);\n } else {\n rgb = mix(rgb, u_fog.rgb, v_fog);\n }\n alpha = alpha * v_coverage * v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n", u = "\nattribute vec3 a_pos;\nattribute vec3 a_normal;\nattribute vec4 a_color;\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n gl_Position = u_viewProj * vec4(a_pos, 1.0);\n v_world = a_pos;\n v_normal = a_normal;\n v_color = a_color;\n}\n", d = "\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n vec3 n = normalize(v_normal);\n vec3 v = normalize(u_eye.xyz - v_world);\n if (dot(n, v) < 0.0) n = -n;\n vec3 l = u_light.xyz;\n float diffuse = max(dot(n, l), 0.0);\n vec3 h = normalize(l + v);\n float specular = pow(max(dot(n, h), 0.0), u_material.w) * u_material.z;\n vec3 rgb = v_color.rgb * (u_material.x + u_material.y * diffuse) + vec3(specular);\n float alpha = v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n", f = "\nattribute vec2 a_corner;\nattribute vec3 a_a;\nattribute vec3 a_b;\nattribute vec4 a_color;\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n vec4 ca = u_viewProj * vec4(a_a, 1.0);\n vec4 cb = u_viewProj * vec4(a_b, 1.0);\n vec2 halfSize = u_viewport.xy * 0.5;\n vec2 sa = ca.xy / ca.w * halfSize;\n vec2 sb = cb.xy / cb.w * halfSize;\n vec2 dir = sb - sa;\n float len = length(dir);\n dir = len > 1e-6 ? dir / len : vec2(1.0, 0.0);\n vec2 normal = vec2(-dir.y, dir.x);\n float w = max(0.5, u_params.y * u_viewport.z * 0.5) + 0.5;\n bool atEnd = a_corner.x > 0.5;\n vec4 clip = atEnd ? cb : ca;\n float side = a_corner.y * 2.0 - 1.0;\n vec2 pixel = (atEnd ? sb : sa) + dir * (a_corner.x * 2.0 - 1.0) * w + normal * side * w;\n gl_Position = vec4(pixel / halfSize * clip.w, clip.z - u_eye.w * clip.w, clip.w);\n v_across = side * w;\n v_color = a_color;\n}\n", p = "\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n float core = u_params.y * u_viewport.z * 0.5;\n float coverage = clamp(max(core, 0.5) + 0.5 - abs(v_across), 0.0, 1.0) * min(1.0, core * 2.0);\n float alpha = coverage * v_color.a * u_params.x;\n if (alpha <= 0.0) discard;\n FRAG = vec4(v_color.rgb * alpha, alpha);\n}\n", m = "\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n", h = (e, t, n) => n === 2 ? {
160
179
  vertex: `#version 300 es\n#define attribute in\n#define varying out\n${s}${e}`,
161
180
  fragment: `#version 300 es\nprecision highp float;\n#define varying in\nout vec4 fragColor;\n#define FRAG fragColor\n${s}${t}`
162
181
  } : {
@@ -186,6 +205,6 @@ fn fs(in: Out) -> @location(0) vec4f {
186
205
  ]
187
206
  };
188
207
  //#endregion
189
- export { _ as GLSL_ATTRIBUTES, o as WGSL_LINES, a as WGSL_MESH, i as WGSL_POINTS, g as glslPrograms, t as itemUniforms, n as writesDepth };
208
+ export { _ as GLSL_ATTRIBUTES, o as WGSL_LINES, a as WGSL_MESH, i as WGSL_POINTS, g as glslPrograms, n as itemUniforms, e as writesDepth };
190
209
 
191
210
  //# sourceMappingURL=shaders.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shaders.js","names":["writeUniforms","out","viewProj","viewport","eye","light","material","params","fog","itemUniforms","second","item","frame","writesDepth","WGSL_UNIFORMS","WGSL_POINTS","WGSL_MESH","WGSL_LINES","GLSL_UNIFORMS","GLSL_POINTS_VS","GLSL_POINTS_FS","GLSL_MESH_VS","GLSL_MESH_FS","GLSL_LINES_VS","GLSL_LINES_FS","PRECISION","glsl","version","vs","fs","glslPrograms","GLSL_ATTRIBUTES"],"sources":["../../../../../charts/src/engine/three-d/shaders.ts"],"sourcesContent":["// Shaders of the 3D data layer: instanced point billboards shaded as small\n// spheres, lit triangles (two-sided Lambert + Blinn-Phong) and screen-space\n// wide line segments. WGSL for WebGPU, GLSL ES 1.0 for WebGL (turned into\n// GLSL ES 3.0 for WebGL2 by a macro prefix). Outputs are premultiplied.\n//\n// Uniforms (WGSL struct, GLSL vec4 uniforms of the same names):\n// viewProj world -> clip (OpenGL depth convention)\n// viewport drawing buffer width, height (device px), dpr, orthographic\n// eye camera position, depth bias of the lines (NDC)\n// light unit vector towards the light\n// material ambient, diffuse, specular, shininess\n// params opacity, perspective sizes (0/1) | line width (CSS px), distance, radius\n// fog background color (far points fade towards it)\n\nimport type { Frame3D, Item3D } from \"./render-types\";\n\n/** Bytes of the WGSL uniform struct */\nexport const UNIFORM_BYTES = 160;\n\n/** Writes the uniforms of an item in the WGSL struct layout */\nconst writeUniforms = (\n out: Float32Array,\n viewProj: Float32Array,\n viewport: readonly [number, number, number, number],\n eye: readonly [number, number, number, number],\n light: readonly [number, number, number, number],\n material: readonly [number, number, number, number],\n params: readonly [number, number, number, number],\n fog: readonly [number, number, number, number],\n): Float32Array => {\n out.set(viewProj, 0);\n out.set(viewport, 16);\n out.set(eye, 20);\n out.set(light, 24);\n out.set(material, 28);\n out.set(params, 32);\n out.set(fog, 36);\n return out;\n};\n\n/** Uniform values of an item (40 floats, the WGSL struct layout) */\nexport const itemUniforms = (\n item: Item3D,\n frame: Frame3D,\n out: Float32Array,\n): Float32Array => {\n const second =\n item.kind === \"points\"\n ? item.perspective\n ? 1\n : 0\n : item.kind === \"lines\"\n ? item.width\n : 0;\n return writeUniforms(\n out,\n frame.viewProj,\n [frame.width, frame.height, frame.dpr, frame.orthographic ? 1 : 0],\n [\n frame.eye[0],\n frame.eye[1],\n frame.eye[2],\n item.kind === \"lines\" ? item.bias : 0,\n ],\n [frame.light[0], frame.light[1], frame.light[2], 0],\n frame.lighting,\n [item.opacity, second, frame.distance, frame.radius],\n [frame.fog[0], frame.fog[1], frame.fog[2], 1],\n );\n};\n\n/** Whether an item writes the depth buffer (opaque items) */\nexport const writesDepth = (item: Item3D): boolean => item.opacity >= 1;\n\n// ------------------------------------------------------------------- WGSL\n\nconst WGSL_UNIFORMS = /* wgsl */ `\nstruct U {\n viewProj: mat4x4f,\n viewport: vec4f,\n eye: vec4f,\n light: vec4f,\n material: vec4f,\n params: vec4f,\n fog: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn toWebGpuDepth(p: vec4f) -> vec4f {\n return vec4f(p.x, p.y, (p.z + p.w) * 0.5, p.w);\n}\n\nfn depthCue(world: vec3f) -> f32 {\n let near = u.params.z - u.params.w;\n return clamp((length(world - u.eye.xyz) - near) / (2.0 * u.params.w), 0.0, 1.0);\n}\n`;\n\nexport const WGSL_POINTS = /* wgsl */ `${WGSL_UNIFORMS}\nstruct Out {\n @builtin(position) position: vec4f,\n @location(0) offset: vec2f,\n @location(1) radius: f32,\n @location(2) color: vec4f,\n @location(3) fog: f32,\n};\n\n@vertex\nfn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) pos: vec3f,\n @location(1) size: f32,\n @location(2) color: vec4f,\n) -> Out {\n var out: Out;\n let corner = vec2f(f32(vi & 1u), f32(vi >> 1u)) * 2.0 - 1.0;\n let clip = u.viewProj * vec4f(pos, 1.0);\n var factor = 1.0;\n if (u.params.y > 0.5 && u.viewport.w < 0.5) {\n factor = clamp(u.params.z / max(clip.w, 1e-6), 0.5, 2.0);\n }\n let radius = max(0.5, size * u.viewport.z * factor * 0.5);\n let reach = radius + 1.0;\n let shift = corner * reach * 2.0 / u.viewport.xy * clip.w;\n out.position = toWebGpuDepth(vec4f(clip.xy + shift, clip.z, clip.w));\n out.offset = corner * reach;\n out.radius = radius;\n out.color = color;\n out.fog = depthCue(pos) * 0.45;\n return out;\n}\n\n@fragment\nfn fs(in: Out) -> @location(0) vec4f {\n let d = length(in.offset);\n var alpha = clamp(in.radius + 0.5 - d, 0.0, 1.0);\n if (alpha <= 0.0) { discard; }\n let q = min(d / in.radius, 1.0);\n let n = vec3f(in.offset.x / in.radius, in.offset.y / in.radius, sqrt(max(0.0, 1.0 - q * q)));\n let l = normalize(vec3f(-0.45, 0.55, 0.7));\n let lambert = max(dot(n, l), 0.0);\n let shaded = in.color.rgb * (0.62 + 0.45 * lambert) + vec3f(pow(lambert, 18.0) * 0.28);\n let sphere = smoothstep(1.5, 3.5, in.radius);\n var rgb = mix(in.color.rgb, shaded, sphere);\n rgb = mix(rgb, u.fog.rgb, in.fog);\n alpha = alpha * in.color.a * u.params.x;\n return vec4f(rgb * alpha, alpha);\n}\n`;\n\nexport const WGSL_MESH = /* wgsl */ `${WGSL_UNIFORMS}\nstruct Out {\n @builtin(position) position: vec4f,\n @location(0) world: vec3f,\n @location(1) normal: vec3f,\n @location(2) color: vec4f,\n};\n\n@vertex\nfn vs(\n @location(0) pos: vec3f,\n @location(1) normal: vec3f,\n @location(2) color: vec4f,\n) -> Out {\n var out: Out;\n out.position = toWebGpuDepth(u.viewProj * vec4f(pos, 1.0));\n out.world = pos;\n out.normal = normal;\n out.color = color;\n return out;\n}\n\n@fragment\nfn fs(in: Out) -> @location(0) vec4f {\n var n = normalize(in.normal);\n let v = normalize(u.eye.xyz - in.world);\n if (dot(n, v) < 0.0) { n = -n; }\n let l = u.light.xyz;\n let diffuse = max(dot(n, l), 0.0);\n let h = normalize(l + v);\n let specular = pow(max(dot(n, h), 0.0), u.material.w) * u.material.z;\n let rgb = in.color.rgb * (u.material.x + u.material.y * diffuse) + vec3f(specular);\n let alpha = in.color.a * u.params.x;\n return vec4f(rgb * alpha, alpha);\n}\n`;\n\nexport const WGSL_LINES = /* wgsl */ `${WGSL_UNIFORMS}\nstruct Out {\n @builtin(position) position: vec4f,\n @location(0) across: f32,\n @location(1) color: vec4f,\n};\n\n@vertex\nfn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) a: vec3f,\n @location(1) b: vec3f,\n @location(2) color: vec4f,\n) -> Out {\n var out: Out;\n let corner = vec2f(f32(vi & 1u), f32(vi >> 1u));\n let ca = u.viewProj * vec4f(a, 1.0);\n let cb = u.viewProj * vec4f(b, 1.0);\n let halfSize = u.viewport.xy * 0.5;\n let sa = ca.xy / ca.w * halfSize;\n let sb = cb.xy / cb.w * halfSize;\n var dir = sb - sa;\n let len = length(dir);\n dir = select(vec2f(1.0, 0.0), dir / len, len > 1e-6);\n let normal = vec2f(-dir.y, dir.x);\n let w = max(0.5, u.params.y * u.viewport.z * 0.5) + 0.5;\n let clip = select(ca, cb, corner.x > 0.5);\n let side = corner.y * 2.0 - 1.0;\n let pixel = select(sa, sb, corner.x > 0.5) + dir * (corner.x * 2.0 - 1.0) * w + normal * side * w;\n let z = clip.z - u.eye.w * clip.w;\n out.position = toWebGpuDepth(vec4f(pixel / halfSize * clip.w, z, clip.w));\n out.across = side * w;\n out.color = color;\n return out;\n}\n\n@fragment\nfn fs(in: Out) -> @location(0) vec4f {\n let core = u.params.y * u.viewport.z * 0.5;\n let coverage = clamp(max(core, 0.5) + 0.5 - abs(in.across), 0.0, 1.0) * min(1.0, core * 2.0);\n let alpha = coverage * in.color.a * u.params.x;\n if (alpha <= 0.0) { discard; }\n return vec4f(in.color.rgb * alpha, alpha);\n}\n`;\n\n// ------------------------------------------------------------------- GLSL\n\nconst GLSL_UNIFORMS = `\nuniform mat4 u_viewProj;\nuniform vec4 u_viewport;\nuniform vec4 u_eye;\nuniform vec4 u_light;\nuniform vec4 u_material;\nuniform vec4 u_params;\nuniform vec4 u_fog;\n`;\n\nconst GLSL_POINTS_VS = `\nattribute vec2 a_corner;\nattribute vec3 a_pos;\nattribute float a_size;\nattribute vec4 a_color;\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvoid main() {\n vec2 corner = a_corner * 2.0 - 1.0;\n vec4 clip = u_viewProj * vec4(a_pos, 1.0);\n float factor = 1.0;\n if (u_params.y > 0.5 && u_viewport.w < 0.5) {\n factor = clamp(u_params.z / max(clip.w, 1e-6), 0.5, 2.0);\n }\n float radius = max(0.5, a_size * u_viewport.z * factor * 0.5);\n float reach = radius + 1.0;\n vec2 shift = corner * reach * 2.0 / u_viewport.xy * clip.w;\n gl_Position = vec4(clip.xy + shift, clip.z, clip.w);\n v_offset = corner * reach;\n v_radius = radius;\n v_color = a_color;\n float near = u_params.z - u_params.w;\n v_fog = clamp((length(a_pos - u_eye.xyz) - near) / (2.0 * u_params.w), 0.0, 1.0) * 0.45;\n}\n`;\n\nconst GLSL_POINTS_FS = `\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvoid main() {\n float d = length(v_offset);\n float alpha = clamp(v_radius + 0.5 - d, 0.0, 1.0);\n if (alpha <= 0.0) discard;\n float q = min(d / v_radius, 1.0);\n vec3 n = vec3(v_offset / v_radius, sqrt(max(0.0, 1.0 - q * q)));\n vec3 l = normalize(vec3(-0.45, 0.55, 0.7));\n float lambert = max(dot(n, l), 0.0);\n vec3 shaded = v_color.rgb * (0.62 + 0.45 * lambert) + vec3(pow(lambert, 18.0) * 0.28);\n float sphere = smoothstep(1.5, 3.5, v_radius);\n vec3 rgb = mix(v_color.rgb, shaded, sphere);\n rgb = mix(rgb, u_fog.rgb, v_fog);\n alpha = alpha * v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n`;\n\nconst GLSL_MESH_VS = `\nattribute vec3 a_pos;\nattribute vec3 a_normal;\nattribute vec4 a_color;\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n gl_Position = u_viewProj * vec4(a_pos, 1.0);\n v_world = a_pos;\n v_normal = a_normal;\n v_color = a_color;\n}\n`;\n\nconst GLSL_MESH_FS = `\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n vec3 n = normalize(v_normal);\n vec3 v = normalize(u_eye.xyz - v_world);\n if (dot(n, v) < 0.0) n = -n;\n vec3 l = u_light.xyz;\n float diffuse = max(dot(n, l), 0.0);\n vec3 h = normalize(l + v);\n float specular = pow(max(dot(n, h), 0.0), u_material.w) * u_material.z;\n vec3 rgb = v_color.rgb * (u_material.x + u_material.y * diffuse) + vec3(specular);\n float alpha = v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n`;\n\nconst GLSL_LINES_VS = `\nattribute vec2 a_corner;\nattribute vec3 a_a;\nattribute vec3 a_b;\nattribute vec4 a_color;\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n vec4 ca = u_viewProj * vec4(a_a, 1.0);\n vec4 cb = u_viewProj * vec4(a_b, 1.0);\n vec2 halfSize = u_viewport.xy * 0.5;\n vec2 sa = ca.xy / ca.w * halfSize;\n vec2 sb = cb.xy / cb.w * halfSize;\n vec2 dir = sb - sa;\n float len = length(dir);\n dir = len > 1e-6 ? dir / len : vec2(1.0, 0.0);\n vec2 normal = vec2(-dir.y, dir.x);\n float w = max(0.5, u_params.y * u_viewport.z * 0.5) + 0.5;\n bool atEnd = a_corner.x > 0.5;\n vec4 clip = atEnd ? cb : ca;\n float side = a_corner.y * 2.0 - 1.0;\n vec2 pixel = (atEnd ? sb : sa) + dir * (a_corner.x * 2.0 - 1.0) * w + normal * side * w;\n gl_Position = vec4(pixel / halfSize * clip.w, clip.z - u_eye.w * clip.w, clip.w);\n v_across = side * w;\n v_color = a_color;\n}\n`;\n\nconst GLSL_LINES_FS = `\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n float core = u_params.y * u_viewport.z * 0.5;\n float coverage = clamp(max(core, 0.5) + 0.5 - abs(v_across), 0.0, 1.0) * min(1.0, core * 2.0);\n float alpha = coverage * v_color.a * u_params.x;\n if (alpha <= 0.0) discard;\n FRAG = vec4(v_color.rgb * alpha, alpha);\n}\n`;\n\nconst PRECISION = `\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n`;\n\nexport interface GlslSource {\n vertex: string;\n fragment: string;\n}\n\nconst glsl = (vs: string, fs: string, version: 1 | 2): GlslSource =>\n version === 2\n ? {\n vertex: `#version 300 es\\n#define attribute in\\n#define varying out\\n${GLSL_UNIFORMS}${vs}`,\n fragment: `#version 300 es\\nprecision highp float;\\n#define varying in\\nout vec4 fragColor;\\n#define FRAG fragColor\\n${GLSL_UNIFORMS}${fs}`,\n }\n : {\n vertex: `${GLSL_UNIFORMS}${vs}`,\n fragment: `${PRECISION}#define FRAG gl_FragColor\\n${GLSL_UNIFORMS}${fs}`,\n };\n\n/** GLSL programs of the three primitives for WebGL (1) or WebGL2 */\nexport const glslPrograms = (version: 1 | 2) => ({\n points: glsl(GLSL_POINTS_VS, GLSL_POINTS_FS, version),\n mesh: glsl(GLSL_MESH_VS, GLSL_MESH_FS, version),\n lines: glsl(GLSL_LINES_VS, GLSL_LINES_FS, version),\n});\n\n/** Attribute names of every program, bound to locations 0, 1, ... */\nexport const GLSL_ATTRIBUTES = {\n points: [\"a_corner\", \"a_pos\", \"a_size\", \"a_color\"],\n mesh: [\"a_pos\", \"a_normal\", \"a_color\"],\n lines: [\"a_corner\", \"a_a\", \"a_b\", \"a_color\"],\n} as const;\n"],"mappings":";AAoBA,IAAMA,KACJ,GACA,GACA,GACA,GACA,GACA,GACA,GACA,OAEAC,EAAI,IAAIC,GAAU,CAAC,GACnBD,EAAI,IAAIE,GAAU,EAAE,GACpBF,EAAI,IAAIG,GAAK,EAAE,GACfH,EAAI,IAAII,GAAO,EAAE,GACjBJ,EAAI,IAAIK,GAAU,EAAE,GACpBL,EAAI,IAAIM,GAAQ,EAAE,GAClBN,EAAI,IAAIO,GAAK,EAAE,GACRP,IAIIQ,KACX,GACA,GACA,MACiB;CACjB,IAAMC,IACJC,EAAK,SAAS,WACV,KAAK,cAGLA,EAAK,SAAS,UACZA,EAAK,QACL;CACR,OAAOX,EACLC,GACAW,EAAM,UACN;EAACA,EAAM;EAAOA,EAAM;EAAQA,EAAM;EAAK,KAAM;CAAoB,GACjE;EACEA,EAAM,IAAI;EACVA,EAAM,IAAI;EACVA,EAAM,IAAI;EACVD,EAAK,SAAS,UAAUA,EAAK,OAAO;CACtC,GACA;EAACC,EAAM,MAAM;EAAIA,EAAM,MAAM;EAAIA,EAAM,MAAM;EAAI;CAAC,GAClDA,EAAM,UACN;EAACD,EAAK;EAASD;EAAQE,EAAM;EAAUA,EAAM;CAAM,GACnD;EAACA,EAAM,IAAI;EAAIA,EAAM,IAAI;EAAIA,EAAM,IAAI;EAAI;CAAC,CAC9C;AACF,GAGaC,KAAe,MAA0BF,EAAK,WAAW,GAIhEG,IAA2B,kcAsBpBC,IAAyB,GAAGD,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoD1CE,IAAuB,GAAGF,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCxCG,IAAwB,GAAGH,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDhDI,IAAgB,6KAUhBC,IAAiB,i2BA4BjBC,IAAiB,ytBAsBjBC,IAAe,0RAefC,IAAe,whBAkBfC,IAAgB,+3BA4BhBC,IAAgB,yVAYhBC,IAAY,0GAaZC,KAAQ,GAAY,GAAY,MACpCC,MAAY,IACR;CACE,QAAQ,+DAA+DT,IAAgBU;CACvF,UAAU,6GAA6GV,IAAgBW;AACzI,IACA;CACE,QAAQ,GAAGX,IAAgBU;CAC3B,UAAU,GAAGH,EAAU,6BAA6BP,IAAgBW;AACtE,GAGOC,KAAgB,OAAoB;CAC/C,QAAQJ,EAAKP,GAAgBC,GAAgBO,CAAO;CACpD,MAAMD,EAAKL,GAAcC,GAAcK,CAAO;CAC9C,OAAOD,EAAKH,GAAeC,GAAeG,CAAO;AACnD,IAGaI,IAAkB;CAC7B,QAAQ;EAAC;EAAY;EAAS;EAAU;CAAS;CACjD,MAAM;EAAC;EAAS;EAAY;CAAS;CACrC,OAAO;EAAC;EAAY;EAAO;EAAO;CAAS;AAC7C"}
1
+ {"version":3,"file":"shaders.js","names":["writeUniforms","out","viewProj","viewport","eye","light","material","params","fog","itemUniforms","second","item","frame","WGSL_UNIFORMS","WGSL_POINTS","WGSL_MESH","WGSL_LINES","GLSL_UNIFORMS","GLSL_POINTS_VS","GLSL_POINTS_FS","GLSL_MESH_VS","GLSL_MESH_FS","GLSL_LINES_VS","GLSL_LINES_FS","PRECISION","glsl","version","vs","fs","glslPrograms","GLSL_ATTRIBUTES","writesDepth"],"sources":["../../../../../charts/src/engine/three-d/shaders.ts"],"sourcesContent":["// Shaders of the 3D data layer: instanced point billboards (shaded spheres,\n// flat discs or glowing discs), lit triangles (two-sided Lambert +\n// Blinn-Phong) and screen-space wide line segments. WGSL for WebGPU, GLSL ES\n// 1.0 for WebGL (turned into GLSL ES 3.0 for WebGL2 by a macro prefix).\n// Outputs are premultiplied.\n//\n// Uniforms (WGSL struct, GLSL vec4 uniforms of the same names):\n// viewProj world -> clip (OpenGL depth convention)\n// viewport drawing buffer width, height (device px), dpr, orthographic\n// eye camera position, depth bias of the lines (NDC) | point style\n// light unit vector towards the light, additive points (0/1)\n// material ambient, diffuse, specular, shininess\n// params opacity, perspective sizes (0/1) | line width (CSS px), distance, radius\n// fog background color (far points fade towards it)\n//\n// Point sizes are CSS pixels times the device pixel ratio (billboards: no\n// point size limit). Dots thinner than the smallest drawn radius keep their\n// energy: their alpha scales with the area they would cover.\n\nimport { POINT_SPHERE, type Frame3D, type Item3D } from \"./render-types\";\n\nexport { writesDepth } from \"./render-types\";\n\n/** Bytes of the WGSL uniform struct */\nexport const UNIFORM_BYTES = 160;\n\n/** Writes the uniforms of an item in the WGSL struct layout */\nconst writeUniforms = (\n out: Float32Array,\n viewProj: Float32Array,\n viewport: readonly [number, number, number, number],\n eye: readonly [number, number, number, number],\n light: readonly [number, number, number, number],\n material: readonly [number, number, number, number],\n params: readonly [number, number, number, number],\n fog: readonly [number, number, number, number],\n): Float32Array => {\n out.set(viewProj, 0);\n out.set(viewport, 16);\n out.set(eye, 20);\n out.set(light, 24);\n out.set(material, 28);\n out.set(params, 32);\n out.set(fog, 36);\n return out;\n};\n\n/** Uniform values of an item (40 floats, the WGSL struct layout) */\nexport const itemUniforms = (\n item: Item3D,\n frame: Frame3D,\n out: Float32Array,\n): Float32Array => {\n const second =\n item.kind === \"points\"\n ? item.perspective\n ? 1\n : 0\n : item.kind === \"lines\"\n ? item.width\n : 0;\n return writeUniforms(\n out,\n frame.viewProj,\n [frame.width, frame.height, frame.dpr, frame.orthographic ? 1 : 0],\n [\n frame.eye[0],\n frame.eye[1],\n frame.eye[2],\n item.kind === \"lines\"\n ? item.bias\n : item.kind === \"points\"\n ? (item.style ?? POINT_SPHERE)\n : 0,\n ],\n [\n frame.light[0],\n frame.light[1],\n frame.light[2],\n item.kind === \"points\" && item.additive ? 1 : 0,\n ],\n frame.lighting,\n [item.opacity, second, frame.distance, frame.radius],\n [frame.fog[0], frame.fog[1], frame.fog[2], 1],\n );\n};\n\n// ------------------------------------------------------------------- WGSL\n\nconst WGSL_UNIFORMS = /* wgsl */ `\nstruct U {\n viewProj: mat4x4f,\n viewport: vec4f,\n eye: vec4f,\n light: vec4f,\n material: vec4f,\n params: vec4f,\n fog: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn toWebGpuDepth(p: vec4f) -> vec4f {\n return vec4f(p.x, p.y, (p.z + p.w) * 0.5, p.w);\n}\n\nfn depthCue(world: vec3f) -> f32 {\n let near = u.params.z - u.params.w;\n return clamp((length(world - u.eye.xyz) - near) / (2.0 * u.params.w), 0.0, 1.0);\n}\n`;\n\nexport const WGSL_POINTS = /* wgsl */ `${WGSL_UNIFORMS}\nstruct Out {\n @builtin(position) position: vec4f,\n @location(0) offset: vec2f,\n @location(1) radius: f32,\n @location(2) color: vec4f,\n @location(3) fog: f32,\n @location(4) coverage: f32,\n};\n\n@vertex\nfn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) pos: vec3f,\n @location(1) size: f32,\n @location(2) color: vec4f,\n) -> Out {\n var out: Out;\n let corner = vec2f(f32(vi & 1u), f32(vi >> 1u)) * 2.0 - 1.0;\n let clip = u.viewProj * vec4f(pos, 1.0);\n var factor = 1.0;\n if (u.params.y > 0.5 && u.viewport.w < 0.5) {\n factor = clamp(u.params.z / max(clip.w, 1e-6), 0.5, 2.0);\n }\n let glow = u.eye.w > 1.5;\n let raw = max(size, 0.0) * u.viewport.z * factor * 0.5;\n let radius = max(raw, select(0.5, 0.75, glow));\n let reach = select(radius + 1.0, radius * 2.2 + 1.0, glow);\n let shift = corner * reach * 2.0 / u.viewport.xy * clip.w;\n out.position = toWebGpuDepth(vec4f(clip.xy + shift, clip.z, clip.w));\n out.offset = corner * reach;\n out.radius = radius;\n out.color = color;\n out.fog = depthCue(pos) * 0.45;\n out.coverage = min(1.0, raw * raw / (radius * radius));\n return out;\n}\n\n@fragment\nfn fs(in: Out) -> @location(0) vec4f {\n let d = length(in.offset);\n let r = in.radius;\n var alpha = clamp(r + 0.5 - d, 0.0, 1.0);\n var rgb = in.color.rgb;\n if (u.eye.w > 1.5) {\n // glow: an anti-aliased core and a gaussian halo\n let core = clamp(r * 0.6 + 0.5 - d, 0.0, 1.0);\n let q = d / r;\n alpha = core + (1.0 - core) * exp(-1.2 * q * q);\n rgb = rgb + (vec3f(1.0) - rgb) * (0.2 * core);\n } else if (u.eye.w < 0.5) {\n let q = min(d / r, 1.0);\n let n = vec3f(in.offset.x / r, in.offset.y / r, sqrt(max(0.0, 1.0 - q * q)));\n let l = normalize(vec3f(-0.45, 0.55, 0.7));\n let lambert = max(dot(n, l), 0.0);\n let shaded = rgb * (0.62 + 0.45 * lambert) + vec3f(pow(lambert, 18.0) * 0.28);\n rgb = mix(rgb, shaded, smoothstep(1.5, 3.5, r));\n }\n if (alpha <= 0.004) { discard; }\n if (u.light.w > 0.5) {\n // additive light fades with the distance\n alpha = alpha * (1.0 - in.fog);\n } else {\n rgb = mix(rgb, u.fog.rgb, in.fog);\n }\n alpha = alpha * in.coverage * in.color.a * u.params.x;\n return vec4f(rgb * alpha, alpha);\n}\n`;\n\nexport const WGSL_MESH = /* wgsl */ `${WGSL_UNIFORMS}\nstruct Out {\n @builtin(position) position: vec4f,\n @location(0) world: vec3f,\n @location(1) normal: vec3f,\n @location(2) color: vec4f,\n};\n\n@vertex\nfn vs(\n @location(0) pos: vec3f,\n @location(1) normal: vec3f,\n @location(2) color: vec4f,\n) -> Out {\n var out: Out;\n out.position = toWebGpuDepth(u.viewProj * vec4f(pos, 1.0));\n out.world = pos;\n out.normal = normal;\n out.color = color;\n return out;\n}\n\n@fragment\nfn fs(in: Out) -> @location(0) vec4f {\n var n = normalize(in.normal);\n let v = normalize(u.eye.xyz - in.world);\n if (dot(n, v) < 0.0) { n = -n; }\n let l = u.light.xyz;\n let diffuse = max(dot(n, l), 0.0);\n let h = normalize(l + v);\n let specular = pow(max(dot(n, h), 0.0), u.material.w) * u.material.z;\n let rgb = in.color.rgb * (u.material.x + u.material.y * diffuse) + vec3f(specular);\n let alpha = in.color.a * u.params.x;\n return vec4f(rgb * alpha, alpha);\n}\n`;\n\nexport const WGSL_LINES = /* wgsl */ `${WGSL_UNIFORMS}\nstruct Out {\n @builtin(position) position: vec4f,\n @location(0) across: f32,\n @location(1) color: vec4f,\n};\n\n@vertex\nfn vs(\n @builtin(vertex_index) vi: u32,\n @location(0) a: vec3f,\n @location(1) b: vec3f,\n @location(2) color: vec4f,\n) -> Out {\n var out: Out;\n let corner = vec2f(f32(vi & 1u), f32(vi >> 1u));\n let ca = u.viewProj * vec4f(a, 1.0);\n let cb = u.viewProj * vec4f(b, 1.0);\n let halfSize = u.viewport.xy * 0.5;\n let sa = ca.xy / ca.w * halfSize;\n let sb = cb.xy / cb.w * halfSize;\n var dir = sb - sa;\n let len = length(dir);\n dir = select(vec2f(1.0, 0.0), dir / len, len > 1e-6);\n let normal = vec2f(-dir.y, dir.x);\n let w = max(0.5, u.params.y * u.viewport.z * 0.5) + 0.5;\n let clip = select(ca, cb, corner.x > 0.5);\n let side = corner.y * 2.0 - 1.0;\n let pixel = select(sa, sb, corner.x > 0.5) + dir * (corner.x * 2.0 - 1.0) * w + normal * side * w;\n let z = clip.z - u.eye.w * clip.w;\n out.position = toWebGpuDepth(vec4f(pixel / halfSize * clip.w, z, clip.w));\n out.across = side * w;\n out.color = color;\n return out;\n}\n\n@fragment\nfn fs(in: Out) -> @location(0) vec4f {\n let core = u.params.y * u.viewport.z * 0.5;\n let coverage = clamp(max(core, 0.5) + 0.5 - abs(in.across), 0.0, 1.0) * min(1.0, core * 2.0);\n let alpha = coverage * in.color.a * u.params.x;\n if (alpha <= 0.0) { discard; }\n return vec4f(in.color.rgb * alpha, alpha);\n}\n`;\n\n// ------------------------------------------------------------------- GLSL\n\nconst GLSL_UNIFORMS = `\nuniform mat4 u_viewProj;\nuniform vec4 u_viewport;\nuniform vec4 u_eye;\nuniform vec4 u_light;\nuniform vec4 u_material;\nuniform vec4 u_params;\nuniform vec4 u_fog;\n`;\n\nconst GLSL_POINTS_VS = `\nattribute vec2 a_corner;\nattribute vec3 a_pos;\nattribute float a_size;\nattribute vec4 a_color;\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvarying float v_coverage;\nvoid main() {\n vec2 corner = a_corner * 2.0 - 1.0;\n vec4 clip = u_viewProj * vec4(a_pos, 1.0);\n float factor = 1.0;\n if (u_params.y > 0.5 && u_viewport.w < 0.5) {\n factor = clamp(u_params.z / max(clip.w, 1e-6), 0.5, 2.0);\n }\n bool glow = u_eye.w > 1.5;\n float raw = max(a_size, 0.0) * u_viewport.z * factor * 0.5;\n float radius = max(raw, glow ? 0.75 : 0.5);\n float reach = glow ? radius * 2.2 + 1.0 : radius + 1.0;\n vec2 shift = corner * reach * 2.0 / u_viewport.xy * clip.w;\n gl_Position = vec4(clip.xy + shift, clip.z, clip.w);\n v_offset = corner * reach;\n v_radius = radius;\n v_color = a_color;\n float near = u_params.z - u_params.w;\n v_fog = clamp((length(a_pos - u_eye.xyz) - near) / (2.0 * u_params.w), 0.0, 1.0) * 0.45;\n v_coverage = min(1.0, raw * raw / (radius * radius));\n}\n`;\n\nconst GLSL_POINTS_FS = `\nvarying vec2 v_offset;\nvarying float v_radius;\nvarying vec4 v_color;\nvarying float v_fog;\nvarying float v_coverage;\nvoid main() {\n float d = length(v_offset);\n float r = v_radius;\n float alpha = clamp(r + 0.5 - d, 0.0, 1.0);\n vec3 rgb = v_color.rgb;\n if (u_eye.w > 1.5) {\n float core = clamp(r * 0.6 + 0.5 - d, 0.0, 1.0);\n float q = d / r;\n alpha = core + (1.0 - core) * exp(-1.2 * q * q);\n rgb = rgb + (vec3(1.0) - rgb) * (0.2 * core);\n } else if (u_eye.w < 0.5) {\n float q = min(d / r, 1.0);\n vec3 n = vec3(v_offset / r, sqrt(max(0.0, 1.0 - q * q)));\n vec3 l = normalize(vec3(-0.45, 0.55, 0.7));\n float lambert = max(dot(n, l), 0.0);\n vec3 shaded = rgb * (0.62 + 0.45 * lambert) + vec3(pow(lambert, 18.0) * 0.28);\n rgb = mix(rgb, shaded, smoothstep(1.5, 3.5, r));\n }\n if (alpha <= 0.004) discard;\n if (u_light.w > 0.5) {\n alpha = alpha * (1.0 - v_fog);\n } else {\n rgb = mix(rgb, u_fog.rgb, v_fog);\n }\n alpha = alpha * v_coverage * v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n`;\n\nconst GLSL_MESH_VS = `\nattribute vec3 a_pos;\nattribute vec3 a_normal;\nattribute vec4 a_color;\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n gl_Position = u_viewProj * vec4(a_pos, 1.0);\n v_world = a_pos;\n v_normal = a_normal;\n v_color = a_color;\n}\n`;\n\nconst GLSL_MESH_FS = `\nvarying vec3 v_world;\nvarying vec3 v_normal;\nvarying vec4 v_color;\nvoid main() {\n vec3 n = normalize(v_normal);\n vec3 v = normalize(u_eye.xyz - v_world);\n if (dot(n, v) < 0.0) n = -n;\n vec3 l = u_light.xyz;\n float diffuse = max(dot(n, l), 0.0);\n vec3 h = normalize(l + v);\n float specular = pow(max(dot(n, h), 0.0), u_material.w) * u_material.z;\n vec3 rgb = v_color.rgb * (u_material.x + u_material.y * diffuse) + vec3(specular);\n float alpha = v_color.a * u_params.x;\n FRAG = vec4(rgb * alpha, alpha);\n}\n`;\n\nconst GLSL_LINES_VS = `\nattribute vec2 a_corner;\nattribute vec3 a_a;\nattribute vec3 a_b;\nattribute vec4 a_color;\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n vec4 ca = u_viewProj * vec4(a_a, 1.0);\n vec4 cb = u_viewProj * vec4(a_b, 1.0);\n vec2 halfSize = u_viewport.xy * 0.5;\n vec2 sa = ca.xy / ca.w * halfSize;\n vec2 sb = cb.xy / cb.w * halfSize;\n vec2 dir = sb - sa;\n float len = length(dir);\n dir = len > 1e-6 ? dir / len : vec2(1.0, 0.0);\n vec2 normal = vec2(-dir.y, dir.x);\n float w = max(0.5, u_params.y * u_viewport.z * 0.5) + 0.5;\n bool atEnd = a_corner.x > 0.5;\n vec4 clip = atEnd ? cb : ca;\n float side = a_corner.y * 2.0 - 1.0;\n vec2 pixel = (atEnd ? sb : sa) + dir * (a_corner.x * 2.0 - 1.0) * w + normal * side * w;\n gl_Position = vec4(pixel / halfSize * clip.w, clip.z - u_eye.w * clip.w, clip.w);\n v_across = side * w;\n v_color = a_color;\n}\n`;\n\nconst GLSL_LINES_FS = `\nvarying float v_across;\nvarying vec4 v_color;\nvoid main() {\n float core = u_params.y * u_viewport.z * 0.5;\n float coverage = clamp(max(core, 0.5) + 0.5 - abs(v_across), 0.0, 1.0) * min(1.0, core * 2.0);\n float alpha = coverage * v_color.a * u_params.x;\n if (alpha <= 0.0) discard;\n FRAG = vec4(v_color.rgb * alpha, alpha);\n}\n`;\n\nconst PRECISION = `\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n`;\n\nexport interface GlslSource {\n vertex: string;\n fragment: string;\n}\n\nconst glsl = (vs: string, fs: string, version: 1 | 2): GlslSource =>\n version === 2\n ? {\n vertex: `#version 300 es\\n#define attribute in\\n#define varying out\\n${GLSL_UNIFORMS}${vs}`,\n fragment: `#version 300 es\\nprecision highp float;\\n#define varying in\\nout vec4 fragColor;\\n#define FRAG fragColor\\n${GLSL_UNIFORMS}${fs}`,\n }\n : {\n vertex: `${GLSL_UNIFORMS}${vs}`,\n fragment: `${PRECISION}#define FRAG gl_FragColor\\n${GLSL_UNIFORMS}${fs}`,\n };\n\n/** GLSL programs of the three primitives for WebGL (1) or WebGL2 */\nexport const glslPrograms = (version: 1 | 2) => ({\n points: glsl(GLSL_POINTS_VS, GLSL_POINTS_FS, version),\n mesh: glsl(GLSL_MESH_VS, GLSL_MESH_FS, version),\n lines: glsl(GLSL_LINES_VS, GLSL_LINES_FS, version),\n});\n\n/** Attribute names of every program, bound to locations 0, 1, ... */\nexport const GLSL_ATTRIBUTES = {\n points: [\"a_corner\", \"a_pos\", \"a_size\", \"a_color\"],\n mesh: [\"a_pos\", \"a_normal\", \"a_color\"],\n lines: [\"a_corner\", \"a_a\", \"a_b\", \"a_color\"],\n} as const;\n"],"mappings":";;AA2BA,IAAMA,KACJ,GACA,GACA,GACA,GACA,GACA,GACA,GACA,OAEAC,EAAI,IAAIC,GAAU,CAAC,GACnBD,EAAI,IAAIE,GAAU,EAAE,GACpBF,EAAI,IAAIG,GAAK,EAAE,GACfH,EAAI,IAAII,GAAO,EAAE,GACjBJ,EAAI,IAAIK,GAAU,EAAE,GACpBL,EAAI,IAAIM,GAAQ,EAAE,GAClBN,EAAI,IAAIO,GAAK,EAAE,GACRP,IAIIQ,KACX,GACA,GACA,MACiB;CACjB,IAAMC,IACJC,EAAK,SAAS,WACV,KAAK,cAGLA,EAAK,SAAS,UACZA,EAAK,QACL;CACR,OAAOX,EACLC,GACAW,EAAM,UACN;EAACA,EAAM;EAAOA,EAAM;EAAQA,EAAM;EAAK,KAAM;CAAoB,GACjE;EACEA,EAAM,IAAI;EACVA,EAAM,IAAI;EACVA,EAAM,IAAI;EACVD,EAAK,SAAS,UACVA,EAAK,OACLA,EAAK,SAAS,WACXA,EAAK,SAAA,IACN;CACR,GACA;EACEC,EAAM,MAAM;EACZA,EAAM,MAAM;EACZA,EAAM,MAAM;EACZD,EAAK,SAAS,YAAYA,EAAK,WAAW,IAAI;CAChD,GACAC,EAAM,UACN;EAACD,EAAK;EAASD;EAAQE,EAAM;EAAUA,EAAM;CAAM,GACnD;EAACA,EAAM,IAAI;EAAIA,EAAM,IAAI;EAAIA,EAAM,IAAI;EAAI;CAAC,CAC9C;AACF,GAIMC,IAA2B,kcAsBpBC,IAAyB,GAAGD,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsE1CE,IAAuB,GAAGF,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCxCG,IAAwB,GAAGH,EAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDhDI,IAAgB,6KAUhBC,IAAiB,2hCAgCjBC,IAAiB,wjCAmCjBC,IAAe,0RAefC,IAAe,whBAkBfC,IAAgB,+3BA4BhBC,IAAgB,yVAYhBC,IAAY,0GAaZC,KAAQ,GAAY,GAAY,MACpCC,MAAY,IACR;CACE,QAAQ,+DAA+DT,IAAgBU;CACvF,UAAU,6GAA6GV,IAAgBW;AACzI,IACA;CACE,QAAQ,GAAGX,IAAgBU;CAC3B,UAAU,GAAGH,EAAU,6BAA6BP,IAAgBW;AACtE,GAGOC,KAAgB,OAAoB;CAC/C,QAAQJ,EAAKP,GAAgBC,GAAgBO,CAAO;CACpD,MAAMD,EAAKL,GAAcC,GAAcK,CAAO;CAC9C,OAAOD,EAAKH,GAAeC,GAAeG,CAAO;AACnD,IAGaI,IAAkB;CAC7B,QAAQ;EAAC;EAAY;EAAS;EAAU;CAAS;CACjD,MAAM;EAAC;EAAS;EAAY;CAAS;CACrC,OAAO;EAAC;EAAY;EAAO;EAAO;CAAS;AAC7C"}
@@ -1,2 +1,2 @@
1
- var e=1<<18,t=65536,n=7,r=(e,r,i,a,o,s)=>{let c=Math.floor(e.length/6),{keys:l,counts:u}=s,d=a?2:3,f=i[d]??0,p=i[d+4]??0,m=i[d+8]??0,h=1/0,g=-1/0;for(let t=0;t<c;t++){let i=t*6,a=0,o=0,s=0;for(let t=0;t<4;t++){let c=(e[i+(t===3?5:t)]??0)*n;a+=r[c]??0,o+=r[c+1]??0,s+=r[c+2]??0}let c=f*a+p*o+m*s;l[t]=c,c<h&&(h=c),c>g&&(g=c)}u.fill(0);let _=g>h?65535/(g-h):0;for(let e=0;e<c;e++){let t=Math.min(65535,Math.max(0,Math.floor((g-(l[e]??g))*_)));l[e]=t,u[t]=(u[t]??0)+1}let v=0;for(let e=0;e<t;e++){let t=u[e]??0;u[e]=v,v+=t}for(let t=0;t<c;t++){let n=l[t]??0,r=(u[n]??0)*6;u[n]=(u[n]??0)+1;let i=t*6;for(let t=0;t<6;t++)o[r+t]=e[i+t]??0}},i=(e,t)=>{if(!e)return!1;for(let n=0;n<16;n++)if(e[n]!==t[n])return!1;return!0},a=()=>{let e=new Map,n=null,a=!1,o=0,s=null,c=e=>e.kind===`mesh`&&e.opacity<1&&e.indices.length>=12&&e.indices.length%6==0&&e.indices.length/6<=262144;return(l,u)=>{if(!l.some(c))return e.clear(),l;let d=!i(n,u.viewProj)||a!==u.orthographic;d&&(n=Float32Array.from(u.viewProj),a=u.orthographic);let f=new Set,p=l.map(n=>{if(!c(n))return n;f.add(n.key);let i=e.get(n.key),a=!i||i.version!==n.version||i.source!==n.indices;if(a||d){let c=n.indices.length/6;(!s||s.keys.length<c)&&(s={keys:new Float32Array(Math.max(c,1024)),counts:new Uint32Array(t)});let l=i&&!a&&i.indices.length===n.indices.length?i.indices:new Uint32Array(n.indices.length);r(n.indices,new Float32Array(n.vertices),u.viewProj,u.orthographic,l,s),i={version:n.version,source:n.indices,indices:l,order:++o},e.set(n.key,i)}return{...n,indices:i.indices,order:i.order}});for(let t of e.keys())f.has(t)||e.delete(t);return p}};exports.MAX_SORTED_QUADS=e,exports.createDepthSorter=a,exports.sortQuads=r;
1
+ const e=require("./render-types.cjs");var t=1<<18,n=`transparent`,r=65536,i=7,a=(e,t,n,a,o,s)=>{let c=Math.floor(e.length/6),{keys:l,counts:u}=s,d=a?2:3,f=n[d]??0,p=n[d+4]??0,m=n[d+8]??0,h=1/0,g=-1/0;for(let n=0;n<c;n++){let r=n*6,a=0,o=0,s=0;for(let n=0;n<4;n++){let c=(e[r+(n===3?5:n)]??0)*i;a+=t[c]??0,o+=t[c+1]??0,s+=t[c+2]??0}let c=f*a+p*o+m*s;l[n]=c,c<h&&(h=c),c>g&&(g=c)}u.fill(0);let _=g>h?65535/(g-h):0;for(let e=0;e<c;e++){let t=Math.min(65535,Math.max(0,Math.floor((g-(l[e]??g))*_)));l[e]=t,u[t]=(u[t]??0)+1}let v=0;for(let e=0;e<r;e++){let t=u[e]??0;u[e]=v,v+=t}for(let t=0;t<c;t++){let n=l[t]??0,r=(u[n]??0)*6;u[n]=(u[n]??0)+1;let i=t*6;for(let t=0;t<6;t++)o[r+t]=e[i+t]??0}},o=(e,t,n)=>{let r=0,i=0;for(let t of e)r+=t.vertexCount,i+=t.indices.length;let a=new ArrayBuffer(r*28),o=new Uint8Array(a),s=new Uint32Array(i),c=0,l=0;for(let t of e){let e=Math.min(t.vertices.byteLength,t.vertexCount*28);o.set(new Uint8Array(t.vertices,0,e),c*28);let n=Math.max(0,Math.min(1,t.opacity));if(n<1)for(let e=0;e<t.vertexCount;e++){let t=(c+e)*28+27;o[t]=Math.round((o[t]??0)*n)}let r=t.indices;for(let e=0;e<r.length;e++)s[l+e]=(r[e]??0)+c;c+=t.vertexCount,l+=r.length}return{kind:`mesh`,key:t,version:n,opacity:1,transparent:!0,vertices:a,vertexCount:r,indices:s}},s=(e,t)=>{if(!e)return!1;for(let n=0;n<16;n++)if(e[n]!==t[n])return!1;return!0},c=t=>t.kind===`mesh`&&!e.writesDepth(t),l=e=>e.indices.length>0&&e.indices.length%6==0,u=e=>{let t=new Float32Array(e.vertices,0,Math.min(e.vertices.byteLength/4,e.vertexCount*i)),n=[1/0,1/0,1/0],r=[-1/0,-1/0,-1/0];for(let e=0;e+2<t.length;e+=i)for(let i=0;i<3;i++){let a=t[e+i]??0;a<(n[i]??0)&&(n[i]=a),a>(r[i]??0)&&(r[i]=a)}return[0,1,2].map(e=>n[e]<=r[e]?(n[e]+r[e])/2:0)},d=()=>{let e=new Map,t=new Map,i=null,d=0,f=null,p=!1,m=0,h=null,g=(t,n,i,o)=>{let s=t.indices.length/6;if(!l(t)||s<2||s>262144)return t;o.add(t.key);let c=e.get(t.key),u=!c||c.version!==t.version||c.source!==t.indices;if(u||i){(!h||h.keys.length<s)&&(h={keys:new Float32Array(Math.max(s,1024)),counts:new Uint32Array(r)});let i=c&&!u&&c.indices.length===t.indices.length?c.indices:new Uint32Array(t.indices.length);a(t.indices,new Float32Array(t.vertices),n.viewProj,n.orthographic,i,h),c={version:t.version,source:t.indices,indices:i,order:++m},e.set(t.key,c)}return{...t,indices:c.indices,order:c.order}},_=(e,n)=>{let r=t.get(e.key);(!r||r.version!==e.version)&&(r={version:e.version,center:u(e)},t.set(e.key,r));let i=n.viewProj,a=n.orthographic?2:3,[o,s,c]=r.center;return(i[a]??0)*o+(i[a+4]??0)*s+(i[a+8]??0)*c+(i[a+12]??0)};return(r,a)=>{let u=r.filter(c);if(u.length===0)return e.clear(),t.clear(),i=null,r;let m=!s(f,a.viewProj)||p!==a.orthographic;m&&(f=Float32Array.from(a.viewProj),p=a.orthographic);let h=new Set,v=0;for(let e of u)v+=e.indices.length/6;let y=[];if(u.length>=2&&v<=262144&&u.every(l)){let e=u.map(e=>`${e.key}@${e.version}@${e.opacity}`).join(`|`);(!i||i.signature!==e)&&(i={signature:e,item:o(u,n,++d)});let t=g(i.item,a,m,h),s=!1;for(let e of r)c(e)?s||(y.push(t),s=!0):y.push(e)}else{i=null;let e=u.map(e=>({m:e,depth:_(e,a)})).sort((e,t)=>t.depth-e.depth).map(e=>g(e.m,a,m,h)),t=0;for(let n of r)y.push(c(n)?e[t++]:n)}for(let t of e.keys())h.has(t)||e.delete(t);for(let e of t.keys())u.some(t=>t.key===e)||t.delete(e);return y}};exports.MAX_SORTED_QUADS=t,exports.MERGED_KEY=n,exports.createDepthSorter=d,exports.mergeMeshes=o,exports.sortQuads=a;
2
2
  //# sourceMappingURL=sort.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"sort.cjs","names":["MAX_SORTED_QUADS","BUCKETS","FLOATS","sortQuads","quads","indices","scratch","row","orthographic","mx","viewProj","my","mz","min","max","q","o","x","y","z","c","v","vertices","depth","counts","scale","b","keys","sum","at","j","sameMatrix","a","i","createDepthSorter","sorted","view","order","sortable","item","items","moved","frame","seen","result","entry","stale","out","key"],"sources":["../../../../../charts/src/engine/three-d/sort.ts"],"sourcesContent":["// Back-to-front order of the transparent meshes for the GPU backends:\n// transparent items are drawn without writing depth, so their triangles must\n// come farthest first to blend correctly where a surface folds over itself.\n// Meshes are made of quads (6 indices: two triangles sharing an edge, as\n// built for surface cells and bar faces); quads are sorted by the camera\n// depth of their center with a bucket sort (O(n)), and only again when the\n// camera moved. Canvas2D sorts every triangle itself (painter's algorithm).\n\nimport type { Frame3D, Item3D, MeshItem } from \"./render-types\";\nimport { VERTEX_STRIDE } from \"./render-types\";\n\n/** Largest transparent mesh sorted (quads): a 512 × 512 surface grid */\nexport const MAX_SORTED_QUADS = 1 << 18;\n\nconst BUCKETS = 1 << 16;\nconst FLOATS = VERTEX_STRIDE / 4;\n\n/**\n * Writes into `out` the quads of `indices` (6 indices each) ordered by\n * decreasing camera depth: view depth (clip w) in perspective, clip z in\n * orthographic projection. Equal depths keep their order.\n */\nexport const sortQuads = (\n indices: Uint32Array,\n vertices: Float32Array,\n viewProj: Float32Array,\n orthographic: boolean,\n out: Uint32Array,\n scratch: { keys: Float32Array; counts: Uint32Array },\n): void => {\n const quads = Math.floor(indices.length / 6);\n const { keys, counts } = scratch;\n // depth = row 4 (w) or row 3 (z) of the column-major matrix\n const row = orthographic ? 2 : 3;\n const mx = viewProj[row] ?? 0;\n const my = viewProj[row + 4] ?? 0;\n const mz = viewProj[row + 8] ?? 0;\n let min = Infinity;\n let max = -Infinity;\n for (let q = 0; q < quads; q++) {\n const o = q * 6;\n let x = 0;\n let y = 0;\n let z = 0;\n // the 4 corners: indices 0, 1, 2 and 5 of the quad\n for (let c = 0; c < 4; c++) {\n const v = (indices[o + (c === 3 ? 5 : c)] ?? 0) * FLOATS;\n x += vertices[v] ?? 0;\n y += vertices[v + 1] ?? 0;\n z += vertices[v + 2] ?? 0;\n }\n const depth = mx * x + my * y + mz * z;\n keys[q] = depth;\n if (depth < min) min = depth;\n if (depth > max) max = depth;\n }\n counts.fill(0);\n const scale = max > min ? (BUCKETS - 1) / (max - min) : 0;\n // bucket 0 = farthest (clamped: the keys are rounded to float32)\n for (let q = 0; q < quads; q++) {\n const b = Math.min(\n BUCKETS - 1,\n Math.max(0, Math.floor((max - (keys[q] ?? max)) * scale)),\n );\n keys[q] = b;\n counts[b] = (counts[b] ?? 0) + 1;\n }\n let sum = 0;\n for (let b = 0; b < BUCKETS; b++) {\n const c = counts[b] ?? 0;\n counts[b] = sum;\n sum += c;\n }\n for (let q = 0; q < quads; q++) {\n const b = keys[q] ?? 0;\n const at = (counts[b] ?? 0) * 6;\n counts[b] = (counts[b] ?? 0) + 1;\n const o = q * 6;\n for (let j = 0; j < 6; j++) out[at + j] = indices[o + j] ?? 0;\n }\n};\n\ninterface SortedMesh {\n version: number;\n source: Uint32Array;\n indices: Uint32Array;\n order: number;\n}\n\nconst sameMatrix = (a: Float32Array | null, b: Float32Array) => {\n if (!a) return false;\n for (let i = 0; i < 16; i++) if (a[i] !== b[i]) return false;\n return true;\n};\n\n/**\n * Sorter of the transparent meshes: returns the items with the transparent\n * meshes' indices in back-to-front order (`order` changes when only the\n * indices must be uploaded again)\n */\nexport const createDepthSorter = () => {\n const sorted = new Map<string, SortedMesh>();\n let view: Float32Array | null = null;\n let orthographic = false;\n let order = 0;\n let scratch: { keys: Float32Array; counts: Uint32Array } | null = null;\n\n const sortable = (item: Item3D): item is MeshItem =>\n item.kind === \"mesh\" &&\n item.opacity < 1 &&\n item.indices.length >= 12 &&\n item.indices.length % 6 === 0 &&\n item.indices.length / 6 <= MAX_SORTED_QUADS;\n\n return (items: readonly Item3D[], frame: Frame3D): readonly Item3D[] => {\n if (!items.some(sortable)) {\n sorted.clear();\n return items;\n }\n const moved =\n !sameMatrix(view, frame.viewProj) || orthographic !== frame.orthographic;\n if (moved) {\n view = Float32Array.from(frame.viewProj);\n orthographic = frame.orthographic;\n }\n const seen = new Set<string>();\n const result = items.map((item): Item3D => {\n if (!sortable(item)) return item;\n seen.add(item.key);\n let entry = sorted.get(item.key);\n const stale =\n !entry ||\n entry.version !== item.version ||\n entry.source !== item.indices;\n if (stale || moved) {\n const quads = item.indices.length / 6;\n if (!scratch || scratch.keys.length < quads)\n scratch = {\n keys: new Float32Array(Math.max(quads, 1024)),\n counts: new Uint32Array(BUCKETS),\n };\n const out =\n entry && !stale && entry.indices.length === item.indices.length\n ? entry.indices\n : new Uint32Array(item.indices.length);\n sortQuads(\n item.indices,\n new Float32Array(item.vertices),\n frame.viewProj,\n frame.orthographic,\n out,\n scratch,\n );\n entry = {\n version: item.version,\n source: item.indices,\n indices: out,\n order: ++order,\n };\n sorted.set(item.key, entry);\n }\n return { ...item, indices: entry!.indices, order: entry!.order };\n });\n for (const key of sorted.keys()) if (!seen.has(key)) sorted.delete(key);\n return result;\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"sort.cjs","names":["writesDepth","require_render_types","MAX_SORTED_QUADS","MERGED_KEY","BUCKETS","FLOATS","sortQuads","quads","indices","scratch","row","orthographic","mx","viewProj","my","mz","min","max","q","o","x","y","z","c","v","vertices","depth","counts","scale","b","keys","sum","at","j","mergeMeshes","vertexCount","indexCount","m","meshes","bytes","base","length","opacity","a","source","sameMatrix","i","isTransparentMesh","item","isQuadMesh","meshCenter","f","k","createDepthSorter","sorted","centers","merged","mergedVersion","view","order","sortMesh","seen","entry","stale","moved","out","frame","centerDepth","transparent","items","result","signature","placed","it","ordered","next","key"],"sources":["../../../../../charts/src/engine/three-d/sort.ts"],"sourcesContent":["// Back-to-front order of the transparent meshes for the GPU backends:\n// transparent items are drawn without writing depth, so their triangles must\n// come farthest first to blend correctly where a surface folds over itself\n// or where several transparent surfaces / bar series overlap. Meshes are\n// made of quads (6 indices: two triangles sharing an edge, as built for\n// surface cells and bar faces); quads are sorted by the camera depth of\n// their center with a bucket sort (O(n)), and only again when the camera\n// moved. Several transparent meshes are merged into one item (opacity baked\n// into the vertex colors) so that their quads are sorted together; above\n// the sort budget, the meshes are drawn by decreasing depth of their center\n// with their own quads sorted. Canvas2D sorts every triangle of every item\n// itself (painter's algorithm).\n\nimport type { Frame3D, Item3D, MeshItem } from \"./render-types\";\nimport { VERTEX_STRIDE, writesDepth } from \"./render-types\";\n\n/** Largest number of transparent quads sorted: a 512 × 512 surface grid */\nexport const MAX_SORTED_QUADS = 1 << 18;\n\n/** Key of the merged transparent meshes */\nexport const MERGED_KEY = \"transparent\";\n\nconst BUCKETS = 1 << 16;\nconst FLOATS = VERTEX_STRIDE / 4;\n\n/**\n * Writes into `out` the quads of `indices` (6 indices each) ordered by\n * decreasing camera depth: view depth (clip w) in perspective, clip z in\n * orthographic projection. Equal depths keep their order.\n */\nexport const sortQuads = (\n indices: Uint32Array,\n vertices: Float32Array,\n viewProj: Float32Array,\n orthographic: boolean,\n out: Uint32Array,\n scratch: { keys: Float32Array; counts: Uint32Array },\n): void => {\n const quads = Math.floor(indices.length / 6);\n const { keys, counts } = scratch;\n // depth = row 4 (w) or row 3 (z) of the column-major matrix\n const row = orthographic ? 2 : 3;\n const mx = viewProj[row] ?? 0;\n const my = viewProj[row + 4] ?? 0;\n const mz = viewProj[row + 8] ?? 0;\n let min = Infinity;\n let max = -Infinity;\n for (let q = 0; q < quads; q++) {\n const o = q * 6;\n let x = 0;\n let y = 0;\n let z = 0;\n // the 4 corners: indices 0, 1, 2 and 5 of the quad\n for (let c = 0; c < 4; c++) {\n const v = (indices[o + (c === 3 ? 5 : c)] ?? 0) * FLOATS;\n x += vertices[v] ?? 0;\n y += vertices[v + 1] ?? 0;\n z += vertices[v + 2] ?? 0;\n }\n const depth = mx * x + my * y + mz * z;\n keys[q] = depth;\n if (depth < min) min = depth;\n if (depth > max) max = depth;\n }\n counts.fill(0);\n const scale = max > min ? (BUCKETS - 1) / (max - min) : 0;\n // bucket 0 = farthest (clamped: the keys are rounded to float32)\n for (let q = 0; q < quads; q++) {\n const b = Math.min(\n BUCKETS - 1,\n Math.max(0, Math.floor((max - (keys[q] ?? max)) * scale)),\n );\n keys[q] = b;\n counts[b] = (counts[b] ?? 0) + 1;\n }\n let sum = 0;\n for (let b = 0; b < BUCKETS; b++) {\n const c = counts[b] ?? 0;\n counts[b] = sum;\n sum += c;\n }\n for (let q = 0; q < quads; q++) {\n const b = keys[q] ?? 0;\n const at = (counts[b] ?? 0) * 6;\n counts[b] = (counts[b] ?? 0) + 1;\n const o = q * 6;\n for (let j = 0; j < 6; j++) out[at + j] = indices[o + j] ?? 0;\n }\n};\n\n/**\n * One transparent item made of several meshes: vertices concatenated (the\n * opacity of every mesh multiplies the alpha of its vertex colors), indices\n * shifted. Drawn with opacity 1, without writing depth.\n */\nexport const mergeMeshes = (\n meshes: readonly MeshItem[],\n key: string,\n version: number,\n): MeshItem => {\n let vertexCount = 0;\n let indexCount = 0;\n for (const m of meshes) {\n vertexCount += m.vertexCount;\n indexCount += m.indices.length;\n }\n const vertices = new ArrayBuffer(vertexCount * VERTEX_STRIDE);\n const bytes = new Uint8Array(vertices);\n const indices = new Uint32Array(indexCount);\n let base = 0;\n let at = 0;\n for (const m of meshes) {\n const length = Math.min(\n m.vertices.byteLength,\n m.vertexCount * VERTEX_STRIDE,\n );\n bytes.set(new Uint8Array(m.vertices, 0, length), base * VERTEX_STRIDE);\n const opacity = Math.max(0, Math.min(1, m.opacity));\n if (opacity < 1) {\n for (let v = 0; v < m.vertexCount; v++) {\n const a = (base + v) * VERTEX_STRIDE + 27;\n bytes[a] = Math.round((bytes[a] ?? 0) * opacity);\n }\n }\n const source = m.indices;\n for (let j = 0; j < source.length; j++)\n indices[at + j] = (source[j] ?? 0) + base;\n base += m.vertexCount;\n at += source.length;\n }\n return {\n kind: \"mesh\",\n key,\n version,\n opacity: 1,\n transparent: true,\n vertices,\n vertexCount,\n indices,\n };\n};\n\ninterface SortedMesh {\n version: number;\n source: Uint32Array;\n indices: Uint32Array;\n order: number;\n}\n\nconst sameMatrix = (a: Float32Array | null, b: Float32Array) => {\n if (!a) return false;\n for (let i = 0; i < 16; i++) if (a[i] !== b[i]) return false;\n return true;\n};\n\nconst isTransparentMesh = (item: Item3D): item is MeshItem =>\n item.kind === \"mesh\" && !writesDepth(item);\n\n/** Made of whole quads: its triangles can be sorted by pairs */\nconst isQuadMesh = (item: MeshItem) =>\n item.indices.length > 0 && item.indices.length % 6 === 0;\n\n/** Center of the bounding box of a mesh's vertices */\nconst meshCenter = (item: MeshItem): [number, number, number] => {\n const f = new Float32Array(\n item.vertices,\n 0,\n Math.min(item.vertices.byteLength / 4, item.vertexCount * FLOATS),\n );\n const min = [Infinity, Infinity, Infinity];\n const max = [-Infinity, -Infinity, -Infinity];\n for (let o = 0; o + 2 < f.length; o += FLOATS) {\n for (let k = 0; k < 3; k++) {\n const v = f[o + k] ?? 0;\n if (v < (min[k] ?? 0)) min[k] = v;\n if (v > (max[k] ?? 0)) max[k] = v;\n }\n }\n return [0, 1, 2].map((k) =>\n min[k]! <= max[k]! ? (min[k]! + max[k]!) / 2 : 0,\n ) as [number, number, number];\n};\n\n/**\n * Sorter of the transparent meshes: returns the items with the transparent\n * meshes merged into one item (`MERGED_KEY`) whose quads are in back-to-front\n * order, or — above `MAX_SORTED_QUADS` or for meshes that aren't made of\n * quads — the transparent meshes ordered by decreasing depth of their\n * center, each with its own quads sorted. `order` changes when only the\n * indices must be uploaded again.\n */\nexport const createDepthSorter = () => {\n const sorted = new Map<string, SortedMesh>();\n const centers = new Map<\n string,\n { version: number; center: [number, number, number] }\n >();\n let merged: { signature: string; item: MeshItem } | null = null;\n let mergedVersion = 0;\n let view: Float32Array | null = null;\n let orthographic = false;\n let order = 0;\n let scratch: { keys: Float32Array; counts: Uint32Array } | null = null;\n\n /** Sorts the quads of a mesh when stale or when the camera moved */\n const sortMesh = (\n item: MeshItem,\n frame: Frame3D,\n moved: boolean,\n seen: Set<string>,\n ): MeshItem => {\n const quads = item.indices.length / 6;\n if (!isQuadMesh(item) || quads < 2 || quads > MAX_SORTED_QUADS) return item;\n seen.add(item.key);\n let entry = sorted.get(item.key);\n const stale =\n !entry || entry.version !== item.version || entry.source !== item.indices;\n if (stale || moved) {\n if (!scratch || scratch.keys.length < quads)\n scratch = {\n keys: new Float32Array(Math.max(quads, 1024)),\n counts: new Uint32Array(BUCKETS),\n };\n const out =\n entry && !stale && entry.indices.length === item.indices.length\n ? entry.indices\n : new Uint32Array(item.indices.length);\n sortQuads(\n item.indices,\n new Float32Array(item.vertices),\n frame.viewProj,\n frame.orthographic,\n out,\n scratch,\n );\n entry = {\n version: item.version,\n source: item.indices,\n indices: out,\n order: ++order,\n };\n sorted.set(item.key, entry);\n }\n return { ...item, indices: entry!.indices, order: entry!.order };\n };\n\n /** Camera depth of the center of a mesh (larger: farther) */\n const centerDepth = (item: MeshItem, frame: Frame3D) => {\n let entry = centers.get(item.key);\n if (!entry || entry.version !== item.version) {\n entry = { version: item.version, center: meshCenter(item) };\n centers.set(item.key, entry);\n }\n const m = frame.viewProj;\n const row = frame.orthographic ? 2 : 3;\n const [x, y, z] = entry.center;\n return (\n (m[row] ?? 0) * x +\n (m[row + 4] ?? 0) * y +\n (m[row + 8] ?? 0) * z +\n (m[row + 12] ?? 0)\n );\n };\n\n return (items: readonly Item3D[], frame: Frame3D): readonly Item3D[] => {\n const transparent = items.filter(isTransparentMesh);\n if (transparent.length === 0) {\n sorted.clear();\n centers.clear();\n merged = null;\n return items;\n }\n const moved =\n !sameMatrix(view, frame.viewProj) || orthographic !== frame.orthographic;\n if (moved) {\n view = Float32Array.from(frame.viewProj);\n orthographic = frame.orthographic;\n }\n const seen = new Set<string>();\n let quads = 0;\n for (const m of transparent) quads += m.indices.length / 6;\n const result: Item3D[] = [];\n if (\n transparent.length >= 2 &&\n quads <= MAX_SORTED_QUADS &&\n transparent.every(isQuadMesh)\n ) {\n // one item: every transparent quad sorted together\n const signature = transparent\n .map((m) => `${m.key}@${m.version}@${m.opacity}`)\n .join(\"|\");\n if (!merged || merged.signature !== signature) {\n merged = {\n signature,\n item: mergeMeshes(transparent, MERGED_KEY, ++mergedVersion),\n };\n }\n const item = sortMesh(merged.item, frame, moved, seen);\n let placed = false;\n for (const it of items) {\n if (!isTransparentMesh(it)) result.push(it);\n else if (!placed) {\n result.push(item);\n placed = true;\n }\n }\n } else {\n merged = null;\n // farthest mesh first, its own quads sorted\n const ordered = transparent\n .map((m) => ({ m, depth: centerDepth(m, frame) }))\n .sort((a, b) => b.depth - a.depth)\n .map((e) => sortMesh(e.m, frame, moved, seen));\n let next = 0;\n for (const it of items)\n result.push(isTransparentMesh(it) ? ordered[next++]! : it);\n }\n for (const key of sorted.keys()) if (!seen.has(key)) sorted.delete(key);\n for (const key of centers.keys())\n if (!transparent.some((m) => m.key === key)) centers.delete(key);\n return result;\n };\n};\n"],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import { Frame3D, Item3D } from './render-types.cjs';
2
- /** Largest transparent mesh sorted (quads): a 512 × 512 surface grid */
1
+ import { Frame3D, Item3D, MeshItem } from './render-types.cjs';
2
+ /** Largest number of transparent quads sorted: a 512 × 512 surface grid */
3
3
  export declare const MAX_SORTED_QUADS: number;
4
+ /** Key of the merged transparent meshes */
5
+ export declare const MERGED_KEY = "transparent";
4
6
  /**
5
7
  * Writes into `out` the quads of `indices` (6 indices each) ordered by
6
8
  * decreasing camera depth: view depth (clip w) in perspective, clip z in
@@ -10,9 +12,18 @@ export declare const sortQuads: (indices: Uint32Array, vertices: Float32Array, v
10
12
  keys: Float32Array;
11
13
  counts: Uint32Array;
12
14
  }) => void;
15
+ /**
16
+ * One transparent item made of several meshes: vertices concatenated (the
17
+ * opacity of every mesh multiplies the alpha of its vertex colors), indices
18
+ * shifted. Drawn with opacity 1, without writing depth.
19
+ */
20
+ export declare const mergeMeshes: (meshes: readonly MeshItem[], key: string, version: number) => MeshItem;
13
21
  /**
14
22
  * Sorter of the transparent meshes: returns the items with the transparent
15
- * meshes' indices in back-to-front order (`order` changes when only the
16
- * indices must be uploaded again)
23
+ * meshes merged into one item (`MERGED_KEY`) whose quads are in back-to-front
24
+ * order, or — above `MAX_SORTED_QUADS` or for meshes that aren't made of
25
+ * quads — the transparent meshes ordered by decreasing depth of their
26
+ * center, each with its own quads sorted. `order` changes when only the
27
+ * indices must be uploaded again.
17
28
  */
18
29
  export declare const createDepthSorter: () => (items: readonly Item3D[], frame: Frame3D) => readonly Item3D[];
@@ -1,6 +1,8 @@
1
- import { Frame3D, Item3D } from './render-types.js';
2
- /** Largest transparent mesh sorted (quads): a 512 × 512 surface grid */
1
+ import { Frame3D, Item3D, MeshItem } from './render-types.js';
2
+ /** Largest number of transparent quads sorted: a 512 × 512 surface grid */
3
3
  export declare const MAX_SORTED_QUADS: number;
4
+ /** Key of the merged transparent meshes */
5
+ export declare const MERGED_KEY = "transparent";
4
6
  /**
5
7
  * Writes into `out` the quads of `indices` (6 indices each) ordered by
6
8
  * decreasing camera depth: view depth (clip w) in perspective, clip z in
@@ -10,9 +12,18 @@ export declare const sortQuads: (indices: Uint32Array, vertices: Float32Array, v
10
12
  keys: Float32Array;
11
13
  counts: Uint32Array;
12
14
  }) => void;
15
+ /**
16
+ * One transparent item made of several meshes: vertices concatenated (the
17
+ * opacity of every mesh multiplies the alpha of its vertex colors), indices
18
+ * shifted. Drawn with opacity 1, without writing depth.
19
+ */
20
+ export declare const mergeMeshes: (meshes: readonly MeshItem[], key: string, version: number) => MeshItem;
13
21
  /**
14
22
  * Sorter of the transparent meshes: returns the items with the transparent
15
- * meshes' indices in back-to-front order (`order` changes when only the
16
- * indices must be uploaded again)
23
+ * meshes merged into one item (`MERGED_KEY`) whose quads are in back-to-front
24
+ * order, or — above `MAX_SORTED_QUADS` or for meshes that aren't made of
25
+ * quads — the transparent meshes ordered by decreasing depth of their
26
+ * center, each with its own quads sorted. `order` changes when only the
27
+ * indices must be uploaded again.
17
28
  */
18
29
  export declare const createDepthSorter: () => (items: readonly Item3D[], frame: Frame3D) => readonly Item3D[];
@@ -1,14 +1,15 @@
1
+ import { writesDepth as e } from "./render-types.js";
1
2
  //#region src/engine/three-d/sort.ts
2
- var e = 1 << 18, t = 65536, n = 7, r = (e, r, i, a, o, s) => {
3
- let c = Math.floor(e.length / 6), { keys: l, counts: u } = s, d = a ? 2 : 3, f = i[d] ?? 0, p = i[d + 4] ?? 0, m = i[d + 8] ?? 0, h = Infinity, g = -Infinity;
4
- for (let t = 0; t < c; t++) {
5
- let i = t * 6, a = 0, o = 0, s = 0;
6
- for (let t = 0; t < 4; t++) {
7
- let c = (e[i + (t === 3 ? 5 : t)] ?? 0) * n;
8
- a += r[c] ?? 0, o += r[c + 1] ?? 0, s += r[c + 2] ?? 0;
3
+ var t = 1 << 18, n = "transparent", r = 65536, i = 7, a = (e, t, n, a, o, s) => {
4
+ let c = Math.floor(e.length / 6), { keys: l, counts: u } = s, d = a ? 2 : 3, f = n[d] ?? 0, p = n[d + 4] ?? 0, m = n[d + 8] ?? 0, h = Infinity, g = -Infinity;
5
+ for (let n = 0; n < c; n++) {
6
+ let r = n * 6, a = 0, o = 0, s = 0;
7
+ for (let n = 0; n < 4; n++) {
8
+ let c = (e[r + (n === 3 ? 5 : n)] ?? 0) * i;
9
+ a += t[c] ?? 0, o += t[c + 1] ?? 0, s += t[c + 2] ?? 0;
9
10
  }
10
11
  let c = f * a + p * o + m * s;
11
- l[t] = c, c < h && (h = c), c > g && (g = c);
12
+ l[n] = c, c < h && (h = c), c > g && (g = c);
12
13
  }
13
14
  u.fill(0);
14
15
  let _ = g > h ? 65535 / (g - h) : 0;
@@ -17,7 +18,7 @@ var e = 1 << 18, t = 65536, n = 7, r = (e, r, i, a, o, s) => {
17
18
  l[e] = t, u[t] = (u[t] ?? 0) + 1;
18
19
  }
19
20
  let v = 0;
20
- for (let e = 0; e < t; e++) {
21
+ for (let e = 0; e < r; e++) {
21
22
  let t = u[e] ?? 0;
22
23
  u[e] = v, v += t;
23
24
  }
@@ -27,45 +28,118 @@ var e = 1 << 18, t = 65536, n = 7, r = (e, r, i, a, o, s) => {
27
28
  let i = t * 6;
28
29
  for (let t = 0; t < 6; t++) o[r + t] = e[i + t] ?? 0;
29
30
  }
30
- }, i = (e, t) => {
31
+ }, o = (e, t, n) => {
32
+ let r = 0, i = 0;
33
+ for (let t of e) r += t.vertexCount, i += t.indices.length;
34
+ let a = /* @__PURE__ */ new ArrayBuffer(r * 28), o = new Uint8Array(a), s = new Uint32Array(i), c = 0, l = 0;
35
+ for (let t of e) {
36
+ let e = Math.min(t.vertices.byteLength, t.vertexCount * 28);
37
+ o.set(new Uint8Array(t.vertices, 0, e), c * 28);
38
+ let n = Math.max(0, Math.min(1, t.opacity));
39
+ if (n < 1) for (let e = 0; e < t.vertexCount; e++) {
40
+ let t = (c + e) * 28 + 27;
41
+ o[t] = Math.round((o[t] ?? 0) * n);
42
+ }
43
+ let r = t.indices;
44
+ for (let e = 0; e < r.length; e++) s[l + e] = (r[e] ?? 0) + c;
45
+ c += t.vertexCount, l += r.length;
46
+ }
47
+ return {
48
+ kind: "mesh",
49
+ key: t,
50
+ version: n,
51
+ opacity: 1,
52
+ transparent: !0,
53
+ vertices: a,
54
+ vertexCount: r,
55
+ indices: s
56
+ };
57
+ }, s = (e, t) => {
31
58
  if (!e) return !1;
32
59
  for (let n = 0; n < 16; n++) if (e[n] !== t[n]) return !1;
33
60
  return !0;
34
- }, a = () => {
35
- let e = /* @__PURE__ */ new Map(), n = null, a = !1, o = 0, s = null, c = (e) => e.kind === "mesh" && e.opacity < 1 && e.indices.length >= 12 && e.indices.length % 6 == 0 && e.indices.length / 6 <= 262144;
36
- return (l, u) => {
37
- if (!l.some(c)) return e.clear(), l;
38
- let d = !i(n, u.viewProj) || a !== u.orthographic;
39
- d && (n = Float32Array.from(u.viewProj), a = u.orthographic);
40
- let f = /* @__PURE__ */ new Set(), p = l.map((n) => {
41
- if (!c(n)) return n;
42
- f.add(n.key);
43
- let i = e.get(n.key), a = !i || i.version !== n.version || i.source !== n.indices;
44
- if (a || d) {
45
- let c = n.indices.length / 6;
46
- (!s || s.keys.length < c) && (s = {
47
- keys: new Float32Array(Math.max(c, 1024)),
48
- counts: new Uint32Array(t)
49
- });
50
- let l = i && !a && i.indices.length === n.indices.length ? i.indices : new Uint32Array(n.indices.length);
51
- r(n.indices, new Float32Array(n.vertices), u.viewProj, u.orthographic, l, s), i = {
52
- version: n.version,
53
- source: n.indices,
54
- indices: l,
55
- order: ++o
56
- }, e.set(n.key, i);
57
- }
58
- return {
59
- ...n,
60
- indices: i.indices,
61
- order: i.order
62
- };
63
- });
64
- for (let t of e.keys()) f.has(t) || e.delete(t);
65
- return p;
61
+ }, c = (t) => t.kind === "mesh" && !e(t), l = (e) => e.indices.length > 0 && e.indices.length % 6 == 0, u = (e) => {
62
+ let t = new Float32Array(e.vertices, 0, Math.min(e.vertices.byteLength / 4, e.vertexCount * i)), n = [
63
+ Infinity,
64
+ Infinity,
65
+ Infinity
66
+ ], r = [
67
+ -Infinity,
68
+ -Infinity,
69
+ -Infinity
70
+ ];
71
+ for (let e = 0; e + 2 < t.length; e += i) for (let i = 0; i < 3; i++) {
72
+ let a = t[e + i] ?? 0;
73
+ a < (n[i] ?? 0) && (n[i] = a), a > (r[i] ?? 0) && (r[i] = a);
74
+ }
75
+ return [
76
+ 0,
77
+ 1,
78
+ 2
79
+ ].map((e) => n[e] <= r[e] ? (n[e] + r[e]) / 2 : 0);
80
+ }, d = () => {
81
+ let e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), i = null, d = 0, f = null, p = !1, m = 0, h = null, g = (t, n, i, o) => {
82
+ let s = t.indices.length / 6;
83
+ if (!l(t) || s < 2 || s > 262144) return t;
84
+ o.add(t.key);
85
+ let c = e.get(t.key), u = !c || c.version !== t.version || c.source !== t.indices;
86
+ if (u || i) {
87
+ (!h || h.keys.length < s) && (h = {
88
+ keys: new Float32Array(Math.max(s, 1024)),
89
+ counts: new Uint32Array(r)
90
+ });
91
+ let i = c && !u && c.indices.length === t.indices.length ? c.indices : new Uint32Array(t.indices.length);
92
+ a(t.indices, new Float32Array(t.vertices), n.viewProj, n.orthographic, i, h), c = {
93
+ version: t.version,
94
+ source: t.indices,
95
+ indices: i,
96
+ order: ++m
97
+ }, e.set(t.key, c);
98
+ }
99
+ return {
100
+ ...t,
101
+ indices: c.indices,
102
+ order: c.order
103
+ };
104
+ }, _ = (e, n) => {
105
+ let r = t.get(e.key);
106
+ (!r || r.version !== e.version) && (r = {
107
+ version: e.version,
108
+ center: u(e)
109
+ }, t.set(e.key, r));
110
+ let i = n.viewProj, a = n.orthographic ? 2 : 3, [o, s, c] = r.center;
111
+ return (i[a] ?? 0) * o + (i[a + 4] ?? 0) * s + (i[a + 8] ?? 0) * c + (i[a + 12] ?? 0);
112
+ };
113
+ return (r, a) => {
114
+ let u = r.filter(c);
115
+ if (u.length === 0) return e.clear(), t.clear(), i = null, r;
116
+ let m = !s(f, a.viewProj) || p !== a.orthographic;
117
+ m && (f = Float32Array.from(a.viewProj), p = a.orthographic);
118
+ let h = /* @__PURE__ */ new Set(), v = 0;
119
+ for (let e of u) v += e.indices.length / 6;
120
+ let y = [];
121
+ if (u.length >= 2 && v <= 262144 && u.every(l)) {
122
+ let e = u.map((e) => `${e.key}@${e.version}@${e.opacity}`).join("|");
123
+ (!i || i.signature !== e) && (i = {
124
+ signature: e,
125
+ item: o(u, n, ++d)
126
+ });
127
+ let t = g(i.item, a, m, h), s = !1;
128
+ for (let e of r) c(e) ? s || (y.push(t), s = !0) : y.push(e);
129
+ } else {
130
+ i = null;
131
+ let e = u.map((e) => ({
132
+ m: e,
133
+ depth: _(e, a)
134
+ })).sort((e, t) => t.depth - e.depth).map((e) => g(e.m, a, m, h)), t = 0;
135
+ for (let n of r) y.push(c(n) ? e[t++] : n);
136
+ }
137
+ for (let t of e.keys()) h.has(t) || e.delete(t);
138
+ for (let e of t.keys()) u.some((t) => t.key === e) || t.delete(e);
139
+ return y;
66
140
  };
67
141
  };
68
142
  //#endregion
69
- export { e as MAX_SORTED_QUADS, a as createDepthSorter, r as sortQuads };
143
+ export { t as MAX_SORTED_QUADS, n as MERGED_KEY, d as createDepthSorter, o as mergeMeshes, a as sortQuads };
70
144
 
71
145
  //# sourceMappingURL=sort.js.map