minerva-design 1.2.0 → 1.3.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 (256) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/dist/charts/canvas.d.cts +4 -1
  3. package/dist/charts/canvas.d.ts +4 -1
  4. package/dist/charts/core.cjs +1 -1
  5. package/dist/charts/core.d.cts +5 -2
  6. package/dist/charts/core.d.ts +5 -2
  7. package/dist/charts/core.js +6 -4
  8. package/dist/charts/engine/canvas.cjs +1 -1
  9. package/dist/charts/engine/canvas.cjs.map +1 -1
  10. package/dist/charts/engine/canvas.js +65 -53
  11. package/dist/charts/engine/canvas.js.map +1 -1
  12. package/dist/charts/engine/chart.cjs +1 -2
  13. package/dist/charts/engine/chart.cjs.map +1 -1
  14. package/dist/charts/engine/chart.js +342 -323
  15. package/dist/charts/engine/chart.js.map +1 -1
  16. package/dist/charts/engine/color.cjs +1 -1
  17. package/dist/charts/engine/color.cjs.map +1 -1
  18. package/dist/charts/engine/color.d.cts +17 -0
  19. package/dist/charts/engine/color.d.ts +17 -0
  20. package/dist/charts/engine/color.js +27 -3
  21. package/dist/charts/engine/color.js.map +1 -1
  22. package/dist/charts/engine/controller.cjs +2 -2
  23. package/dist/charts/engine/controller.cjs.map +1 -1
  24. package/dist/charts/engine/controller.d.cts +6 -0
  25. package/dist/charts/engine/controller.d.ts +6 -0
  26. package/dist/charts/engine/controller.js +317 -253
  27. package/dist/charts/engine/controller.js.map +1 -1
  28. package/dist/charts/engine/curve.cjs +2 -0
  29. package/dist/charts/engine/curve.cjs.map +1 -0
  30. package/dist/charts/engine/curve.d.cts +15 -0
  31. package/dist/charts/engine/curve.d.ts +15 -0
  32. package/dist/charts/engine/curve.js +56 -0
  33. package/dist/charts/engine/curve.js.map +1 -0
  34. package/dist/charts/engine/data.cjs +1 -1
  35. package/dist/charts/engine/data.cjs.map +1 -1
  36. package/dist/charts/engine/data.d.cts +15 -2
  37. package/dist/charts/engine/data.d.ts +15 -2
  38. package/dist/charts/engine/data.js +98 -38
  39. package/dist/charts/engine/data.js.map +1 -1
  40. package/dist/charts/engine/dom.cjs +1 -1
  41. package/dist/charts/engine/dom.cjs.map +1 -1
  42. package/dist/charts/engine/dom.d.cts +5 -3
  43. package/dist/charts/engine/dom.d.ts +5 -3
  44. package/dist/charts/engine/dom.js +27 -22
  45. package/dist/charts/engine/dom.js.map +1 -1
  46. package/dist/charts/engine/items.cjs +1 -1
  47. package/dist/charts/engine/items.cjs.map +1 -1
  48. package/dist/charts/engine/items.js +132 -61
  49. package/dist/charts/engine/items.js.map +1 -1
  50. package/dist/charts/engine/model.cjs +1 -1
  51. package/dist/charts/engine/model.cjs.map +1 -1
  52. package/dist/charts/engine/model.d.cts +30 -3
  53. package/dist/charts/engine/model.d.ts +30 -3
  54. package/dist/charts/engine/model.js +225 -108
  55. package/dist/charts/engine/model.js.map +1 -1
  56. package/dist/charts/engine/overlay.cjs +1 -1
  57. package/dist/charts/engine/overlay.cjs.map +1 -1
  58. package/dist/charts/engine/overlay.d.cts +2 -0
  59. package/dist/charts/engine/overlay.d.ts +2 -0
  60. package/dist/charts/engine/overlay.js +16 -16
  61. package/dist/charts/engine/overlay.js.map +1 -1
  62. package/dist/charts/engine/presets.cjs +2 -2
  63. package/dist/charts/engine/presets.cjs.map +1 -1
  64. package/dist/charts/engine/presets.d.cts +71 -5
  65. package/dist/charts/engine/presets.d.ts +71 -5
  66. package/dist/charts/engine/presets.js +120 -33
  67. package/dist/charts/engine/presets.js.map +1 -1
  68. package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
  69. package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
  70. package/dist/charts/engine/renderers/canvas2d.js +149 -111
  71. package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
  72. package/dist/charts/engine/renderers/range.cjs +1 -1
  73. package/dist/charts/engine/renderers/range.cjs.map +1 -1
  74. package/dist/charts/engine/renderers/range.js +4 -4
  75. package/dist/charts/engine/renderers/range.js.map +1 -1
  76. package/dist/charts/engine/renderers/shaders.cjs +37 -19
  77. package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
  78. package/dist/charts/engine/renderers/shaders.d.cts +2 -2
  79. package/dist/charts/engine/renderers/shaders.d.ts +2 -2
  80. package/dist/charts/engine/renderers/shaders.js +37 -19
  81. package/dist/charts/engine/renderers/shaders.js.map +1 -1
  82. package/dist/charts/engine/renderers/types.cjs.map +1 -1
  83. package/dist/charts/engine/renderers/types.d.cts +11 -4
  84. package/dist/charts/engine/renderers/types.d.ts +11 -4
  85. package/dist/charts/engine/renderers/types.js.map +1 -1
  86. package/dist/charts/engine/renderers/webgl2.cjs +1 -1
  87. package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
  88. package/dist/charts/engine/renderers/webgl2.js +33 -12
  89. package/dist/charts/engine/renderers/webgl2.js.map +1 -1
  90. package/dist/charts/engine/renderers/webgpu.cjs +1 -1
  91. package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
  92. package/dist/charts/engine/renderers/webgpu.js +18 -15
  93. package/dist/charts/engine/renderers/webgpu.js.map +1 -1
  94. package/dist/charts/engine/scene.cjs +1 -1
  95. package/dist/charts/engine/scene.cjs.map +1 -1
  96. package/dist/charts/engine/scene.d.cts +19 -6
  97. package/dist/charts/engine/scene.d.ts +19 -6
  98. package/dist/charts/engine/scene.js +201 -89
  99. package/dist/charts/engine/scene.js.map +1 -1
  100. package/dist/charts/engine/shapes/canvas.cjs +2 -0
  101. package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
  102. package/dist/charts/engine/shapes/canvas.d.cts +58 -0
  103. package/dist/charts/engine/shapes/canvas.d.ts +58 -0
  104. package/dist/charts/engine/shapes/canvas.js +159 -0
  105. package/dist/charts/engine/shapes/canvas.js.map +1 -0
  106. package/dist/charts/engine/shapes/chart.cjs +2 -0
  107. package/dist/charts/engine/shapes/chart.cjs.map +1 -0
  108. package/dist/charts/engine/shapes/chart.d.cts +6 -0
  109. package/dist/charts/engine/shapes/chart.d.ts +6 -0
  110. package/dist/charts/engine/shapes/chart.js +273 -0
  111. package/dist/charts/engine/shapes/chart.js.map +1 -0
  112. package/dist/charts/engine/shapes/draw.cjs +2 -0
  113. package/dist/charts/engine/shapes/draw.cjs.map +1 -0
  114. package/dist/charts/engine/shapes/draw.d.cts +20 -0
  115. package/dist/charts/engine/shapes/draw.d.ts +20 -0
  116. package/dist/charts/engine/shapes/draw.js +152 -0
  117. package/dist/charts/engine/shapes/draw.js.map +1 -0
  118. package/dist/charts/engine/shapes/funnel.cjs +2 -0
  119. package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
  120. package/dist/charts/engine/shapes/funnel.d.cts +6 -0
  121. package/dist/charts/engine/shapes/funnel.d.ts +6 -0
  122. package/dist/charts/engine/shapes/funnel.js +149 -0
  123. package/dist/charts/engine/shapes/funnel.js.map +1 -0
  124. package/dist/charts/engine/shapes/gauge.cjs +2 -0
  125. package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
  126. package/dist/charts/engine/shapes/gauge.d.cts +7 -0
  127. package/dist/charts/engine/shapes/gauge.d.ts +7 -0
  128. package/dist/charts/engine/shapes/gauge.js +173 -0
  129. package/dist/charts/engine/shapes/gauge.js.map +1 -0
  130. package/dist/charts/engine/shapes/hit.cjs +2 -0
  131. package/dist/charts/engine/shapes/hit.cjs.map +1 -0
  132. package/dist/charts/engine/shapes/hit.d.cts +28 -0
  133. package/dist/charts/engine/shapes/hit.d.ts +28 -0
  134. package/dist/charts/engine/shapes/hit.js +124 -0
  135. package/dist/charts/engine/shapes/hit.js.map +1 -0
  136. package/dist/charts/engine/shapes/index.d.cts +9 -0
  137. package/dist/charts/engine/shapes/index.d.ts +9 -0
  138. package/dist/charts/engine/shapes/layout.cjs +3 -0
  139. package/dist/charts/engine/shapes/layout.cjs.map +1 -0
  140. package/dist/charts/engine/shapes/layout.d.cts +88 -0
  141. package/dist/charts/engine/shapes/layout.d.ts +88 -0
  142. package/dist/charts/engine/shapes/layout.js +266 -0
  143. package/dist/charts/engine/shapes/layout.js.map +1 -0
  144. package/dist/charts/engine/shapes/pie.cjs +2 -0
  145. package/dist/charts/engine/shapes/pie.cjs.map +1 -0
  146. package/dist/charts/engine/shapes/pie.d.cts +20 -0
  147. package/dist/charts/engine/shapes/pie.d.ts +20 -0
  148. package/dist/charts/engine/shapes/pie.js +302 -0
  149. package/dist/charts/engine/shapes/pie.js.map +1 -0
  150. package/dist/charts/engine/shapes/radar.cjs +2 -0
  151. package/dist/charts/engine/shapes/radar.cjs.map +1 -0
  152. package/dist/charts/engine/shapes/radar.d.cts +8 -0
  153. package/dist/charts/engine/shapes/radar.d.ts +8 -0
  154. package/dist/charts/engine/shapes/radar.js +197 -0
  155. package/dist/charts/engine/shapes/radar.js.map +1 -0
  156. package/dist/charts/engine/shapes/runtime.cjs +2 -0
  157. package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
  158. package/dist/charts/engine/shapes/runtime.d.cts +29 -0
  159. package/dist/charts/engine/shapes/runtime.d.ts +29 -0
  160. package/dist/charts/engine/shapes/runtime.js +97 -0
  161. package/dist/charts/engine/shapes/runtime.js.map +1 -0
  162. package/dist/charts/engine/shapes/scene.cjs +2 -0
  163. package/dist/charts/engine/shapes/scene.cjs.map +1 -0
  164. package/dist/charts/engine/shapes/scene.d.cts +257 -0
  165. package/dist/charts/engine/shapes/scene.d.ts +257 -0
  166. package/dist/charts/engine/shapes/scene.js +123 -0
  167. package/dist/charts/engine/shapes/scene.js.map +1 -0
  168. package/dist/charts/engine/shapes/treemap.cjs +2 -0
  169. package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
  170. package/dist/charts/engine/shapes/treemap.d.cts +14 -0
  171. package/dist/charts/engine/shapes/treemap.d.ts +14 -0
  172. package/dist/charts/engine/shapes/treemap.js +213 -0
  173. package/dist/charts/engine/shapes/treemap.js.map +1 -0
  174. package/dist/charts/engine/shapes/types.d.cts +292 -0
  175. package/dist/charts/engine/shapes/types.d.ts +292 -0
  176. package/dist/charts/engine/signature.cjs +2 -0
  177. package/dist/charts/engine/signature.cjs.map +1 -0
  178. package/dist/charts/engine/signature.d.cts +9 -0
  179. package/dist/charts/engine/signature.d.ts +9 -0
  180. package/dist/charts/engine/signature.js +13 -0
  181. package/dist/charts/engine/signature.js.map +1 -0
  182. package/dist/charts/engine/theme.cjs +1 -1
  183. package/dist/charts/engine/theme.cjs.map +1 -1
  184. package/dist/charts/engine/theme.d.cts +10 -1
  185. package/dist/charts/engine/theme.d.ts +10 -1
  186. package/dist/charts/engine/theme.js +40 -16
  187. package/dist/charts/engine/theme.js.map +1 -1
  188. package/dist/charts/engine/types.d.cts +70 -9
  189. package/dist/charts/engine/types.d.ts +70 -9
  190. package/dist/charts/index.cjs +1 -1
  191. package/dist/charts/index.d.cts +4 -2
  192. package/dist/charts/index.d.ts +4 -2
  193. package/dist/charts/index.js +8 -5
  194. package/dist/charts/react/Chart.cjs +1 -1
  195. package/dist/charts/react/Chart.cjs.map +1 -1
  196. package/dist/charts/react/Chart.d.cts +8 -1
  197. package/dist/charts/react/Chart.d.ts +8 -1
  198. package/dist/charts/react/Chart.js +66 -47
  199. package/dist/charts/react/Chart.js.map +1 -1
  200. package/dist/charts/react/charts.cjs +1 -1
  201. package/dist/charts/react/charts.cjs.map +1 -1
  202. package/dist/charts/react/charts.d.cts +10 -2
  203. package/dist/charts/react/charts.d.ts +10 -2
  204. package/dist/charts/react/charts.js +174 -51
  205. package/dist/charts/react/charts.js.map +1 -1
  206. package/dist/charts/react/shapes.cjs +2 -0
  207. package/dist/charts/react/shapes.cjs.map +1 -0
  208. package/dist/charts/react/shapes.d.cts +255 -0
  209. package/dist/charts/react/shapes.d.ts +255 -0
  210. package/dist/charts/react/shapes.js +242 -0
  211. package/dist/charts/react/shapes.js.map +1 -0
  212. package/dist/charts/react/types.d.cts +73 -4
  213. package/dist/charts/react/types.d.ts +73 -4
  214. package/dist/native/charts/src/engine/color.cjs +1 -1
  215. package/dist/native/charts/src/engine/color.cjs.map +1 -1
  216. package/dist/native/charts/src/engine/color.js +12 -3
  217. package/dist/native/charts/src/engine/color.js.map +1 -1
  218. package/dist/native/charts/src/engine/controller.cjs +2 -2
  219. package/dist/native/charts/src/engine/controller.cjs.map +1 -1
  220. package/dist/native/charts/src/engine/controller.js +334 -270
  221. package/dist/native/charts/src/engine/controller.js.map +1 -1
  222. package/dist/native/charts/src/engine/curve.cjs +2 -0
  223. package/dist/native/charts/src/engine/curve.cjs.map +1 -0
  224. package/dist/native/charts/src/engine/curve.js +56 -0
  225. package/dist/native/charts/src/engine/curve.js.map +1 -0
  226. package/dist/native/charts/src/engine/data.cjs +1 -1
  227. package/dist/native/charts/src/engine/data.cjs.map +1 -1
  228. package/dist/native/charts/src/engine/data.js +98 -38
  229. package/dist/native/charts/src/engine/data.js.map +1 -1
  230. package/dist/native/charts/src/engine/model.cjs +1 -1
  231. package/dist/native/charts/src/engine/model.cjs.map +1 -1
  232. package/dist/native/charts/src/engine/model.js +229 -112
  233. package/dist/native/charts/src/engine/model.js.map +1 -1
  234. package/dist/native/charts/src/engine/overlay.cjs +1 -1
  235. package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
  236. package/dist/native/charts/src/engine/overlay.js +16 -16
  237. package/dist/native/charts/src/engine/overlay.js.map +1 -1
  238. package/dist/native/charts/src/engine/presets.cjs +1 -1
  239. package/dist/native/charts/src/engine/presets.cjs.map +1 -1
  240. package/dist/native/charts/src/engine/presets.js +11 -4
  241. package/dist/native/charts/src/engine/presets.js.map +1 -1
  242. package/dist/native/charts/src/engine/scene.cjs +1 -1
  243. package/dist/native/charts/src/engine/scene.cjs.map +1 -1
  244. package/dist/native/charts/src/engine/scene.js +209 -97
  245. package/dist/native/charts/src/engine/scene.js.map +1 -1
  246. package/dist/native/charts/src/engine/theme.cjs.map +1 -1
  247. package/dist/native/charts/src/engine/theme.js.map +1 -1
  248. package/dist/native/components/Chart/scene.cjs +1 -1
  249. package/dist/native/components/Chart/scene.cjs.map +1 -1
  250. package/dist/native/components/Chart/scene.js +31 -19
  251. package/dist/native/components/Chart/scene.js.map +1 -1
  252. package/dist/native/source/components/Chart/scene.tsx +54 -20
  253. package/dist/taro/index.js +1059 -579
  254. package/dist/uni/charts-canvas.js +3 -1
  255. package/dist/weapp/controls.js +966 -225
  256. package/package.json +1 -1
@@ -62,21 +62,21 @@ struct Out {
62
62
  @builtin(position) pos: vec4f,
63
63
  @location(0) t: f32,
64
64
  };
65
- @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {
65
+ @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec3f, @location(1) b: vec3f) -> Out {
66
66
  var out: Out;
67
- if (gap(a) || gap(b)) {
67
+ if (gap(a.xy) || gap(b.xy) || abs(a.z) > 1e37 || abs(b.z) > 1e37) {
68
68
  out.pos = HIDDEN;
69
69
  return out;
70
70
  }
71
71
  let c = corner(vi);
72
72
  let p = select(a, b, c.y > 0.5);
73
- let y = select(u.params.x, p.y, c.x > 0.5);
73
+ let y = select(p.z, p.y, c.x > 0.5);
74
74
  out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);
75
75
  out.t = c.x;
76
76
  return out;
77
77
  }
78
78
  @fragment fn fs(v: Out) -> @location(0) vec4f {
79
- let a = u.color.a * u.params.y * (0.3 + 0.7 * v.t);
79
+ let a = u.color.a * u.params.y * (0.25 + 0.75 * v.t * v.t);
80
80
  return vec4f(u.color.rgb * a, a);
81
81
  }
82
82
  `,r=`${e}
@@ -84,33 +84,42 @@ struct Out {
84
84
  @builtin(position) pos: vec4f,
85
85
  @location(0) local: vec2f,
86
86
  @location(1) @interpolate(flat) hs: vec2f,
87
+ @location(2) @interpolate(flat) color: vec4f,
87
88
  };
88
- @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f) -> Out {
89
+ @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f, @location(1) color: vec4f) -> Out {
89
90
  var out: Out;
90
91
  if (gap(inst.xy) || abs(inst.z) > 1e37) {
91
92
  out.pos = HIDDEN;
92
93
  return out;
93
94
  }
94
- let hw = max(abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x, 0.5);
95
+ let dpr = u.viewport.z;
96
+ let rawHw = abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x;
95
97
  let p0 = toPx(inst.xy);
96
98
  let y1 = toPx(vec2f(inst.x, inst.z)).y;
97
99
  let lo = min(p0.y, y1);
98
100
  let hi = max(p0.y, y1);
99
- let hsz = vec2f(hw, (hi - lo) * 0.5);
101
+ // the gap between cells fades out on small cells (dense heatmaps stay
102
+ // solid); without a gap, cells overlap by a pixel so no seam shows
103
+ let fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);
104
+ let inset = u.params.z * dpr * fade - select(0.0, 0.5 * (1.0 - fade), u.params.z > 0.0);
105
+ let minHalf = u.params.w * dpr;
106
+ let hw = max(max(rawHw - inset, 0.5), minHalf);
107
+ let hsz = vec2f(hw, max((hi - lo) * 0.5 - inset, minHalf));
100
108
  let center = vec2f(p0.x, (lo + hi) * 0.5);
101
109
  let ext = hsz + vec2f(1.0);
102
110
  let c = corner(vi) * 2.0 - 1.0;
103
111
  out.pos = pxToClip(center + c * ext);
104
112
  out.local = c * ext;
105
113
  out.hs = hsz;
114
+ out.color = color;
106
115
  return out;
107
116
  }
108
117
  @fragment fn fs(v: Out) -> @location(0) vec4f {
109
118
  let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));
110
119
  let q = abs(v.local) - v.hs + vec2f(r);
111
120
  let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;
112
- let a = clamp(0.5 - d, 0.0, 1.0) * u.color.a;
113
- return vec4f(u.color.rgb * a, a);
121
+ let a = clamp(0.5 - d, 0.0, 1.0) * v.color.a;
122
+ return vec4f(v.color.rgb * a, a);
114
123
  }
115
124
  `,i=`${e}
116
125
  struct Out {
@@ -186,37 +195,45 @@ void main() {
186
195
  float a = clamp(u_params.x - dist + 0.5, 0.0, 1.0) * u_color.a;
187
196
  outColor = vec4(u_color.rgb * a, a);
188
197
  }`},c={vertex:`${o}
189
- in vec2 a_a;
190
- in vec2 a_b;
198
+ in vec3 a_a;
199
+ in vec3 a_b;
191
200
  out float v_t;
192
201
  void main() {
193
202
  v_t = 0.0;
194
- if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }
203
+ if (gap(a_a.xy) || gap(a_b.xy) || abs(a_a.z) > 1e37 || abs(a_b.z) > 1e37) { gl_Position = HIDDEN; return; }
195
204
  vec2 c = corner();
196
- vec2 p = c.y > 0.5 ? a_b : a_a;
197
- float y = c.x > 0.5 ? p.y : u_params.x;
205
+ vec3 p = c.y > 0.5 ? a_b : a_a;
206
+ float y = c.x > 0.5 ? p.y : p.z;
198
207
  gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);
199
208
  v_t = c.x;
200
209
  }`,fragment:`${a}
201
210
  in float v_t;
202
211
  out vec4 outColor;
203
212
  void main() {
204
- float a = u_color.a * u_params.y * (0.3 + 0.7 * v_t);
213
+ float a = u_color.a * u_params.y * (0.25 + 0.75 * v_t * v_t);
205
214
  outColor = vec4(u_color.rgb * a, a);
206
215
  }`},l={vertex:`${o}
207
216
  in vec3 a_inst;
217
+ in vec4 a_color;
208
218
  out vec2 v_local;
209
219
  flat out vec2 v_half;
220
+ flat out vec4 v_color;
210
221
  void main() {
211
222
  v_local = vec2(0.0);
212
223
  v_half = vec2(0.0);
224
+ v_color = a_color;
213
225
  if (gap(a_inst.xy) || abs(a_inst.z) > 1e37) { gl_Position = HIDDEN; return; }
214
- float hw = max(abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x, 0.5);
226
+ float dpr = u_viewport.z;
227
+ float rawHw = abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x;
215
228
  vec2 p0 = toPx(a_inst.xy);
216
229
  float y1 = toPx(vec2(a_inst.x, a_inst.z)).y;
217
230
  float lo = min(p0.y, y1);
218
231
  float hi = max(p0.y, y1);
219
- vec2 hsz = vec2(hw, (hi - lo) * 0.5);
232
+ float fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);
233
+ float inset = u_params.z * dpr * fade - (u_params.z > 0.0 ? 0.5 * (1.0 - fade) : 0.0);
234
+ float minHalf = u_params.w * dpr;
235
+ float hw = max(max(rawHw - inset, 0.5), minHalf);
236
+ vec2 hsz = vec2(hw, max((hi - lo) * 0.5 - inset, minHalf));
220
237
  vec2 center = vec2(p0.x, (lo + hi) * 0.5);
221
238
  vec2 ext = hsz + vec2(1.0);
222
239
  vec2 c = corner() * 2.0 - 1.0;
@@ -226,13 +243,14 @@ void main() {
226
243
  }`,fragment:`${a}
227
244
  in vec2 v_local;
228
245
  flat in vec2 v_half;
246
+ flat in vec4 v_color;
229
247
  out vec4 outColor;
230
248
  void main() {
231
249
  float r = min(u_params.y * u_viewport.z, min(v_half.x, v_half.y));
232
250
  vec2 q = abs(v_local) - v_half + vec2(r);
233
251
  float d = length(max(q, vec2(0.0))) + min(max(q.x, q.y), 0.0) - r;
234
- float a = clamp(0.5 - d, 0.0, 1.0) * u_color.a;
235
- outColor = vec4(u_color.rgb * a, a);
252
+ float a = clamp(0.5 - d, 0.0, 1.0) * v_color.a;
253
+ outColor = vec4(v_color.rgb * a, a);
236
254
  }`},u={vertex:`${o}
237
255
  in vec2 a_pos;
238
256
  in float a_size;
@@ -1 +1 @@
1
- {"version":3,"file":"shaders.cjs","names":["WGSL_COMMON","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","GLSL_HEADER","GLSL_VERTEX_COMMON","GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER"],"sources":["../../../../../charts/src/engine/renderers/shaders.ts"],"sourcesContent":["// WGSL (WebGPU) and GLSL ES 3.0 (WebGL2) programs. Every primitive is an\n// instanced 4-vertex triangle strip; anti-aliasing comes from signed\n// distance functions in pixel space (no MSAA needed).\n//\n// Uniforms (both backends):\n// xform = (xScale, xOffset, yScale, yOffset) relative data -> clip\n// viewport = (width px, height px, dpr, 0)\n// color = straight RGBA of the series\n// params = line: (half width px) | area: (baseline, opacity)\n// bar: (half width in x units, radius px) | scatter: (opacity, stroke px)\n// Output colors are premultiplied.\n\nconst WGSL_COMMON = /* wgsl */ `\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const WGSL_LINE = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) len: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let pa = toPx(a);\n let pb = toPx(b);\n let d = pb - pa;\n let len = length(d);\n var dir = vec2f(1.0, 0.0);\n if (len > 1e-6) { dir = d / len; }\n let nrm = vec2f(-dir.y, dir.x);\n let hw = u.params.x + 1.0;\n let c = corner(vi);\n let along = mix(-hw, len + hw, c.x);\n let across = mix(-hw, hw, c.y);\n out.pos = pxToClip(pa + dir * along + nrm * across);\n out.local = vec2f(along, across);\n out.len = len;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let x = clamp(v.local.x, 0.0, v.len);\n let dist = length(vec2f(v.local.x - x, v.local.y));\n let a = clamp(u.params.x - dist + 0.5, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_AREA = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(u.params.x, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.3 + 0.7 * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_BAR = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let hw = max(abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x, 0.5);\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n let hsz = vec2f(hw, (hi - lo) * 0.5);\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_SCATTER = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) r: f32,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) p: vec2f, @location(1) size: f32, @location(2) color: vec4f) -> Out {\n var out: Out;\n if (gap(p) || !(size > 0.0)) {\n out.pos = HIDDEN;\n return out;\n }\n let r = size * 0.5 * u.viewport.z;\n let ext = r + 1.0;\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(toPx(p) + c * ext);\n out.local = c * ext;\n out.r = r;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let d = length(v.local) - v.r;\n let cover = clamp(0.5 - d, 0.0, 1.0);\n let inner = clamp(0.5 - (d + u.params.y * u.viewport.z), 0.0, 1.0);\n let a = v.color.a * (inner * u.params.x + (cover - inner));\n return vec4f(v.color.rgb * a, a);\n}\n`;\n\nconst GLSL_HEADER = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 u_xform;\nuniform vec4 u_viewport;\nuniform vec4 u_color;\nuniform vec4 u_params;\n`;\n\nconst GLSL_VERTEX_COMMON = /* glsl */ `${GLSL_HEADER}\nbool gap(vec2 p) { return abs(p.x) > 1e37 || abs(p.y) > 1e37; }\nvec2 toClip(vec2 p) { return vec2(p.x * u_xform.x + u_xform.y, p.y * u_xform.z + u_xform.w); }\nvec2 toPx(vec2 p) { return (toClip(p) * 0.5 + 0.5) * u_viewport.xy; }\nvec4 pxToClip(vec2 p) { return vec4(p / u_viewport.xy * 2.0 - 1.0, 0.0, 1.0); }\nvec2 corner() { return vec2(float(gl_VertexID & 1), float(gl_VertexID >> 1)); }\nconst vec4 HIDDEN = vec4(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const GLSL_LINE = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_a;\nin vec2 a_b;\nout vec2 v_local;\nout float v_len;\nvoid main() {\n v_local = vec2(0.0);\n v_len = 0.0;\n if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }\n vec2 pa = toPx(a_a);\n vec2 pb = toPx(a_b);\n vec2 d = pb - pa;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float hw = u_params.x + 1.0;\n vec2 c = corner();\n float along = mix(-hw, len + hw, c.x);\n float across = mix(-hw, hw, c.y);\n gl_Position = pxToClip(pa + dir * along + nrm * across);\n v_local = vec2(along, across);\n v_len = len;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nin float v_len;\nout vec4 outColor;\nvoid main() {\n float x = clamp(v_local.x, 0.0, v_len);\n float dist = length(vec2(v_local.x - x, v_local.y));\n float a = clamp(u_params.x - dist + 0.5, 0.0, 1.0) * u_color.a;\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_AREA = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_a;\nin vec2 a_b;\nout float v_t;\nvoid main() {\n v_t = 0.0;\n if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }\n vec2 c = corner();\n vec2 p = c.y > 0.5 ? a_b : a_a;\n float y = c.x > 0.5 ? p.y : u_params.x;\n gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);\n v_t = c.x;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin float v_t;\nout vec4 outColor;\nvoid main() {\n float a = u_color.a * u_params.y * (0.3 + 0.7 * v_t);\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_BAR = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec3 a_inst;\nout vec2 v_local;\nflat out vec2 v_half;\nvoid main() {\n v_local = vec2(0.0);\n v_half = vec2(0.0);\n if (gap(a_inst.xy) || abs(a_inst.z) > 1e37) { gl_Position = HIDDEN; return; }\n float hw = max(abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x, 0.5);\n vec2 p0 = toPx(a_inst.xy);\n float y1 = toPx(vec2(a_inst.x, a_inst.z)).y;\n float lo = min(p0.y, y1);\n float hi = max(p0.y, y1);\n vec2 hsz = vec2(hw, (hi - lo) * 0.5);\n vec2 center = vec2(p0.x, (lo + hi) * 0.5);\n vec2 ext = hsz + vec2(1.0);\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(center + c * ext);\n v_local = c * ext;\n v_half = hsz;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in vec2 v_half;\nout vec4 outColor;\nvoid main() {\n float r = min(u_params.y * u_viewport.z, min(v_half.x, v_half.y));\n vec2 q = abs(v_local) - v_half + vec2(r);\n float d = length(max(q, vec2(0.0))) + min(max(q.x, q.y), 0.0) - r;\n float a = clamp(0.5 - d, 0.0, 1.0) * u_color.a;\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_SCATTER = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_pos;\nin float a_size;\nin vec4 a_color;\nout vec2 v_local;\nflat out float v_r;\nflat out vec4 v_color;\nvoid main() {\n v_local = vec2(0.0);\n v_r = 0.0;\n v_color = a_color;\n if (gap(a_pos) || !(a_size > 0.0)) { gl_Position = HIDDEN; return; }\n float r = a_size * 0.5 * u_viewport.z;\n float ext = r + 1.0;\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(toPx(a_pos) + c * ext);\n v_local = c * ext;\n v_r = r;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in float v_r;\nflat in vec4 v_color;\nout vec4 outColor;\nvoid main() {\n float d = length(v_local) - v_r;\n float cover = clamp(0.5 - d, 0.0, 1.0);\n float inner = clamp(0.5 - (d + u_params.y * u_viewport.z), 0.0, 1.0);\n float a = v_color.a * (inner * u_params.x + (cover - inner));\n outColor = vec4(v_color.rgb * a, a);\n}`,\n};\n"],"mappings":"AAYA,IAAMA,EAAyB;;;;;;;;;;;;;;;;;;;;;;;;;EA2BlBC,EAAuB,GAAGD,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCtCE,EAAuB,GAAGF,EAAY;;;;;;;;;;;;;;;;;;;;;;EAwBtCG,EAAsB,GAAGH,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAmCrCI,EAA0B,GAAGJ,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BhDK,EAAyB;;;;;;EAQzBC,EAAgC,GAAGD,EAAY;;;;;;;EASxCE,EAAY,CACvB,OAAmB,GAAGD,EAAmB;;;;;;;;;;;;;;;;;;;;;;GAuBzC,SAAqB,GAAGD,EAAY;;;;;;;;;EAUtC,EAEaG,EAAY,CACvB,OAAmB,GAAGF,EAAmB;;;;;;;;;;;;GAazC,SAAqB,GAAGD,EAAY;;;;;;EAOtC,EAEaI,EAAW,CACtB,OAAmB,GAAGH,EAAmB;;;;;;;;;;;;;;;;;;;;GAqBzC,SAAqB,GAAGD,EAAY;;;;;;;;;;EAWtC,EAEaK,EAAe,CAC1B,OAAmB,GAAGJ,EAAmB;;;;;;;;;;;;;;;;;;GAmBzC,SAAqB,GAAGD,EAAY;;;;;;;;;;;EAYtC"}
1
+ {"version":3,"file":"shaders.cjs","names":["WGSL_COMMON","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","GLSL_HEADER","GLSL_VERTEX_COMMON","GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER"],"sources":["../../../../../charts/src/engine/renderers/shaders.ts"],"sourcesContent":["// WGSL (WebGPU) and GLSL ES 3.0 (WebGL2) programs. Every primitive is an\n// instanced 4-vertex triangle strip; anti-aliasing comes from signed\n// distance functions in pixel space (no MSAA needed).\n//\n// Uniforms (both backends):\n// xform = (xScale, xOffset, yScale, yOffset) relative data -> clip\n// viewport = (width px, height px, dpr, 0)\n// color = straight RGBA of the series\n// params = line: (half width px) | area: (_, opacity)\n// bar: (half width in x units, radius px, inset px, min half px)\n// scatter: (opacity, stroke px)\n// Bars and scatter dots carry their own color (unorm8x4 per instance).\n// Output colors are premultiplied.\n\nconst WGSL_COMMON = /* wgsl */ `\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const WGSL_LINE = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) len: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let pa = toPx(a);\n let pb = toPx(b);\n let d = pb - pa;\n let len = length(d);\n var dir = vec2f(1.0, 0.0);\n if (len > 1e-6) { dir = d / len; }\n let nrm = vec2f(-dir.y, dir.x);\n let hw = u.params.x + 1.0;\n let c = corner(vi);\n let along = mix(-hw, len + hw, c.x);\n let across = mix(-hw, hw, c.y);\n out.pos = pxToClip(pa + dir * along + nrm * across);\n out.local = vec2f(along, across);\n out.len = len;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let x = clamp(v.local.x, 0.0, v.len);\n let dist = length(vec2f(v.local.x - x, v.local.y));\n let a = clamp(u.params.x - dist + 0.5, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_AREA = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec3f, @location(1) b: vec3f) -> Out {\n var out: Out;\n if (gap(a.xy) || gap(b.xy) || abs(a.z) > 1e37 || abs(b.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(p.z, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.25 + 0.75 * v.t * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_BAR = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f, @location(1) color: vec4f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let dpr = u.viewport.z;\n let rawHw = abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x;\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n // the gap between cells fades out on small cells (dense heatmaps stay\n // solid); without a gap, cells overlap by a pixel so no seam shows\n let fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);\n let inset = u.params.z * dpr * fade - select(0.0, 0.5 * (1.0 - fade), u.params.z > 0.0);\n let minHalf = u.params.w * dpr;\n let hw = max(max(rawHw - inset, 0.5), minHalf);\n let hsz = vec2f(hw, max((hi - lo) * 0.5 - inset, minHalf));\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * v.color.a;\n return vec4f(v.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_SCATTER = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) r: f32,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) p: vec2f, @location(1) size: f32, @location(2) color: vec4f) -> Out {\n var out: Out;\n if (gap(p) || !(size > 0.0)) {\n out.pos = HIDDEN;\n return out;\n }\n let r = size * 0.5 * u.viewport.z;\n let ext = r + 1.0;\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(toPx(p) + c * ext);\n out.local = c * ext;\n out.r = r;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let d = length(v.local) - v.r;\n let cover = clamp(0.5 - d, 0.0, 1.0);\n let inner = clamp(0.5 - (d + u.params.y * u.viewport.z), 0.0, 1.0);\n let a = v.color.a * (inner * u.params.x + (cover - inner));\n return vec4f(v.color.rgb * a, a);\n}\n`;\n\nconst GLSL_HEADER = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 u_xform;\nuniform vec4 u_viewport;\nuniform vec4 u_color;\nuniform vec4 u_params;\n`;\n\nconst GLSL_VERTEX_COMMON = /* glsl */ `${GLSL_HEADER}\nbool gap(vec2 p) { return abs(p.x) > 1e37 || abs(p.y) > 1e37; }\nvec2 toClip(vec2 p) { return vec2(p.x * u_xform.x + u_xform.y, p.y * u_xform.z + u_xform.w); }\nvec2 toPx(vec2 p) { return (toClip(p) * 0.5 + 0.5) * u_viewport.xy; }\nvec4 pxToClip(vec2 p) { return vec4(p / u_viewport.xy * 2.0 - 1.0, 0.0, 1.0); }\nvec2 corner() { return vec2(float(gl_VertexID & 1), float(gl_VertexID >> 1)); }\nconst vec4 HIDDEN = vec4(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const GLSL_LINE = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_a;\nin vec2 a_b;\nout vec2 v_local;\nout float v_len;\nvoid main() {\n v_local = vec2(0.0);\n v_len = 0.0;\n if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }\n vec2 pa = toPx(a_a);\n vec2 pb = toPx(a_b);\n vec2 d = pb - pa;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float hw = u_params.x + 1.0;\n vec2 c = corner();\n float along = mix(-hw, len + hw, c.x);\n float across = mix(-hw, hw, c.y);\n gl_Position = pxToClip(pa + dir * along + nrm * across);\n v_local = vec2(along, across);\n v_len = len;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nin float v_len;\nout vec4 outColor;\nvoid main() {\n float x = clamp(v_local.x, 0.0, v_len);\n float dist = length(vec2(v_local.x - x, v_local.y));\n float a = clamp(u_params.x - dist + 0.5, 0.0, 1.0) * u_color.a;\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_AREA = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec3 a_a;\nin vec3 a_b;\nout float v_t;\nvoid main() {\n v_t = 0.0;\n if (gap(a_a.xy) || gap(a_b.xy) || abs(a_a.z) > 1e37 || abs(a_b.z) > 1e37) { gl_Position = HIDDEN; return; }\n vec2 c = corner();\n vec3 p = c.y > 0.5 ? a_b : a_a;\n float y = c.x > 0.5 ? p.y : p.z;\n gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);\n v_t = c.x;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin float v_t;\nout vec4 outColor;\nvoid main() {\n float a = u_color.a * u_params.y * (0.25 + 0.75 * v_t * v_t);\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_BAR = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec3 a_inst;\nin vec4 a_color;\nout vec2 v_local;\nflat out vec2 v_half;\nflat out vec4 v_color;\nvoid main() {\n v_local = vec2(0.0);\n v_half = vec2(0.0);\n v_color = a_color;\n if (gap(a_inst.xy) || abs(a_inst.z) > 1e37) { gl_Position = HIDDEN; return; }\n float dpr = u_viewport.z;\n float rawHw = abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x;\n vec2 p0 = toPx(a_inst.xy);\n float y1 = toPx(vec2(a_inst.x, a_inst.z)).y;\n float lo = min(p0.y, y1);\n float hi = max(p0.y, y1);\n float fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);\n float inset = u_params.z * dpr * fade - (u_params.z > 0.0 ? 0.5 * (1.0 - fade) : 0.0);\n float minHalf = u_params.w * dpr;\n float hw = max(max(rawHw - inset, 0.5), minHalf);\n vec2 hsz = vec2(hw, max((hi - lo) * 0.5 - inset, minHalf));\n vec2 center = vec2(p0.x, (lo + hi) * 0.5);\n vec2 ext = hsz + vec2(1.0);\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(center + c * ext);\n v_local = c * ext;\n v_half = hsz;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in vec2 v_half;\nflat in vec4 v_color;\nout vec4 outColor;\nvoid main() {\n float r = min(u_params.y * u_viewport.z, min(v_half.x, v_half.y));\n vec2 q = abs(v_local) - v_half + vec2(r);\n float d = length(max(q, vec2(0.0))) + min(max(q.x, q.y), 0.0) - r;\n float a = clamp(0.5 - d, 0.0, 1.0) * v_color.a;\n outColor = vec4(v_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_SCATTER = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_pos;\nin float a_size;\nin vec4 a_color;\nout vec2 v_local;\nflat out float v_r;\nflat out vec4 v_color;\nvoid main() {\n v_local = vec2(0.0);\n v_r = 0.0;\n v_color = a_color;\n if (gap(a_pos) || !(a_size > 0.0)) { gl_Position = HIDDEN; return; }\n float r = a_size * 0.5 * u_viewport.z;\n float ext = r + 1.0;\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(toPx(a_pos) + c * ext);\n v_local = c * ext;\n v_r = r;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in float v_r;\nflat in vec4 v_color;\nout vec4 outColor;\nvoid main() {\n float d = length(v_local) - v_r;\n float cover = clamp(0.5 - d, 0.0, 1.0);\n float inner = clamp(0.5 - (d + u_params.y * u_viewport.z), 0.0, 1.0);\n float a = v_color.a * (inner * u_params.x + (cover - inner));\n outColor = vec4(v_color.rgb * a, a);\n}`,\n};\n"],"mappings":"AAcA,IAAMA,EAAyB;;;;;;;;;;;;;;;;;;;;;;;;;EA2BlBC,EAAuB,GAAGD,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAoCtCE,EAAuB,GAAGF,EAAY;;;;;;;;;;;;;;;;;;;;;;EAwBtCG,EAAsB,GAAGH,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4CrCI,EAA0B,GAAGJ,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BhDK,EAAyB;;;;;;EAQzBC,EAAgC,GAAGD,EAAY;;;;;;;EASxCE,EAAY,CACvB,OAAmB,GAAGD,EAAmB;;;;;;;;;;;;;;;;;;;;;;GAuBzC,SAAqB,GAAGD,EAAY;;;;;;;;;EAUtC,EAEaG,EAAY,CACvB,OAAmB,GAAGF,EAAmB;;;;;;;;;;;;GAazC,SAAqB,GAAGD,EAAY;;;;;;EAOtC,EAEaI,EAAW,CACtB,OAAmB,GAAGH,EAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BzC,SAAqB,GAAGD,EAAY;;;;;;;;;;;EAYtC,EAEaK,EAAe,CAC1B,OAAmB,GAAGJ,EAAmB;;;;;;;;;;;;;;;;;;GAmBzC,SAAqB,GAAGD,EAAY;;;;;;;;;;;EAYtC"}
@@ -1,6 +1,6 @@
1
1
  export declare const WGSL_LINE = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) len: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let pa = toPx(a);\n let pb = toPx(b);\n let d = pb - pa;\n let len = length(d);\n var dir = vec2f(1.0, 0.0);\n if (len > 1e-6) { dir = d / len; }\n let nrm = vec2f(-dir.y, dir.x);\n let hw = u.params.x + 1.0;\n let c = corner(vi);\n let along = mix(-hw, len + hw, c.x);\n let across = mix(-hw, hw, c.y);\n out.pos = pxToClip(pa + dir * along + nrm * across);\n out.local = vec2f(along, across);\n out.len = len;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let x = clamp(v.local.x, 0.0, v.len);\n let dist = length(vec2f(v.local.x - x, v.local.y));\n let a = clamp(u.params.x - dist + 0.5, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n";
2
- export declare const WGSL_AREA = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(u.params.x, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.3 + 0.7 * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n";
3
- export declare const WGSL_BAR = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let hw = max(abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x, 0.5);\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n let hsz = vec2f(hw, (hi - lo) * 0.5);\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n";
2
+ export declare const WGSL_AREA = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec3f, @location(1) b: vec3f) -> Out {\n var out: Out;\n if (gap(a.xy) || gap(b.xy) || abs(a.z) > 1e37 || abs(b.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(p.z, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.25 + 0.75 * v.t * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n";
3
+ export declare const WGSL_BAR = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f, @location(1) color: vec4f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let dpr = u.viewport.z;\n let rawHw = abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x;\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n // the gap between cells fades out on small cells (dense heatmaps stay\n // solid); without a gap, cells overlap by a pixel so no seam shows\n let fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);\n let inset = u.params.z * dpr * fade - select(0.0, 0.5 * (1.0 - fade), u.params.z > 0.0);\n let minHalf = u.params.w * dpr;\n let hw = max(max(rawHw - inset, 0.5), minHalf);\n let hsz = vec2f(hw, max((hi - lo) * 0.5 - inset, minHalf));\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * v.color.a;\n return vec4f(v.color.rgb * a, a);\n}\n";
4
4
  export declare const WGSL_SCATTER = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) r: f32,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) p: vec2f, @location(1) size: f32, @location(2) color: vec4f) -> Out {\n var out: Out;\n if (gap(p) || !(size > 0.0)) {\n out.pos = HIDDEN;\n return out;\n }\n let r = size * 0.5 * u.viewport.z;\n let ext = r + 1.0;\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(toPx(p) + c * ext);\n out.local = c * ext;\n out.r = r;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let d = length(v.local) - v.r;\n let cover = clamp(0.5 - d, 0.0, 1.0);\n let inner = clamp(0.5 - (d + u.params.y * u.viewport.z), 0.0, 1.0);\n let a = v.color.a * (inner * u.params.x + (cover - inner));\n return vec4f(v.color.rgb * a, a);\n}\n";
5
5
  export declare const GLSL_LINE: {
6
6
  vertex: string;
@@ -1,6 +1,6 @@
1
1
  export declare const WGSL_LINE = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) len: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let pa = toPx(a);\n let pb = toPx(b);\n let d = pb - pa;\n let len = length(d);\n var dir = vec2f(1.0, 0.0);\n if (len > 1e-6) { dir = d / len; }\n let nrm = vec2f(-dir.y, dir.x);\n let hw = u.params.x + 1.0;\n let c = corner(vi);\n let along = mix(-hw, len + hw, c.x);\n let across = mix(-hw, hw, c.y);\n out.pos = pxToClip(pa + dir * along + nrm * across);\n out.local = vec2f(along, across);\n out.len = len;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let x = clamp(v.local.x, 0.0, v.len);\n let dist = length(vec2f(v.local.x - x, v.local.y));\n let a = clamp(u.params.x - dist + 0.5, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n";
2
- export declare const WGSL_AREA = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(u.params.x, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.3 + 0.7 * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n";
3
- export declare const WGSL_BAR = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let hw = max(abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x, 0.5);\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n let hsz = vec2f(hw, (hi - lo) * 0.5);\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n";
2
+ export declare const WGSL_AREA = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec3f, @location(1) b: vec3f) -> Out {\n var out: Out;\n if (gap(a.xy) || gap(b.xy) || abs(a.z) > 1e37 || abs(b.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(p.z, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.25 + 0.75 * v.t * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n";
3
+ export declare const WGSL_BAR = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f, @location(1) color: vec4f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let dpr = u.viewport.z;\n let rawHw = abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x;\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n // the gap between cells fades out on small cells (dense heatmaps stay\n // solid); without a gap, cells overlap by a pixel so no seam shows\n let fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);\n let inset = u.params.z * dpr * fade - select(0.0, 0.5 * (1.0 - fade), u.params.z > 0.0);\n let minHalf = u.params.w * dpr;\n let hw = max(max(rawHw - inset, 0.5), minHalf);\n let hsz = vec2f(hw, max((hi - lo) * 0.5 - inset, minHalf));\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * v.color.a;\n return vec4f(v.color.rgb * a, a);\n}\n";
4
4
  export declare const WGSL_SCATTER = "\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) r: f32,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) p: vec2f, @location(1) size: f32, @location(2) color: vec4f) -> Out {\n var out: Out;\n if (gap(p) || !(size > 0.0)) {\n out.pos = HIDDEN;\n return out;\n }\n let r = size * 0.5 * u.viewport.z;\n let ext = r + 1.0;\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(toPx(p) + c * ext);\n out.local = c * ext;\n out.r = r;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let d = length(v.local) - v.r;\n let cover = clamp(0.5 - d, 0.0, 1.0);\n let inner = clamp(0.5 - (d + u.params.y * u.viewport.z), 0.0, 1.0);\n let a = v.color.a * (inner * u.params.x + (cover - inner));\n return vec4f(v.color.rgb * a, a);\n}\n";
5
5
  export declare const GLSL_LINE: {
6
6
  vertex: string;
@@ -38,21 +38,21 @@ struct Out {
38
38
  @builtin(position) pos: vec4f,
39
39
  @location(0) t: f32,
40
40
  };
41
- @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {
41
+ @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec3f, @location(1) b: vec3f) -> Out {
42
42
  var out: Out;
43
- if (gap(a) || gap(b)) {
43
+ if (gap(a.xy) || gap(b.xy) || abs(a.z) > 1e37 || abs(b.z) > 1e37) {
44
44
  out.pos = HIDDEN;
45
45
  return out;
46
46
  }
47
47
  let c = corner(vi);
48
48
  let p = select(a, b, c.y > 0.5);
49
- let y = select(u.params.x, p.y, c.x > 0.5);
49
+ let y = select(p.z, p.y, c.x > 0.5);
50
50
  out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);
51
51
  out.t = c.x;
52
52
  return out;
53
53
  }
54
54
  @fragment fn fs(v: Out) -> @location(0) vec4f {
55
- let a = u.color.a * u.params.y * (0.3 + 0.7 * v.t);
55
+ let a = u.color.a * u.params.y * (0.25 + 0.75 * v.t * v.t);
56
56
  return vec4f(u.color.rgb * a, a);
57
57
  }
58
58
  `, r = `${e}
@@ -60,33 +60,42 @@ struct Out {
60
60
  @builtin(position) pos: vec4f,
61
61
  @location(0) local: vec2f,
62
62
  @location(1) @interpolate(flat) hs: vec2f,
63
+ @location(2) @interpolate(flat) color: vec4f,
63
64
  };
64
- @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f) -> Out {
65
+ @vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f, @location(1) color: vec4f) -> Out {
65
66
  var out: Out;
66
67
  if (gap(inst.xy) || abs(inst.z) > 1e37) {
67
68
  out.pos = HIDDEN;
68
69
  return out;
69
70
  }
70
- let hw = max(abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x, 0.5);
71
+ let dpr = u.viewport.z;
72
+ let rawHw = abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x;
71
73
  let p0 = toPx(inst.xy);
72
74
  let y1 = toPx(vec2f(inst.x, inst.z)).y;
73
75
  let lo = min(p0.y, y1);
74
76
  let hi = max(p0.y, y1);
75
- let hsz = vec2f(hw, (hi - lo) * 0.5);
77
+ // the gap between cells fades out on small cells (dense heatmaps stay
78
+ // solid); without a gap, cells overlap by a pixel so no seam shows
79
+ let fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);
80
+ let inset = u.params.z * dpr * fade - select(0.0, 0.5 * (1.0 - fade), u.params.z > 0.0);
81
+ let minHalf = u.params.w * dpr;
82
+ let hw = max(max(rawHw - inset, 0.5), minHalf);
83
+ let hsz = vec2f(hw, max((hi - lo) * 0.5 - inset, minHalf));
76
84
  let center = vec2f(p0.x, (lo + hi) * 0.5);
77
85
  let ext = hsz + vec2f(1.0);
78
86
  let c = corner(vi) * 2.0 - 1.0;
79
87
  out.pos = pxToClip(center + c * ext);
80
88
  out.local = c * ext;
81
89
  out.hs = hsz;
90
+ out.color = color;
82
91
  return out;
83
92
  }
84
93
  @fragment fn fs(v: Out) -> @location(0) vec4f {
85
94
  let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));
86
95
  let q = abs(v.local) - v.hs + vec2f(r);
87
96
  let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;
88
- let a = clamp(0.5 - d, 0.0, 1.0) * u.color.a;
89
- return vec4f(u.color.rgb * a, a);
97
+ let a = clamp(0.5 - d, 0.0, 1.0) * v.color.a;
98
+ return vec4f(v.color.rgb * a, a);
90
99
  }
91
100
  `, i = `${e}
92
101
  struct Out {
@@ -160,15 +169,15 @@ void main() {
160
169
  }`
161
170
  }, c = {
162
171
  vertex: `${o}
163
- in vec2 a_a;
164
- in vec2 a_b;
172
+ in vec3 a_a;
173
+ in vec3 a_b;
165
174
  out float v_t;
166
175
  void main() {
167
176
  v_t = 0.0;
168
- if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }
177
+ if (gap(a_a.xy) || gap(a_b.xy) || abs(a_a.z) > 1e37 || abs(a_b.z) > 1e37) { gl_Position = HIDDEN; return; }
169
178
  vec2 c = corner();
170
- vec2 p = c.y > 0.5 ? a_b : a_a;
171
- float y = c.x > 0.5 ? p.y : u_params.x;
179
+ vec3 p = c.y > 0.5 ? a_b : a_a;
180
+ float y = c.x > 0.5 ? p.y : p.z;
172
181
  gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);
173
182
  v_t = c.x;
174
183
  }`,
@@ -176,24 +185,32 @@ void main() {
176
185
  in float v_t;
177
186
  out vec4 outColor;
178
187
  void main() {
179
- float a = u_color.a * u_params.y * (0.3 + 0.7 * v_t);
188
+ float a = u_color.a * u_params.y * (0.25 + 0.75 * v_t * v_t);
180
189
  outColor = vec4(u_color.rgb * a, a);
181
190
  }`
182
191
  }, l = {
183
192
  vertex: `${o}
184
193
  in vec3 a_inst;
194
+ in vec4 a_color;
185
195
  out vec2 v_local;
186
196
  flat out vec2 v_half;
197
+ flat out vec4 v_color;
187
198
  void main() {
188
199
  v_local = vec2(0.0);
189
200
  v_half = vec2(0.0);
201
+ v_color = a_color;
190
202
  if (gap(a_inst.xy) || abs(a_inst.z) > 1e37) { gl_Position = HIDDEN; return; }
191
- float hw = max(abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x, 0.5);
203
+ float dpr = u_viewport.z;
204
+ float rawHw = abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x;
192
205
  vec2 p0 = toPx(a_inst.xy);
193
206
  float y1 = toPx(vec2(a_inst.x, a_inst.z)).y;
194
207
  float lo = min(p0.y, y1);
195
208
  float hi = max(p0.y, y1);
196
- vec2 hsz = vec2(hw, (hi - lo) * 0.5);
209
+ float fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);
210
+ float inset = u_params.z * dpr * fade - (u_params.z > 0.0 ? 0.5 * (1.0 - fade) : 0.0);
211
+ float minHalf = u_params.w * dpr;
212
+ float hw = max(max(rawHw - inset, 0.5), minHalf);
213
+ vec2 hsz = vec2(hw, max((hi - lo) * 0.5 - inset, minHalf));
197
214
  vec2 center = vec2(p0.x, (lo + hi) * 0.5);
198
215
  vec2 ext = hsz + vec2(1.0);
199
216
  vec2 c = corner() * 2.0 - 1.0;
@@ -204,13 +221,14 @@ void main() {
204
221
  fragment: `${a}
205
222
  in vec2 v_local;
206
223
  flat in vec2 v_half;
224
+ flat in vec4 v_color;
207
225
  out vec4 outColor;
208
226
  void main() {
209
227
  float r = min(u_params.y * u_viewport.z, min(v_half.x, v_half.y));
210
228
  vec2 q = abs(v_local) - v_half + vec2(r);
211
229
  float d = length(max(q, vec2(0.0))) + min(max(q.x, q.y), 0.0) - r;
212
- float a = clamp(0.5 - d, 0.0, 1.0) * u_color.a;
213
- outColor = vec4(u_color.rgb * a, a);
230
+ float a = clamp(0.5 - d, 0.0, 1.0) * v_color.a;
231
+ outColor = vec4(v_color.rgb * a, a);
214
232
  }`
215
233
  }, u = {
216
234
  vertex: `${o}
@@ -1 +1 @@
1
- {"version":3,"file":"shaders.js","names":["WGSL_COMMON","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","GLSL_HEADER","GLSL_VERTEX_COMMON","GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER"],"sources":["../../../../../charts/src/engine/renderers/shaders.ts"],"sourcesContent":["// WGSL (WebGPU) and GLSL ES 3.0 (WebGL2) programs. Every primitive is an\n// instanced 4-vertex triangle strip; anti-aliasing comes from signed\n// distance functions in pixel space (no MSAA needed).\n//\n// Uniforms (both backends):\n// xform = (xScale, xOffset, yScale, yOffset) relative data -> clip\n// viewport = (width px, height px, dpr, 0)\n// color = straight RGBA of the series\n// params = line: (half width px) | area: (baseline, opacity)\n// bar: (half width in x units, radius px) | scatter: (opacity, stroke px)\n// Output colors are premultiplied.\n\nconst WGSL_COMMON = /* wgsl */ `\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const WGSL_LINE = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) len: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let pa = toPx(a);\n let pb = toPx(b);\n let d = pb - pa;\n let len = length(d);\n var dir = vec2f(1.0, 0.0);\n if (len > 1e-6) { dir = d / len; }\n let nrm = vec2f(-dir.y, dir.x);\n let hw = u.params.x + 1.0;\n let c = corner(vi);\n let along = mix(-hw, len + hw, c.x);\n let across = mix(-hw, hw, c.y);\n out.pos = pxToClip(pa + dir * along + nrm * across);\n out.local = vec2f(along, across);\n out.len = len;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let x = clamp(v.local.x, 0.0, v.len);\n let dist = length(vec2f(v.local.x - x, v.local.y));\n let a = clamp(u.params.x - dist + 0.5, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_AREA = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(u.params.x, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.3 + 0.7 * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_BAR = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let hw = max(abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x, 0.5);\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n let hsz = vec2f(hw, (hi - lo) * 0.5);\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_SCATTER = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) r: f32,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) p: vec2f, @location(1) size: f32, @location(2) color: vec4f) -> Out {\n var out: Out;\n if (gap(p) || !(size > 0.0)) {\n out.pos = HIDDEN;\n return out;\n }\n let r = size * 0.5 * u.viewport.z;\n let ext = r + 1.0;\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(toPx(p) + c * ext);\n out.local = c * ext;\n out.r = r;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let d = length(v.local) - v.r;\n let cover = clamp(0.5 - d, 0.0, 1.0);\n let inner = clamp(0.5 - (d + u.params.y * u.viewport.z), 0.0, 1.0);\n let a = v.color.a * (inner * u.params.x + (cover - inner));\n return vec4f(v.color.rgb * a, a);\n}\n`;\n\nconst GLSL_HEADER = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 u_xform;\nuniform vec4 u_viewport;\nuniform vec4 u_color;\nuniform vec4 u_params;\n`;\n\nconst GLSL_VERTEX_COMMON = /* glsl */ `${GLSL_HEADER}\nbool gap(vec2 p) { return abs(p.x) > 1e37 || abs(p.y) > 1e37; }\nvec2 toClip(vec2 p) { return vec2(p.x * u_xform.x + u_xform.y, p.y * u_xform.z + u_xform.w); }\nvec2 toPx(vec2 p) { return (toClip(p) * 0.5 + 0.5) * u_viewport.xy; }\nvec4 pxToClip(vec2 p) { return vec4(p / u_viewport.xy * 2.0 - 1.0, 0.0, 1.0); }\nvec2 corner() { return vec2(float(gl_VertexID & 1), float(gl_VertexID >> 1)); }\nconst vec4 HIDDEN = vec4(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const GLSL_LINE = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_a;\nin vec2 a_b;\nout vec2 v_local;\nout float v_len;\nvoid main() {\n v_local = vec2(0.0);\n v_len = 0.0;\n if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }\n vec2 pa = toPx(a_a);\n vec2 pb = toPx(a_b);\n vec2 d = pb - pa;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float hw = u_params.x + 1.0;\n vec2 c = corner();\n float along = mix(-hw, len + hw, c.x);\n float across = mix(-hw, hw, c.y);\n gl_Position = pxToClip(pa + dir * along + nrm * across);\n v_local = vec2(along, across);\n v_len = len;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nin float v_len;\nout vec4 outColor;\nvoid main() {\n float x = clamp(v_local.x, 0.0, v_len);\n float dist = length(vec2(v_local.x - x, v_local.y));\n float a = clamp(u_params.x - dist + 0.5, 0.0, 1.0) * u_color.a;\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_AREA = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_a;\nin vec2 a_b;\nout float v_t;\nvoid main() {\n v_t = 0.0;\n if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }\n vec2 c = corner();\n vec2 p = c.y > 0.5 ? a_b : a_a;\n float y = c.x > 0.5 ? p.y : u_params.x;\n gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);\n v_t = c.x;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin float v_t;\nout vec4 outColor;\nvoid main() {\n float a = u_color.a * u_params.y * (0.3 + 0.7 * v_t);\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_BAR = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec3 a_inst;\nout vec2 v_local;\nflat out vec2 v_half;\nvoid main() {\n v_local = vec2(0.0);\n v_half = vec2(0.0);\n if (gap(a_inst.xy) || abs(a_inst.z) > 1e37) { gl_Position = HIDDEN; return; }\n float hw = max(abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x, 0.5);\n vec2 p0 = toPx(a_inst.xy);\n float y1 = toPx(vec2(a_inst.x, a_inst.z)).y;\n float lo = min(p0.y, y1);\n float hi = max(p0.y, y1);\n vec2 hsz = vec2(hw, (hi - lo) * 0.5);\n vec2 center = vec2(p0.x, (lo + hi) * 0.5);\n vec2 ext = hsz + vec2(1.0);\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(center + c * ext);\n v_local = c * ext;\n v_half = hsz;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in vec2 v_half;\nout vec4 outColor;\nvoid main() {\n float r = min(u_params.y * u_viewport.z, min(v_half.x, v_half.y));\n vec2 q = abs(v_local) - v_half + vec2(r);\n float d = length(max(q, vec2(0.0))) + min(max(q.x, q.y), 0.0) - r;\n float a = clamp(0.5 - d, 0.0, 1.0) * u_color.a;\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_SCATTER = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_pos;\nin float a_size;\nin vec4 a_color;\nout vec2 v_local;\nflat out float v_r;\nflat out vec4 v_color;\nvoid main() {\n v_local = vec2(0.0);\n v_r = 0.0;\n v_color = a_color;\n if (gap(a_pos) || !(a_size > 0.0)) { gl_Position = HIDDEN; return; }\n float r = a_size * 0.5 * u_viewport.z;\n float ext = r + 1.0;\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(toPx(a_pos) + c * ext);\n v_local = c * ext;\n v_r = r;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in float v_r;\nflat in vec4 v_color;\nout vec4 outColor;\nvoid main() {\n float d = length(v_local) - v_r;\n float cover = clamp(0.5 - d, 0.0, 1.0);\n float inner = clamp(0.5 - (d + u_params.y * u_viewport.z), 0.0, 1.0);\n float a = v_color.a * (inner * u_params.x + (cover - inner));\n outColor = vec4(v_color.rgb * a, a);\n}`,\n};\n"],"mappings":";AAYA,IAAMA,IAAyB,mnBA2BlBC,IAAuB,GAAGD,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCtCE,IAAuB,GAAGF,EAAY;;;;;;;;;;;;;;;;;;;;;;GAwBtCG,IAAsB,GAAGH,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCrCI,IAA0B,GAAGJ,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BhDK,IAAyB,6IAQzBC,IAAgC,GAAGD,EAAY;;;;;;;GASxCE,IAAY;CACvB,QAAmB,GAAGD,EAAmB;;;;;;;;;;;;;;;;;;;;;;;CAuBzC,UAAqB,GAAGD,EAAY;;;;;;;;;;AAUtC,GAEaG,IAAY;CACvB,QAAmB,GAAGF,EAAmB;;;;;;;;;;;;;CAazC,UAAqB,GAAGD,EAAY;;;;;;;AAOtC,GAEaI,IAAW;CACtB,QAAmB,GAAGH,EAAmB;;;;;;;;;;;;;;;;;;;;;CAqBzC,UAAqB,GAAGD,EAAY;;;;;;;;;;;AAWtC,GAEaK,IAAe;CAC1B,QAAmB,GAAGJ,EAAmB;;;;;;;;;;;;;;;;;;;CAmBzC,UAAqB,GAAGD,EAAY;;;;;;;;;;;;AAYtC"}
1
+ {"version":3,"file":"shaders.js","names":["WGSL_COMMON","WGSL_LINE","WGSL_AREA","WGSL_BAR","WGSL_SCATTER","GLSL_HEADER","GLSL_VERTEX_COMMON","GLSL_LINE","GLSL_AREA","GLSL_BAR","GLSL_SCATTER"],"sources":["../../../../../charts/src/engine/renderers/shaders.ts"],"sourcesContent":["// WGSL (WebGPU) and GLSL ES 3.0 (WebGL2) programs. Every primitive is an\n// instanced 4-vertex triangle strip; anti-aliasing comes from signed\n// distance functions in pixel space (no MSAA needed).\n//\n// Uniforms (both backends):\n// xform = (xScale, xOffset, yScale, yOffset) relative data -> clip\n// viewport = (width px, height px, dpr, 0)\n// color = straight RGBA of the series\n// params = line: (half width px) | area: (_, opacity)\n// bar: (half width in x units, radius px, inset px, min half px)\n// scatter: (opacity, stroke px)\n// Bars and scatter dots carry their own color (unorm8x4 per instance).\n// Output colors are premultiplied.\n\nconst WGSL_COMMON = /* wgsl */ `\nstruct U {\n xform: vec4f,\n viewport: vec4f,\n color: vec4f,\n params: vec4f,\n};\n@group(0) @binding(0) var<uniform> u: U;\n\nfn gap(p: vec2f) -> bool {\n return abs(p.x) > 1e37 || abs(p.y) > 1e37;\n}\nfn toClip(p: vec2f) -> vec2f {\n return vec2f(p.x * u.xform.x + u.xform.y, p.y * u.xform.z + u.xform.w);\n}\nfn toPx(p: vec2f) -> vec2f {\n return (toClip(p) * 0.5 + 0.5) * u.viewport.xy;\n}\nfn pxToClip(p: vec2f) -> vec4f {\n return vec4f(p / u.viewport.xy * 2.0 - 1.0, 0.0, 1.0);\n}\nfn corner(vi: u32) -> vec2f {\n return vec2f(f32(vi & 1u), f32(vi >> 1u));\n}\nconst HIDDEN = vec4f(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const WGSL_LINE = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) len: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec2f, @location(1) b: vec2f) -> Out {\n var out: Out;\n if (gap(a) || gap(b)) {\n out.pos = HIDDEN;\n return out;\n }\n let pa = toPx(a);\n let pb = toPx(b);\n let d = pb - pa;\n let len = length(d);\n var dir = vec2f(1.0, 0.0);\n if (len > 1e-6) { dir = d / len; }\n let nrm = vec2f(-dir.y, dir.x);\n let hw = u.params.x + 1.0;\n let c = corner(vi);\n let along = mix(-hw, len + hw, c.x);\n let across = mix(-hw, hw, c.y);\n out.pos = pxToClip(pa + dir * along + nrm * across);\n out.local = vec2f(along, across);\n out.len = len;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let x = clamp(v.local.x, 0.0, v.len);\n let dist = length(vec2f(v.local.x - x, v.local.y));\n let a = clamp(u.params.x - dist + 0.5, 0.0, 1.0) * u.color.a;\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_AREA = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) t: f32,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) a: vec3f, @location(1) b: vec3f) -> Out {\n var out: Out;\n if (gap(a.xy) || gap(b.xy) || abs(a.z) > 1e37 || abs(b.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let c = corner(vi);\n let p = select(a, b, c.y > 0.5);\n let y = select(p.z, p.y, c.x > 0.5);\n out.pos = vec4f(toClip(vec2f(p.x, y)), 0.0, 1.0);\n out.t = c.x;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let a = u.color.a * u.params.y * (0.25 + 0.75 * v.t * v.t);\n return vec4f(u.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_BAR = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) hs: vec2f,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) inst: vec3f, @location(1) color: vec4f) -> Out {\n var out: Out;\n if (gap(inst.xy) || abs(inst.z) > 1e37) {\n out.pos = HIDDEN;\n return out;\n }\n let dpr = u.viewport.z;\n let rawHw = abs(u.params.x * u.xform.x) * 0.5 * u.viewport.x;\n let p0 = toPx(inst.xy);\n let y1 = toPx(vec2f(inst.x, inst.z)).y;\n let lo = min(p0.y, y1);\n let hi = max(p0.y, y1);\n // the gap between cells fades out on small cells (dense heatmaps stay\n // solid); without a gap, cells overlap by a pixel so no seam shows\n let fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);\n let inset = u.params.z * dpr * fade - select(0.0, 0.5 * (1.0 - fade), u.params.z > 0.0);\n let minHalf = u.params.w * dpr;\n let hw = max(max(rawHw - inset, 0.5), minHalf);\n let hsz = vec2f(hw, max((hi - lo) * 0.5 - inset, minHalf));\n let center = vec2f(p0.x, (lo + hi) * 0.5);\n let ext = hsz + vec2f(1.0);\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(center + c * ext);\n out.local = c * ext;\n out.hs = hsz;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let r = min(u.params.y * u.viewport.z, min(v.hs.x, v.hs.y));\n let q = abs(v.local) - v.hs + vec2f(r);\n let d = length(max(q, vec2f(0.0))) + min(max(q.x, q.y), 0.0) - r;\n let a = clamp(0.5 - d, 0.0, 1.0) * v.color.a;\n return vec4f(v.color.rgb * a, a);\n}\n`;\n\nexport const WGSL_SCATTER = /* wgsl */ `${WGSL_COMMON}\nstruct Out {\n @builtin(position) pos: vec4f,\n @location(0) local: vec2f,\n @location(1) @interpolate(flat) r: f32,\n @location(2) @interpolate(flat) color: vec4f,\n};\n@vertex fn vs(@builtin(vertex_index) vi: u32, @location(0) p: vec2f, @location(1) size: f32, @location(2) color: vec4f) -> Out {\n var out: Out;\n if (gap(p) || !(size > 0.0)) {\n out.pos = HIDDEN;\n return out;\n }\n let r = size * 0.5 * u.viewport.z;\n let ext = r + 1.0;\n let c = corner(vi) * 2.0 - 1.0;\n out.pos = pxToClip(toPx(p) + c * ext);\n out.local = c * ext;\n out.r = r;\n out.color = color;\n return out;\n}\n@fragment fn fs(v: Out) -> @location(0) vec4f {\n let d = length(v.local) - v.r;\n let cover = clamp(0.5 - d, 0.0, 1.0);\n let inner = clamp(0.5 - (d + u.params.y * u.viewport.z), 0.0, 1.0);\n let a = v.color.a * (inner * u.params.x + (cover - inner));\n return vec4f(v.color.rgb * a, a);\n}\n`;\n\nconst GLSL_HEADER = /* glsl */ `#version 300 es\nprecision highp float;\nuniform vec4 u_xform;\nuniform vec4 u_viewport;\nuniform vec4 u_color;\nuniform vec4 u_params;\n`;\n\nconst GLSL_VERTEX_COMMON = /* glsl */ `${GLSL_HEADER}\nbool gap(vec2 p) { return abs(p.x) > 1e37 || abs(p.y) > 1e37; }\nvec2 toClip(vec2 p) { return vec2(p.x * u_xform.x + u_xform.y, p.y * u_xform.z + u_xform.w); }\nvec2 toPx(vec2 p) { return (toClip(p) * 0.5 + 0.5) * u_viewport.xy; }\nvec4 pxToClip(vec2 p) { return vec4(p / u_viewport.xy * 2.0 - 1.0, 0.0, 1.0); }\nvec2 corner() { return vec2(float(gl_VertexID & 1), float(gl_VertexID >> 1)); }\nconst vec4 HIDDEN = vec4(2.0, 2.0, 2.0, 1.0);\n`;\n\nexport const GLSL_LINE = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_a;\nin vec2 a_b;\nout vec2 v_local;\nout float v_len;\nvoid main() {\n v_local = vec2(0.0);\n v_len = 0.0;\n if (gap(a_a) || gap(a_b)) { gl_Position = HIDDEN; return; }\n vec2 pa = toPx(a_a);\n vec2 pb = toPx(a_b);\n vec2 d = pb - pa;\n float len = length(d);\n vec2 dir = len > 1e-6 ? d / len : vec2(1.0, 0.0);\n vec2 nrm = vec2(-dir.y, dir.x);\n float hw = u_params.x + 1.0;\n vec2 c = corner();\n float along = mix(-hw, len + hw, c.x);\n float across = mix(-hw, hw, c.y);\n gl_Position = pxToClip(pa + dir * along + nrm * across);\n v_local = vec2(along, across);\n v_len = len;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nin float v_len;\nout vec4 outColor;\nvoid main() {\n float x = clamp(v_local.x, 0.0, v_len);\n float dist = length(vec2(v_local.x - x, v_local.y));\n float a = clamp(u_params.x - dist + 0.5, 0.0, 1.0) * u_color.a;\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_AREA = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec3 a_a;\nin vec3 a_b;\nout float v_t;\nvoid main() {\n v_t = 0.0;\n if (gap(a_a.xy) || gap(a_b.xy) || abs(a_a.z) > 1e37 || abs(a_b.z) > 1e37) { gl_Position = HIDDEN; return; }\n vec2 c = corner();\n vec3 p = c.y > 0.5 ? a_b : a_a;\n float y = c.x > 0.5 ? p.y : p.z;\n gl_Position = vec4(toClip(vec2(p.x, y)), 0.0, 1.0);\n v_t = c.x;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin float v_t;\nout vec4 outColor;\nvoid main() {\n float a = u_color.a * u_params.y * (0.25 + 0.75 * v_t * v_t);\n outColor = vec4(u_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_BAR = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec3 a_inst;\nin vec4 a_color;\nout vec2 v_local;\nflat out vec2 v_half;\nflat out vec4 v_color;\nvoid main() {\n v_local = vec2(0.0);\n v_half = vec2(0.0);\n v_color = a_color;\n if (gap(a_inst.xy) || abs(a_inst.z) > 1e37) { gl_Position = HIDDEN; return; }\n float dpr = u_viewport.z;\n float rawHw = abs(u_params.x * u_xform.x) * 0.5 * u_viewport.x;\n vec2 p0 = toPx(a_inst.xy);\n float y1 = toPx(vec2(a_inst.x, a_inst.z)).y;\n float lo = min(p0.y, y1);\n float hi = max(p0.y, y1);\n float fade = clamp((min(rawHw, (hi - lo) * 0.5) - 3.0 * dpr) / (2.0 * dpr), 0.0, 1.0);\n float inset = u_params.z * dpr * fade - (u_params.z > 0.0 ? 0.5 * (1.0 - fade) : 0.0);\n float minHalf = u_params.w * dpr;\n float hw = max(max(rawHw - inset, 0.5), minHalf);\n vec2 hsz = vec2(hw, max((hi - lo) * 0.5 - inset, minHalf));\n vec2 center = vec2(p0.x, (lo + hi) * 0.5);\n vec2 ext = hsz + vec2(1.0);\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(center + c * ext);\n v_local = c * ext;\n v_half = hsz;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in vec2 v_half;\nflat in vec4 v_color;\nout vec4 outColor;\nvoid main() {\n float r = min(u_params.y * u_viewport.z, min(v_half.x, v_half.y));\n vec2 q = abs(v_local) - v_half + vec2(r);\n float d = length(max(q, vec2(0.0))) + min(max(q.x, q.y), 0.0) - r;\n float a = clamp(0.5 - d, 0.0, 1.0) * v_color.a;\n outColor = vec4(v_color.rgb * a, a);\n}`,\n};\n\nexport const GLSL_SCATTER = {\n vertex: /* glsl */ `${GLSL_VERTEX_COMMON}\nin vec2 a_pos;\nin float a_size;\nin vec4 a_color;\nout vec2 v_local;\nflat out float v_r;\nflat out vec4 v_color;\nvoid main() {\n v_local = vec2(0.0);\n v_r = 0.0;\n v_color = a_color;\n if (gap(a_pos) || !(a_size > 0.0)) { gl_Position = HIDDEN; return; }\n float r = a_size * 0.5 * u_viewport.z;\n float ext = r + 1.0;\n vec2 c = corner() * 2.0 - 1.0;\n gl_Position = pxToClip(toPx(a_pos) + c * ext);\n v_local = c * ext;\n v_r = r;\n}`,\n fragment: /* glsl */ `${GLSL_HEADER}\nin vec2 v_local;\nflat in float v_r;\nflat in vec4 v_color;\nout vec4 outColor;\nvoid main() {\n float d = length(v_local) - v_r;\n float cover = clamp(0.5 - d, 0.0, 1.0);\n float inner = clamp(0.5 - (d + u_params.y * u_viewport.z), 0.0, 1.0);\n float a = v_color.a * (inner * u_params.x + (cover - inner));\n outColor = vec4(v_color.rgb * a, a);\n}`,\n};\n"],"mappings":";AAcA,IAAMA,IAAyB,mnBA2BlBC,IAAuB,GAAGD,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCtCE,IAAuB,GAAGF,EAAY;;;;;;;;;;;;;;;;;;;;;;GAwBtCG,IAAsB,GAAGH,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CrCI,IAA0B,GAAGJ,EAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BhDK,IAAyB,6IAQzBC,IAAgC,GAAGD,EAAY;;;;;;;GASxCE,IAAY;CACvB,QAAmB,GAAGD,EAAmB;;;;;;;;;;;;;;;;;;;;;;;CAuBzC,UAAqB,GAAGD,EAAY;;;;;;;;;;AAUtC,GAEaG,IAAY;CACvB,QAAmB,GAAGF,EAAmB;;;;;;;;;;;;;CAazC,UAAqB,GAAGD,EAAY;;;;;;;AAOtC,GAEaI,IAAW;CACtB,QAAmB,GAAGH,EAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BzC,UAAqB,GAAGD,EAAY;;;;;;;;;;;;AAYtC,GAEaK,IAAe;CAC1B,QAAmB,GAAGJ,EAAmB;;;;;;;;;;;;;;;;;;;CAmBzC,UAAqB,GAAGD,EAAY;;;;;;;;;;;;AAYtC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","names":["GAP"],"sources":["../../../../../charts/src/engine/renderers/types.ts"],"sourcesContent":["// Contract between the chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\n\n/**\n * Data -> clip-space transform. Positions are uploaded relative to an\n * origin (float32 keeps its precision for timestamps), so\n * `clip = relative * scale + offset`.\n */\nexport interface RenderTransform {\n xScale: number;\n xOffset: number;\n yScale: number;\n yOffset: number;\n}\n\nexport interface RenderFrame {\n transform: RenderTransform;\n /** Size of the drawing buffer in device pixels */\n width: number;\n height: number;\n /** Device pixel ratio */\n dpr: number;\n}\n\n/** Missing values are written as this sentinel (NaN is unreliable in shaders) */\nexport const GAP = 3e38;\n\ninterface RenderItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** Straight RGBA */\n color: Rgba;\n}\n\nexport interface LineItem extends RenderItemBase {\n kind: \"line\";\n /** Interleaved relative x, y */\n points: Float32Array;\n count: number;\n /** CSS pixels */\n width: number;\n sorted: boolean;\n}\n\nexport interface AreaItem extends RenderItemBase {\n kind: \"area\";\n points: Float32Array;\n count: number;\n /** Relative y of the baseline */\n baseline: number;\n opacity: number;\n sorted: boolean;\n}\n\nexport interface BarItem extends RenderItemBase {\n kind: \"bar\";\n /** Interleaved relative x (center), y0, y1 */\n instances: Float32Array;\n count: number;\n /** Half of the bar width, in relative x units */\n halfWidth: number;\n /** Corner radius in CSS pixels */\n radius: number;\n /** Instances are sorted by x */\n sorted: boolean;\n}\n\nexport interface ScatterItem extends RenderItemBase {\n kind: \"scatter\";\n /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n opacity: number;\n /** Outline width in CSS pixels */\n stroke: number;\n}\n\nexport type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;\n\nexport interface ChartRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly RenderItem[], frame: RenderFrame): void;\n destroy(): void;\n}\n\n/** Called when the backend is lost (GPU reset, too many contexts, ...) */\nexport type RendererLostHandler = () => void;\n\nexport const SCATTER_STRIDE = 16;\n"],"mappings":"AA2BA,IAAaA,EAAM"}
1
+ {"version":3,"file":"types.cjs","names":["GAP"],"sources":["../../../../../charts/src/engine/renderers/types.ts"],"sourcesContent":["// Contract between the chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\n\n/**\n * Data -> clip-space transform. Positions are uploaded relative to an\n * origin (float32 keeps its precision for timestamps), so\n * `clip = relative * scale + offset`.\n */\nexport interface RenderTransform {\n xScale: number;\n xOffset: number;\n yScale: number;\n yOffset: number;\n}\n\nexport interface RenderFrame {\n transform: RenderTransform;\n /** Size of the drawing buffer in device pixels */\n width: number;\n height: number;\n /** Device pixel ratio */\n dpr: number;\n}\n\n/** Missing values are written as this sentinel (NaN is unreliable in shaders) */\nexport const GAP = 3e38;\n\ninterface RenderItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** Straight RGBA */\n color: Rgba;\n}\n\nexport interface LineItem extends RenderItemBase {\n kind: \"line\";\n /** Interleaved relative x, y */\n points: Float32Array;\n count: number;\n /** CSS pixels */\n width: number;\n sorted: boolean;\n}\n\nexport interface AreaItem extends RenderItemBase {\n kind: \"area\";\n /** Interleaved relative x, y (top) and y of the bottom edge (baseline or stack below) */\n points: Float32Array;\n count: number;\n opacity: number;\n sorted: boolean;\n}\n\nexport interface BarItem extends RenderItemBase {\n kind: \"bar\";\n /** Per bar: relative x (center) f32, y0 f32, y1 f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n /** Half of the bar width, in relative x units */\n halfWidth: number;\n /** Corner radius in CSS pixels */\n radius: number;\n /** Space removed on every side, in CSS pixels (heatmap cells) */\n inset: number;\n /** Smallest half width / half height, in CSS pixels (wicks, flat candles) */\n minHalf: number;\n /** Instances are sorted by x */\n sorted: boolean;\n}\n\nexport interface ScatterItem extends RenderItemBase {\n kind: \"scatter\";\n /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n opacity: number;\n /** Outline width in CSS pixels */\n stroke: number;\n}\n\nexport type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;\n\nexport interface ChartRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly RenderItem[], frame: RenderFrame): void;\n destroy(): void;\n}\n\n/** Called when the backend is lost (GPU reset, too many contexts, ...) */\nexport type RendererLostHandler = () => void;\n\nexport const SCATTER_STRIDE = 16;\n/** Bytes per bar instance */\nexport const BAR_STRIDE = 16;\n/** Floats per area point */\nexport const AREA_STRIDE = 3;\n"],"mappings":"AA2BA,IAAaA,EAAM"}
@@ -40,22 +40,25 @@ export interface LineItem extends RenderItemBase {
40
40
  }
41
41
  export interface AreaItem extends RenderItemBase {
42
42
  kind: "area";
43
+ /** Interleaved relative x, y (top) and y of the bottom edge (baseline or stack below) */
43
44
  points: Float32Array;
44
45
  count: number;
45
- /** Relative y of the baseline */
46
- baseline: number;
47
46
  opacity: number;
48
47
  sorted: boolean;
49
48
  }
50
49
  export interface BarItem extends RenderItemBase {
51
50
  kind: "bar";
52
- /** Interleaved relative x (center), y0, y1 */
53
- instances: Float32Array;
51
+ /** Per bar: relative x (center) f32, y0 f32, y1 f32, color unorm8x4 */
52
+ instances: ArrayBuffer;
54
53
  count: number;
55
54
  /** Half of the bar width, in relative x units */
56
55
  halfWidth: number;
57
56
  /** Corner radius in CSS pixels */
58
57
  radius: number;
58
+ /** Space removed on every side, in CSS pixels (heatmap cells) */
59
+ inset: number;
60
+ /** Smallest half width / half height, in CSS pixels (wicks, flat candles) */
61
+ minHalf: number;
59
62
  /** Instances are sorted by x */
60
63
  sorted: boolean;
61
64
  }
@@ -80,4 +83,8 @@ export interface ChartRenderer {
80
83
  /** Called when the backend is lost (GPU reset, too many contexts, ...) */
81
84
  export type RendererLostHandler = () => void;
82
85
  export declare const SCATTER_STRIDE = 16;
86
+ /** Bytes per bar instance */
87
+ export declare const BAR_STRIDE = 16;
88
+ /** Floats per area point */
89
+ export declare const AREA_STRIDE = 3;
83
90
  export {};
@@ -40,22 +40,25 @@ export interface LineItem extends RenderItemBase {
40
40
  }
41
41
  export interface AreaItem extends RenderItemBase {
42
42
  kind: "area";
43
+ /** Interleaved relative x, y (top) and y of the bottom edge (baseline or stack below) */
43
44
  points: Float32Array;
44
45
  count: number;
45
- /** Relative y of the baseline */
46
- baseline: number;
47
46
  opacity: number;
48
47
  sorted: boolean;
49
48
  }
50
49
  export interface BarItem extends RenderItemBase {
51
50
  kind: "bar";
52
- /** Interleaved relative x (center), y0, y1 */
53
- instances: Float32Array;
51
+ /** Per bar: relative x (center) f32, y0 f32, y1 f32, color unorm8x4 */
52
+ instances: ArrayBuffer;
54
53
  count: number;
55
54
  /** Half of the bar width, in relative x units */
56
55
  halfWidth: number;
57
56
  /** Corner radius in CSS pixels */
58
57
  radius: number;
58
+ /** Space removed on every side, in CSS pixels (heatmap cells) */
59
+ inset: number;
60
+ /** Smallest half width / half height, in CSS pixels (wicks, flat candles) */
61
+ minHalf: number;
59
62
  /** Instances are sorted by x */
60
63
  sorted: boolean;
61
64
  }
@@ -80,4 +83,8 @@ export interface ChartRenderer {
80
83
  /** Called when the backend is lost (GPU reset, too many contexts, ...) */
81
84
  export type RendererLostHandler = () => void;
82
85
  export declare const SCATTER_STRIDE = 16;
86
+ /** Bytes per bar instance */
87
+ export declare const BAR_STRIDE = 16;
88
+ /** Floats per area point */
89
+ export declare const AREA_STRIDE = 3;
83
90
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":["GAP"],"sources":["../../../../../charts/src/engine/renderers/types.ts"],"sourcesContent":["// Contract between the chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\n\n/**\n * Data -> clip-space transform. Positions are uploaded relative to an\n * origin (float32 keeps its precision for timestamps), so\n * `clip = relative * scale + offset`.\n */\nexport interface RenderTransform {\n xScale: number;\n xOffset: number;\n yScale: number;\n yOffset: number;\n}\n\nexport interface RenderFrame {\n transform: RenderTransform;\n /** Size of the drawing buffer in device pixels */\n width: number;\n height: number;\n /** Device pixel ratio */\n dpr: number;\n}\n\n/** Missing values are written as this sentinel (NaN is unreliable in shaders) */\nexport const GAP = 3e38;\n\ninterface RenderItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** Straight RGBA */\n color: Rgba;\n}\n\nexport interface LineItem extends RenderItemBase {\n kind: \"line\";\n /** Interleaved relative x, y */\n points: Float32Array;\n count: number;\n /** CSS pixels */\n width: number;\n sorted: boolean;\n}\n\nexport interface AreaItem extends RenderItemBase {\n kind: \"area\";\n points: Float32Array;\n count: number;\n /** Relative y of the baseline */\n baseline: number;\n opacity: number;\n sorted: boolean;\n}\n\nexport interface BarItem extends RenderItemBase {\n kind: \"bar\";\n /** Interleaved relative x (center), y0, y1 */\n instances: Float32Array;\n count: number;\n /** Half of the bar width, in relative x units */\n halfWidth: number;\n /** Corner radius in CSS pixels */\n radius: number;\n /** Instances are sorted by x */\n sorted: boolean;\n}\n\nexport interface ScatterItem extends RenderItemBase {\n kind: \"scatter\";\n /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n opacity: number;\n /** Outline width in CSS pixels */\n stroke: number;\n}\n\nexport type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;\n\nexport interface ChartRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly RenderItem[], frame: RenderFrame): void;\n destroy(): void;\n}\n\n/** Called when the backend is lost (GPU reset, too many contexts, ...) */\nexport type RendererLostHandler = () => void;\n\nexport const SCATTER_STRIDE = 16;\n"],"mappings":";AA2BA,IAAaA,IAAM"}
1
+ {"version":3,"file":"types.js","names":["GAP"],"sources":["../../../../../charts/src/engine/renderers/types.ts"],"sourcesContent":["// Contract between the chart and its data-layer backends.\n\nimport type { Rgba } from \"../color\";\nimport type { ChartRendererKind } from \"../types\";\n\n/**\n * Data -> clip-space transform. Positions are uploaded relative to an\n * origin (float32 keeps its precision for timestamps), so\n * `clip = relative * scale + offset`.\n */\nexport interface RenderTransform {\n xScale: number;\n xOffset: number;\n yScale: number;\n yOffset: number;\n}\n\nexport interface RenderFrame {\n transform: RenderTransform;\n /** Size of the drawing buffer in device pixels */\n width: number;\n height: number;\n /** Device pixel ratio */\n dpr: number;\n}\n\n/** Missing values are written as this sentinel (NaN is unreliable in shaders) */\nexport const GAP = 3e38;\n\ninterface RenderItemBase {\n /** Identifies the GPU resources of the item */\n key: string;\n /** Changes when the buffers must be uploaded again */\n version: number;\n /** Straight RGBA */\n color: Rgba;\n}\n\nexport interface LineItem extends RenderItemBase {\n kind: \"line\";\n /** Interleaved relative x, y */\n points: Float32Array;\n count: number;\n /** CSS pixels */\n width: number;\n sorted: boolean;\n}\n\nexport interface AreaItem extends RenderItemBase {\n kind: \"area\";\n /** Interleaved relative x, y (top) and y of the bottom edge (baseline or stack below) */\n points: Float32Array;\n count: number;\n opacity: number;\n sorted: boolean;\n}\n\nexport interface BarItem extends RenderItemBase {\n kind: \"bar\";\n /** Per bar: relative x (center) f32, y0 f32, y1 f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n /** Half of the bar width, in relative x units */\n halfWidth: number;\n /** Corner radius in CSS pixels */\n radius: number;\n /** Space removed on every side, in CSS pixels (heatmap cells) */\n inset: number;\n /** Smallest half width / half height, in CSS pixels (wicks, flat candles) */\n minHalf: number;\n /** Instances are sorted by x */\n sorted: boolean;\n}\n\nexport interface ScatterItem extends RenderItemBase {\n kind: \"scatter\";\n /** Per point: x f32, y f32, diameter (CSS px) f32, color unorm8x4 */\n instances: ArrayBuffer;\n count: number;\n opacity: number;\n /** Outline width in CSS pixels */\n stroke: number;\n}\n\nexport type RenderItem = LineItem | AreaItem | BarItem | ScatterItem;\n\nexport interface ChartRenderer {\n readonly kind: ChartRendererKind;\n readonly canvas: HTMLCanvasElement;\n /** Drawing buffer size in device pixels */\n resize(width: number, height: number): void;\n render(items: readonly RenderItem[], frame: RenderFrame): void;\n destroy(): void;\n}\n\n/** Called when the backend is lost (GPU reset, too many contexts, ...) */\nexport type RendererLostHandler = () => void;\n\nexport const SCATTER_STRIDE = 16;\n/** Bytes per bar instance */\nexport const BAR_STRIDE = 16;\n/** Floats per area point */\nexport const AREA_STRIDE = 3;\n"],"mappings":";AA2BA,IAAaA,IAAM"}
@@ -1,2 +1,2 @@
1
- const e=require("./range.cjs"),t=require("./shaders.cjs");var n={line:[`a_a`,`a_b`],area:[`a_a`,`a_b`],bar:[`a_inst`],scatter:[`a_pos`,`a_size`,`a_color`]},r=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},i=r(e.VERTEX_SHADER,t.vertex),a=r(e.FRAGMENT_SHADER,t.fragment),o=e.createProgram();return!i||!a||!o?null:(e.attachShader(o,i),e.attachShader(o,a),n.forEach((t,n)=>e.bindAttribLocation(o,n,t)),e.linkProgram(o),e.deleteShader(i),e.deleteShader(a),e.getProgramParameter(o,e.LINK_STATUS)?{program:o,xform:e.getUniformLocation(o,`u_xform`),viewport:e.getUniformLocation(o,`u_viewport`),color:e.getUniformLocation(o,`u_color`),params:e.getUniformLocation(o,`u_params`)}:(e.deleteProgram(o),null))},i=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,a=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),n=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return i.test(String(n??``))},o=(i,o,s=!1)=>{let c=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:s});if(!c)return null;if(s&&a(c))return c.getExtension(`WEBGL_lose_context`)?.loseContext(),null;let l=r(c,t.GLSL_LINE,n.line),u=r(c,t.GLSL_AREA,n.area),d=r(c,t.GLSL_BAR,n.bar),f=r(c,t.GLSL_SCATTER,n.scatter);if(!l||!u||!d||!f)return null;let p={line:l,area:u,bar:d,scatter:f},m=!1,h=e=>{e.preventDefault(),m=!0,o()};i.addEventListener(`webglcontextlost`,h);let g=new Map,_=(e,t)=>{let n=c.FLOAT;switch(e.kind){case`line`:case`area`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,8,t*8),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,2,n,!1,8,t*8+8),c.vertexAttribDivisor(1,1);break;case`bar`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,3,n,!1,12,t*12),c.vertexAttribDivisor(0,1);break;default:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,16,0),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,1,n,!1,16,8),c.vertexAttribDivisor(1,1),c.enableVertexAttribArray(2),c.vertexAttribPointer(2,4,c.UNSIGNED_BYTE,!0,16,12),c.vertexAttribDivisor(2,1)}},v=e=>{c.deleteBuffer(e.buffer),c.deleteVertexArray(e.vao)},y=e=>{let t=g.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t&&v(t);let n=c.createBuffer(),r=c.createVertexArray();if(!n||!r)return null;switch(c.bindVertexArray(r),c.bindBuffer(c.ARRAY_BUFFER,n),e.kind){case`line`:case`area`:c.bufferData(c.ARRAY_BUFFER,e.points,c.STATIC_DRAW,0,e.count*2);break;case`bar`:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW,0,e.count*3);break;default:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW)}_(e,0),c.bindVertexArray(null);let i={version:e.version,kind:e.kind,buffer:n,vao:r,first:0};return g.set(e.key,i),i},b=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0];case`area`:return[e.baseline,e.opacity];case`bar`:return[e.halfWidth,e.radius];default:return[e.opacity,e.stroke]}};return{kind:`webgl2`,canvas:i,resize(e,t){i.width=Math.max(1,e),i.height=Math.max(1,t)},render(t,n){if(m||c.isContextLost())return;c.viewport(0,0,i.width,i.height),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT),c.enable(c.BLEND),c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA);let r=n.transform,a=new Set;for(let i of t){a.add(i.key);let[t,o]=e.instanceRange(i,n);if(o<=0)continue;let s=y(i);if(!s)continue;let l=p[i.kind];c.useProgram(l.program),c.uniform4f(l.xform,r.xScale,r.xOffset,r.yScale,r.yOffset),c.uniform4f(l.viewport,n.width,n.height,n.dpr,0),c.uniform4f(l.color,i.color[0],i.color[1],i.color[2],i.color[3]);let[u,d]=b(i,n);c.uniform4f(l.params,u,d,0,0),c.bindVertexArray(s.vao),s.first!==t&&(c.bindBuffer(c.ARRAY_BUFFER,s.buffer),_(i,t),s.first=t),c.drawArraysInstanced(c.TRIANGLE_STRIP,0,4,o)}c.bindVertexArray(null);for(let[e,t]of g)a.has(e)||(v(t),g.delete(e))},destroy(){if(i.removeEventListener(`webglcontextlost`,h),!c.isContextLost()){for(let e of g.values())v(e);for(let e of Object.values(p))c.deleteProgram(e.program)}g.clear(),c.getExtension(`WEBGL_lose_context`)?.loseContext()}}};exports.SOFTWARE_RENDERER=i,exports.createWebGl2Renderer=o;
1
+ const e=require("./range.cjs"),t=require("./shaders.cjs");var n={line:[`a_a`,`a_b`],area:[`a_a`,`a_b`],bar:[`a_inst`,`a_color`],scatter:[`a_pos`,`a_size`,`a_color`]},r=(e,t,n)=>{let r=(t,n)=>{let r=e.createShader(t);return r?(e.shaderSource(r,n),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)?r:(e.deleteShader(r),null)):null},i=r(e.VERTEX_SHADER,t.vertex),a=r(e.FRAGMENT_SHADER,t.fragment),o=e.createProgram();return!i||!a||!o?null:(e.attachShader(o,i),e.attachShader(o,a),n.forEach((t,n)=>e.bindAttribLocation(o,n,t)),e.linkProgram(o),e.deleteShader(i),e.deleteShader(a),e.getProgramParameter(o,e.LINK_STATUS)?{program:o,xform:e.getUniformLocation(o,`u_xform`),viewport:e.getUniformLocation(o,`u_viewport`),color:e.getUniformLocation(o,`u_color`),params:e.getUniformLocation(o,`u_params`)}:(e.deleteProgram(o),null))},i=/swiftshader|llvmpipe|softpipe|software|basic render driver|microsoft basic/i,a=e=>{let t=e.getExtension(`WEBGL_debug_renderer_info`),n=t?e.getParameter(t.UNMASKED_RENDERER_WEBGL):e.getParameter(e.RENDERER);return i.test(String(n??``))},o=(i,o,s=!1)=>{let c=i.getContext(`webgl2`,{alpha:!0,premultipliedAlpha:!0,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!1,failIfMajorPerformanceCaveat:s});if(!c)return null;if(s&&a(c))return c.getExtension(`WEBGL_lose_context`)?.loseContext(),null;let l=r(c,t.GLSL_LINE,n.line),u=r(c,t.GLSL_AREA,n.area),d=r(c,t.GLSL_BAR,n.bar),f=r(c,t.GLSL_SCATTER,n.scatter);if(!l||!u||!d||!f)return null;let p={line:l,area:u,bar:d,scatter:f},m=!1,h=e=>{e.preventDefault(),m=!0,o()};i.addEventListener(`webglcontextlost`,h);let g=new Map,_=(e,t)=>{let n=c.FLOAT;switch(e.kind){case`line`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,8,t*8),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,2,n,!1,8,t*8+8),c.vertexAttribDivisor(1,1);break;case`area`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,3,n,!1,12,t*12),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,3,n,!1,12,(t+1)*12),c.vertexAttribDivisor(1,1);break;case`bar`:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,3,n,!1,16,t*16),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,4,c.UNSIGNED_BYTE,!0,16,t*16+12),c.vertexAttribDivisor(1,1);break;default:c.enableVertexAttribArray(0),c.vertexAttribPointer(0,2,n,!1,16,0),c.vertexAttribDivisor(0,1),c.enableVertexAttribArray(1),c.vertexAttribPointer(1,1,n,!1,16,8),c.vertexAttribDivisor(1,1),c.enableVertexAttribArray(2),c.vertexAttribPointer(2,4,c.UNSIGNED_BYTE,!0,16,12),c.vertexAttribDivisor(2,1)}},v=e=>{c.deleteBuffer(e.buffer),c.deleteVertexArray(e.vao)},y=e=>{let t=g.get(e.key);if(t&&t.version===e.version&&t.kind===e.kind)return t;t&&v(t);let n=c.createBuffer(),r=c.createVertexArray();if(!n||!r)return null;switch(c.bindVertexArray(r),c.bindBuffer(c.ARRAY_BUFFER,n),e.kind){case`line`:c.bufferData(c.ARRAY_BUFFER,e.points,c.STATIC_DRAW,0,e.count*2);break;case`area`:c.bufferData(c.ARRAY_BUFFER,e.points,c.STATIC_DRAW,0,e.count*3);break;default:c.bufferData(c.ARRAY_BUFFER,e.instances,c.STATIC_DRAW)}_(e,0),c.bindVertexArray(null);let i={version:e.version,kind:e.kind,buffer:n,vao:r,first:0};return g.set(e.key,i),i},b=(e,t)=>{switch(e.kind){case`line`:return[e.width*t.dpr/2,0,0,0];case`area`:return[0,e.opacity,0,0];case`bar`:return[e.halfWidth,e.radius,e.inset,e.minHalf];default:return[e.opacity,e.stroke,0,0]}};return{kind:`webgl2`,canvas:i,resize(e,t){i.width=Math.max(1,e),i.height=Math.max(1,t)},render(t,n){if(m||c.isContextLost())return;c.viewport(0,0,i.width,i.height),c.clearColor(0,0,0,0),c.clear(c.COLOR_BUFFER_BIT),c.enable(c.BLEND),c.blendFunc(c.ONE,c.ONE_MINUS_SRC_ALPHA);let r=n.transform,a=new Set;for(let i of t){a.add(i.key);let[t,o]=e.instanceRange(i,n);if(o<=0)continue;let s=y(i);if(!s)continue;let l=p[i.kind];c.useProgram(l.program),c.uniform4f(l.xform,r.xScale,r.xOffset,r.yScale,r.yOffset),c.uniform4f(l.viewport,n.width,n.height,n.dpr,0),c.uniform4f(l.color,i.color[0],i.color[1],i.color[2],i.color[3]);let[u,d,f,m]=b(i,n);c.uniform4f(l.params,u,d,f,m),c.bindVertexArray(s.vao),s.first!==t&&(c.bindBuffer(c.ARRAY_BUFFER,s.buffer),_(i,t),s.first=t),c.drawArraysInstanced(c.TRIANGLE_STRIP,0,4,o)}c.bindVertexArray(null);for(let[e,t]of g)a.has(e)||(v(t),g.delete(e))},destroy(){if(i.removeEventListener(`webglcontextlost`,h),!c.isContextLost()){for(let e of g.values())v(e);for(let e of Object.values(p))c.deleteProgram(e.program)}g.clear(),c.getExtension(`WEBGL_lose_context`)?.loseContext()}}};exports.SOFTWARE_RENDERER=i,exports.createWebGl2Renderer=o;
2
2
  //# sourceMappingURL=webgl2.cjs.map