@perspective-dev/viewer-charts 4.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.
- package/LICENSE.md +193 -0
- package/dist/cdn/perspective-viewer-charts.js +3 -0
- package/dist/cdn/perspective-viewer-charts.js.map +7 -0
- package/dist/esm/axis/axis-primitives.d.ts +24 -0
- package/dist/esm/axis/bar-axis.d.ts +51 -0
- package/dist/esm/axis/canvas.d.ts +24 -0
- package/dist/esm/axis/categorical-axis-core.d.ts +42 -0
- package/dist/esm/axis/categorical-axis.d.ts +27 -0
- package/dist/esm/axis/facet-chrome.d.ts +13 -0
- package/dist/esm/axis/label-geometry.d.ts +41 -0
- package/dist/esm/axis/legend.d.ts +44 -0
- package/dist/esm/axis/numeric-axis.d.ts +20 -0
- package/dist/esm/charts/candlestick/candlestick-build.d.ts +129 -0
- package/dist/esm/charts/candlestick/candlestick-interact.d.ts +10 -0
- package/dist/esm/charts/candlestick/candlestick-render.d.ts +24 -0
- package/dist/esm/charts/candlestick/candlestick.d.ts +144 -0
- package/dist/esm/charts/candlestick/glyphs/draw-candlesticks.d.ts +36 -0
- package/dist/esm/charts/candlestick/glyphs/draw-ohlc.d.ts +33 -0
- package/dist/esm/charts/canvas-types.d.ts +15 -0
- package/dist/esm/charts/cartesian/cartesian-build.d.ts +14 -0
- package/dist/esm/charts/cartesian/cartesian-interact.d.ts +20 -0
- package/dist/esm/charts/cartesian/cartesian-render.d.ts +26 -0
- package/dist/esm/charts/cartesian/cartesian.d.ts +239 -0
- package/dist/esm/charts/cartesian/glyph.d.ts +53 -0
- package/dist/esm/charts/cartesian/glyphs/density.d.ts +142 -0
- package/dist/esm/charts/cartesian/glyphs/lines.d.ts +23 -0
- package/dist/esm/charts/cartesian/glyphs/points.d.ts +24 -0
- package/dist/esm/charts/cartesian/label-interner.d.ts +21 -0
- package/dist/esm/charts/cartesian/tooltip-lines.d.ts +11 -0
- package/dist/esm/charts/chart-base.d.ts +402 -0
- package/dist/esm/charts/chart.d.ts +338 -0
- package/dist/esm/charts/common/band-layout.d.ts +32 -0
- package/dist/esm/charts/common/categorical-y-chart.d.ts +53 -0
- package/dist/esm/charts/common/category-axis-resolver.d.ts +90 -0
- package/dist/esm/charts/common/chrome-cache.d.ts +18 -0
- package/dist/esm/charts/common/draw-tooltip-box.d.ts +9 -0
- package/dist/esm/charts/common/leaf-color.d.ts +33 -0
- package/dist/esm/charts/common/node-store.d.ts +81 -0
- package/dist/esm/charts/common/tree-chart.d.ts +48 -0
- package/dist/esm/charts/common/tree-chrome.d.ts +31 -0
- package/dist/esm/charts/common/tree-data.d.ts +54 -0
- package/dist/esm/charts/common/visible-extent.d.ts +51 -0
- package/dist/esm/charts/heatmap/heatmap-build.d.ts +86 -0
- package/dist/esm/charts/heatmap/heatmap-interact.d.ts +19 -0
- package/dist/esm/charts/heatmap/heatmap-render.d.ts +19 -0
- package/dist/esm/charts/heatmap/heatmap-y-axis.d.ts +46 -0
- package/dist/esm/charts/heatmap/heatmap.d.ts +117 -0
- package/dist/esm/charts/map/map.d.ts +67 -0
- package/dist/esm/charts/registry.d.ts +14 -0
- package/dist/esm/charts/series/glyphs/draw-areas.d.ts +30 -0
- package/dist/esm/charts/series/glyphs/draw-bars.d.ts +15 -0
- package/dist/esm/charts/series/glyphs/draw-lines.d.ts +34 -0
- package/dist/esm/charts/series/glyphs/draw-scatter.d.ts +33 -0
- package/dist/esm/charts/series/series-build.d.ts +228 -0
- package/dist/esm/charts/series/series-interact.d.ts +35 -0
- package/dist/esm/charts/series/series-render.d.ts +41 -0
- package/dist/esm/charts/series/series-type.d.ts +49 -0
- package/dist/esm/charts/series/series.d.ts +317 -0
- package/dist/esm/charts/sunburst/sunburst-interact.d.ts +7 -0
- package/dist/esm/charts/sunburst/sunburst-layout.d.ts +33 -0
- package/dist/esm/charts/sunburst/sunburst-render.d.ts +22 -0
- package/dist/esm/charts/sunburst/sunburst.d.ts +85 -0
- package/dist/esm/charts/treemap/treemap-interact.d.ts +12 -0
- package/dist/esm/charts/treemap/treemap-layout.d.ts +28 -0
- package/dist/esm/charts/treemap/treemap-render.d.ts +18 -0
- package/dist/esm/charts/treemap/treemap.d.ts +74 -0
- package/dist/esm/config.d.ts +27 -0
- package/dist/esm/data/lazy-row.d.ts +32 -0
- package/dist/esm/data/split-groups.d.ts +20 -0
- package/dist/esm/data/view-reader.d.ts +35 -0
- package/dist/esm/event-detail.d.ts +28 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/interaction/hit-test.d.ts +30 -0
- package/dist/esm/interaction/host-sink-dom.d.ts +19 -0
- package/dist/esm/interaction/host-sink-message.d.ts +46 -0
- package/dist/esm/interaction/lazy-tooltip.d.ts +61 -0
- package/dist/esm/interaction/raw-event-forwarder.d.ts +27 -0
- package/dist/esm/interaction/spatial-grid.d.ts +15 -0
- package/dist/esm/interaction/tooltip-controller.d.ts +193 -0
- package/dist/esm/interaction/zoom-controller.d.ts +106 -0
- package/dist/esm/interaction/zoom-router.d.ts +48 -0
- package/dist/esm/layout/facet-grid.d.ts +126 -0
- package/dist/esm/layout/plot-layout.d.ts +104 -0
- package/dist/esm/layout/ticks.d.ts +17 -0
- package/dist/esm/map/mercator.d.ts +102 -0
- package/dist/esm/map/tile-cache.d.ts +38 -0
- package/dist/esm/map/tile-layer.d.ts +66 -0
- package/dist/esm/map/tile-loader.d.ts +52 -0
- package/dist/esm/map/tile-source.d.ts +66 -0
- package/dist/esm/perspective-viewer-charts.js +3 -0
- package/dist/esm/perspective-viewer-charts.js.map +7 -0
- package/dist/esm/plugin/charts.d.ts +40 -0
- package/dist/esm/plugin/plugin.d.ts +95 -0
- package/dist/esm/render/scheduler.d.ts +41 -0
- package/dist/esm/theme/gradient.d.ts +48 -0
- package/dist/esm/theme/palette.d.ts +13 -0
- package/dist/esm/theme/theme-snapshot.d.ts +7 -0
- package/dist/esm/theme/theme.d.ts +53 -0
- package/dist/esm/transport/protocol.d.ts +430 -0
- package/dist/esm/transport/renderer-transport.d.ts +201 -0
- package/dist/esm/utils/css.d.ts +1 -0
- package/dist/esm/utils/font-snapshot.d.ts +50 -0
- package/dist/esm/webgl/buffer-pool.d.ts +62 -0
- package/dist/esm/webgl/context-manager.d.ts +184 -0
- package/dist/esm/webgl/gradient-texture.d.ts +17 -0
- package/dist/esm/webgl/instanced-attrs.d.ts +44 -0
- package/dist/esm/webgl/plot-frame.d.ts +39 -0
- package/dist/esm/webgl/program-cache.d.ts +13 -0
- package/dist/esm/webgl/shader-manifest.d.ts +53 -0
- package/dist/esm/webgl/shader-registry.d.ts +22 -0
- package/dist/esm/worker/boot.d.ts +0 -0
- package/dist/esm/worker/dispatch.d.ts +9 -0
- package/dist/esm/worker/font-loader.d.ts +2 -0
- package/dist/esm/worker/renderer.worker.d.ts +115 -0
- package/dist/esm/worker/session-host.d.ts +26 -0
- package/package.json +47 -0
- package/src/css/perspective-viewer-charts.css +95 -0
- package/src/ts/axis/axis-primitives.ts +125 -0
- package/src/ts/axis/bar-axis.ts +345 -0
- package/src/ts/axis/canvas.ts +64 -0
- package/src/ts/axis/categorical-axis-core.ts +125 -0
- package/src/ts/axis/categorical-axis.ts +716 -0
- package/src/ts/axis/facet-chrome.ts +42 -0
- package/src/ts/axis/label-geometry.ts +188 -0
- package/src/ts/axis/legend.ts +218 -0
- package/src/ts/axis/numeric-axis.ts +353 -0
- package/src/ts/charts/candlestick/candlestick-build.ts +516 -0
- package/src/ts/charts/candlestick/candlestick-interact.ts +256 -0
- package/src/ts/charts/candlestick/candlestick-render.ts +387 -0
- package/src/ts/charts/candlestick/candlestick.ts +367 -0
- package/src/ts/charts/candlestick/glyphs/draw-candlesticks.ts +432 -0
- package/src/ts/charts/candlestick/glyphs/draw-ohlc.ts +317 -0
- package/src/ts/charts/canvas-types.ts +30 -0
- package/src/ts/charts/cartesian/cartesian-build.ts +616 -0
- package/src/ts/charts/cartesian/cartesian-interact.ts +355 -0
- package/src/ts/charts/cartesian/cartesian-render.ts +948 -0
- package/src/ts/charts/cartesian/cartesian.ts +469 -0
- package/src/ts/charts/cartesian/glyph.ts +81 -0
- package/src/ts/charts/cartesian/glyphs/density.ts +1263 -0
- package/src/ts/charts/cartesian/glyphs/lines.ts +320 -0
- package/src/ts/charts/cartesian/glyphs/points.ts +239 -0
- package/src/ts/charts/cartesian/label-interner.ts +56 -0
- package/src/ts/charts/cartesian/tooltip-lines.ts +80 -0
- package/src/ts/charts/chart-base.ts +840 -0
- package/src/ts/charts/chart.ts +427 -0
- package/src/ts/charts/common/band-layout.ts +63 -0
- package/src/ts/charts/common/categorical-y-chart.ts +81 -0
- package/src/ts/charts/common/category-axis-resolver.ts +314 -0
- package/src/ts/charts/common/chrome-cache.ts +79 -0
- package/src/ts/charts/common/draw-tooltip-box.ts +84 -0
- package/src/ts/charts/common/leaf-color.ts +92 -0
- package/src/ts/charts/common/node-store.ts +235 -0
- package/src/ts/charts/common/tree-chart.ts +76 -0
- package/src/ts/charts/common/tree-chrome.ts +123 -0
- package/src/ts/charts/common/tree-data.ts +623 -0
- package/src/ts/charts/common/visible-extent.ts +112 -0
- package/src/ts/charts/heatmap/heatmap-build.ts +426 -0
- package/src/ts/charts/heatmap/heatmap-interact.ts +274 -0
- package/src/ts/charts/heatmap/heatmap-render.ts +815 -0
- package/src/ts/charts/heatmap/heatmap-y-axis.ts +351 -0
- package/src/ts/charts/heatmap/heatmap.ts +368 -0
- package/src/ts/charts/map/map.ts +201 -0
- package/src/ts/charts/registry.ts +65 -0
- package/src/ts/charts/series/glyphs/draw-areas.ts +331 -0
- package/src/ts/charts/series/glyphs/draw-bars.ts +113 -0
- package/src/ts/charts/series/glyphs/draw-lines.ts +320 -0
- package/src/ts/charts/series/glyphs/draw-scatter.ts +328 -0
- package/src/ts/charts/series/series-build.ts +848 -0
- package/src/ts/charts/series/series-interact.ts +604 -0
- package/src/ts/charts/series/series-render.ts +1109 -0
- package/src/ts/charts/series/series-type.ts +99 -0
- package/src/ts/charts/series/series.ts +794 -0
- package/src/ts/charts/sunburst/sunburst-interact.ts +460 -0
- package/src/ts/charts/sunburst/sunburst-layout.ts +238 -0
- package/src/ts/charts/sunburst/sunburst-render.ts +887 -0
- package/src/ts/charts/sunburst/sunburst.ts +248 -0
- package/src/ts/charts/treemap/treemap-interact.ts +445 -0
- package/src/ts/charts/treemap/treemap-layout.ts +328 -0
- package/src/ts/charts/treemap/treemap-render.ts +886 -0
- package/src/ts/charts/treemap/treemap.ts +247 -0
- package/src/ts/config.ts +41 -0
- package/src/ts/data/lazy-row.ts +140 -0
- package/src/ts/data/split-groups.ts +97 -0
- package/src/ts/data/view-reader.ts +107 -0
- package/src/ts/event-detail.ts +44 -0
- package/src/ts/index.ts +53 -0
- package/src/ts/interaction/hit-test.ts +106 -0
- package/src/ts/interaction/host-sink-dom.ts +85 -0
- package/src/ts/interaction/host-sink-message.ts +75 -0
- package/src/ts/interaction/lazy-tooltip.ts +102 -0
- package/src/ts/interaction/raw-event-forwarder.ts +175 -0
- package/src/ts/interaction/spatial-grid.ts +100 -0
- package/src/ts/interaction/tooltip-controller.ts +407 -0
- package/src/ts/interaction/zoom-controller.ts +468 -0
- package/src/ts/interaction/zoom-router.ts +230 -0
- package/src/ts/layout/facet-grid.ts +346 -0
- package/src/ts/layout/plot-layout.ts +277 -0
- package/src/ts/layout/ticks.ts +168 -0
- package/src/ts/map/mercator.ts +204 -0
- package/src/ts/map/tile-cache.ts +96 -0
- package/src/ts/map/tile-layer.ts +382 -0
- package/src/ts/map/tile-loader.ts +143 -0
- package/src/ts/map/tile-source.ts +156 -0
- package/src/ts/plugin/charts.ts +286 -0
- package/src/ts/plugin/plugin.ts +668 -0
- package/src/ts/render/scheduler.ts +339 -0
- package/src/ts/shaders/area.frag.glsl +20 -0
- package/src/ts/shaders/area.vert.glsl +19 -0
- package/src/ts/shaders/bar.frag.glsl +25 -0
- package/src/ts/shaders/bar.vert.glsl +60 -0
- package/src/ts/shaders/candlestick-body.frag.glsl +19 -0
- package/src/ts/shaders/candlestick-body.vert.glsl +34 -0
- package/src/ts/shaders/density-extreme.frag.glsl +30 -0
- package/src/ts/shaders/density-mrt.frag.glsl +44 -0
- package/src/ts/shaders/density-mrt.vert.glsl +48 -0
- package/src/ts/shaders/density-resolve.frag.glsl +89 -0
- package/src/ts/shaders/density-resolve.vert.glsl +23 -0
- package/src/ts/shaders/density-splat.frag.glsl +34 -0
- package/src/ts/shaders/density-splat.vert.glsl +52 -0
- package/src/ts/shaders/gridline.frag.glsl +18 -0
- package/src/ts/shaders/gridline.vert.glsl +18 -0
- package/src/ts/shaders/heatmap.frag.glsl +23 -0
- package/src/ts/shaders/heatmap.vert.glsl +42 -0
- package/src/ts/shaders/line-uniform.frag.glsl +26 -0
- package/src/ts/shaders/line-uniform.vert.glsl +54 -0
- package/src/ts/shaders/line.frag.glsl +28 -0
- package/src/ts/shaders/line.vert.glsl +87 -0
- package/src/ts/shaders/scatter.frag.glsl +39 -0
- package/src/ts/shaders/scatter.vert.glsl +67 -0
- package/src/ts/shaders/sunburst-arc.frag.glsl +19 -0
- package/src/ts/shaders/sunburst-arc.vert.glsl +79 -0
- package/src/ts/shaders/tile.frag.glsl +27 -0
- package/src/ts/shaders/tile.vert.glsl +35 -0
- package/src/ts/shaders/treemap.frag.glsl +19 -0
- package/src/ts/shaders/treemap.vert.glsl +25 -0
- package/src/ts/shaders/y-scatter.frag.glsl +30 -0
- package/src/ts/shaders/y-scatter.vert.glsl +31 -0
- package/src/ts/theme/gradient.ts +312 -0
- package/src/ts/theme/palette.ts +64 -0
- package/src/ts/theme/theme-snapshot.ts +66 -0
- package/src/ts/theme/theme.ts +166 -0
- package/src/ts/transport/protocol.ts +497 -0
- package/src/ts/transport/renderer-transport.ts +788 -0
- package/src/ts/utils/css.ts +36 -0
- package/src/ts/utils/font-snapshot.ts +159 -0
- package/src/ts/webgl/buffer-pool.ts +163 -0
- package/src/ts/webgl/context-manager.ts +414 -0
- package/src/ts/webgl/gradient-texture.ts +84 -0
- package/src/ts/webgl/instanced-attrs.ts +139 -0
- package/src/ts/webgl/plot-frame.ts +91 -0
- package/src/ts/webgl/program-cache.ts +46 -0
- package/src/ts/webgl/shader-manifest.ts +148 -0
- package/src/ts/webgl/shader-registry.ts +97 -0
- package/src/ts/worker/boot.ts +22 -0
- package/src/ts/worker/dispatch.ts +99 -0
- package/src/ts/worker/font-loader.ts +89 -0
- package/src/ts/worker/renderer.worker.ts +734 -0
- package/src/ts/worker/session-host.ts +118 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
precision highp float;
|
|
14
|
+
|
|
15
|
+
uniform sampler2D u_heat;
|
|
16
|
+
uniform sampler2D u_extreme;
|
|
17
|
+
uniform sampler2D u_gradient_lut;
|
|
18
|
+
|
|
19
|
+
// Saturation knob shared by every mode. `density` maps it onto hue,
|
|
20
|
+
// `mean` / `extreme` map it onto alpha, `signed` uses it as the
|
|
21
|
+
// signed-sum denominator.
|
|
22
|
+
uniform float u_heat_max;
|
|
23
|
+
|
|
24
|
+
// 0 = density-only (color column ignored)
|
|
25
|
+
// 1 = mean (density-weighted average of color-t)
|
|
26
|
+
// 2 = extreme (sign-aware max-blended deviation)
|
|
27
|
+
// 3 = signed (net positive vs net negative accumulation)
|
|
28
|
+
uniform int u_color_mode;
|
|
29
|
+
|
|
30
|
+
varying vec2 v_uv;
|
|
31
|
+
|
|
32
|
+
void main() {
|
|
33
|
+
vec4 sd = texture2D(u_heat, v_uv);
|
|
34
|
+
float density = sd.r;
|
|
35
|
+
float weighted = sd.g;
|
|
36
|
+
|
|
37
|
+
if(density <= 0.0) {
|
|
38
|
+
discard;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
float t;
|
|
42
|
+
float alpha;
|
|
43
|
+
float n = clamp(density / max(u_heat_max, 1e-4), 0.0, 1.0);
|
|
44
|
+
|
|
45
|
+
if(u_color_mode == 0) {
|
|
46
|
+
// Density only: gamma-curve clamped density into the hue
|
|
47
|
+
// axis. Alpha follows raw density so a single splat fades
|
|
48
|
+
// smoothly into the plot background.
|
|
49
|
+
t = pow(n, 0.6);
|
|
50
|
+
alpha = clamp(density, 0.0, 1.0);
|
|
51
|
+
} else if(u_color_mode == 2) {
|
|
52
|
+
// Extreme: signed max of `t - 0.5` is split across R (positive
|
|
53
|
+
// deviation) and G (negative deviation magnitude); whichever
|
|
54
|
+
// is larger wins the sign. Falls back to neutral if neither
|
|
55
|
+
// contributed at this pixel.
|
|
56
|
+
vec4 ext = texture2D(u_extreme, v_uv);
|
|
57
|
+
float pos = ext.r;
|
|
58
|
+
float neg = ext.g;
|
|
59
|
+
float winner = max(pos, neg);
|
|
60
|
+
if(winner <= 0.0) {
|
|
61
|
+
t = 0.5;
|
|
62
|
+
} else if(pos >= neg) {
|
|
63
|
+
t = clamp(0.5 + pos * 0.5, 0.5, 1.0);
|
|
64
|
+
} else {
|
|
65
|
+
t = clamp(0.5 - neg * 0.5, 0.0, 0.5);
|
|
66
|
+
}
|
|
67
|
+
alpha = n;
|
|
68
|
+
} else if(u_color_mode == 3) {
|
|
69
|
+
// Signed sum: each splat additively contributes `w * t`, so
|
|
70
|
+
// the per-pixel signed sum (relative to the neutral midpoint)
|
|
71
|
+
// is `Σ w(t-0.5) = G - 0.5·R`. Sign drives which half of the
|
|
72
|
+
// LUT we land in, magnitude/heat_max drives both saturation
|
|
73
|
+
// and alpha.
|
|
74
|
+
float signed_sum = weighted - 0.5 * density;
|
|
75
|
+
float mag = clamp(abs(signed_sum) / max(u_heat_max, 1e-4), 0.0, 1.0);
|
|
76
|
+
float dir = signed_sum >= 0.0 ? 1.0 : -1.0;
|
|
77
|
+
t = clamp(0.5 + 0.5 * dir * mag, 0.0, 1.0);
|
|
78
|
+
alpha = mag;
|
|
79
|
+
} else {
|
|
80
|
+
// Mean (mode 1, default): density-weighted average of per-
|
|
81
|
+
// point color-t, with density driving alpha so sparse
|
|
82
|
+
// pixels fade out.
|
|
83
|
+
t = clamp(weighted / density, 0.0, 1.0);
|
|
84
|
+
alpha = n;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
vec4 color = texture2D(u_gradient_lut, vec2(t, 0.5));
|
|
88
|
+
gl_FragColor = vec4(color.rgb, color.a * alpha);
|
|
89
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
// Fullscreen triangle covering NDC `[-1, 1]^2`. Drawn with
|
|
14
|
+
// `drawArrays(TRIANGLES, 0, 3)`; the lone triangle's overscan rasterizes
|
|
15
|
+
// every pixel exactly once and replaces the standard two-triangle quad.
|
|
16
|
+
attribute vec2 a_corner;
|
|
17
|
+
|
|
18
|
+
varying vec2 v_uv;
|
|
19
|
+
|
|
20
|
+
void main() {
|
|
21
|
+
v_uv = a_corner * 0.5 + 0.5;
|
|
22
|
+
gl_Position = vec4(a_corner, 0.0, 1.0);
|
|
23
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
precision highp float;
|
|
14
|
+
|
|
15
|
+
uniform float u_intensity;
|
|
16
|
+
|
|
17
|
+
varying vec2 v_uv;
|
|
18
|
+
varying float v_color_t;
|
|
19
|
+
|
|
20
|
+
void main() {
|
|
21
|
+
// Radial falloff. `length(v_uv)` is `1.0` at the disk edge.
|
|
22
|
+
// `pow(...)^2` matches the WGSL reference splat shape.
|
|
23
|
+
float r = length(v_uv);
|
|
24
|
+
float w = max(0.0, 1.0 - r);
|
|
25
|
+
w = w * w * u_intensity;
|
|
26
|
+
if(w <= 0.0) {
|
|
27
|
+
discard;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// R: accumulated density. G: density-weighted color-t. The resolve
|
|
31
|
+
// pass divides G/R to recover the per-pixel weighted-average t.
|
|
32
|
+
// Blend func at the call site is `(gl.ONE, gl.ONE)` (additive).
|
|
33
|
+
gl_FragColor = vec4(w, w * v_color_t, 0.0, 0.0);
|
|
34
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
// Per-vertex (divisor 0): unit-quad corner in `[(-1,-1), (1,-1), (-1,1), (1,1)]`.
|
|
14
|
+
attribute vec2 a_corner;
|
|
15
|
+
|
|
16
|
+
// Per-instance (divisor 1): data-space xy of the splat center.
|
|
17
|
+
attribute vec2 a_position;
|
|
18
|
+
|
|
19
|
+
// Per-instance (divisor 1): raw color column value. Folded into a
|
|
20
|
+
// sign-aware `t` matching the scatter glyph for cross-chart parity.
|
|
21
|
+
attribute float a_color_value;
|
|
22
|
+
|
|
23
|
+
// Splat radius expressed in NDC. Computed CPU-side as
|
|
24
|
+
// `(radius_px * dpr * 2) / plot_pixel_width` so the disk maintains a
|
|
25
|
+
// fixed pixel footprint as the user zooms.
|
|
26
|
+
uniform vec2 u_radius_ndc;
|
|
27
|
+
|
|
28
|
+
uniform mat4 u_projection;
|
|
29
|
+
uniform vec2 u_color_range;
|
|
30
|
+
varying vec2 v_uv;
|
|
31
|
+
varying float v_color_t;
|
|
32
|
+
|
|
33
|
+
void main() {
|
|
34
|
+
// Project the data-space center into clip space, then offset by the
|
|
35
|
+
// unit-quad corner scaled by `u_radius_ndc`. This keeps splats
|
|
36
|
+
// axis-aligned to the screen regardless of zoom level.
|
|
37
|
+
vec4 center = u_projection * vec4(a_position, 0.0, 1.0);
|
|
38
|
+
gl_Position = center + vec4(a_corner * u_radius_ndc * center.w, 0.0, 0.0);
|
|
39
|
+
|
|
40
|
+
v_uv = a_corner;
|
|
41
|
+
|
|
42
|
+
float cmin = u_color_range.x;
|
|
43
|
+
float cmax = u_color_range.y;
|
|
44
|
+
if(cmax <= cmin) {
|
|
45
|
+
v_color_t = 0.5;
|
|
46
|
+
} else if(cmin < 0.0 && cmax > 0.0) {
|
|
47
|
+
float denom = max(-cmin, cmax);
|
|
48
|
+
v_color_t = clamp(0.5 + 0.5 * (a_color_value / denom), 0.0, 1.0);
|
|
49
|
+
} else {
|
|
50
|
+
v_color_t = clamp((a_color_value - cmin) / (cmax - cmin), 0.0, 1.0);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
precision mediump float;
|
|
14
|
+
uniform vec4 u_color;
|
|
15
|
+
|
|
16
|
+
void main() {
|
|
17
|
+
gl_FragColor = u_color;
|
|
18
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
attribute vec2 a_position;
|
|
14
|
+
uniform mat4 u_projection;
|
|
15
|
+
|
|
16
|
+
void main() {
|
|
17
|
+
gl_Position = u_projection * vec4(a_position, 0.0, 1.0);
|
|
18
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
precision highp float;
|
|
14
|
+
|
|
15
|
+
uniform sampler2D u_gradient_lut;
|
|
16
|
+
|
|
17
|
+
varying float v_color_t;
|
|
18
|
+
|
|
19
|
+
void main() {
|
|
20
|
+
float t = clamp(v_color_t, 0.0, 1.0);
|
|
21
|
+
vec4 rgba = texture2D(u_gradient_lut, vec2(t, 0.5));
|
|
22
|
+
gl_FragColor = vec4(rgba.rgb, 1.0);
|
|
23
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
// Unit-quad corner per vertex: (0,0) bottom-left → (1,1) top-right.
|
|
14
|
+
attribute vec2 a_corner;
|
|
15
|
+
|
|
16
|
+
// Per-instance: cell center (data units) + normalized color t in [0, 1].
|
|
17
|
+
// In category mode the center is the integer index `(xIdx, yIdx)`; in
|
|
18
|
+
// numeric mode the JS uploader pre-multiplies into real data values
|
|
19
|
+
// (e.g. ms-since-epoch).
|
|
20
|
+
attribute vec2 a_cell;
|
|
21
|
+
attribute float a_color_t;
|
|
22
|
+
uniform mat4 u_projection;
|
|
23
|
+
|
|
24
|
+
// Inset applied in data-space so the shader can carve a pixel-accurate
|
|
25
|
+
// gap between neighbouring cells regardless of plot size.
|
|
26
|
+
uniform vec2 u_cell_inset;
|
|
27
|
+
|
|
28
|
+
// Cell size in data units. `(1.0, 1.0)` for the integer category grid;
|
|
29
|
+
// in numeric mode the bandWidth derived from min adjacent delta.
|
|
30
|
+
uniform vec2 u_cell_size;
|
|
31
|
+
varying float v_color_t;
|
|
32
|
+
|
|
33
|
+
void main() {
|
|
34
|
+
// Cell `c` occupies [c - half, c + half] on each axis. Inset shrinks
|
|
35
|
+
// the rendered rect inward by `u_cell_inset` on all sides.
|
|
36
|
+
vec2 half_size = 0.5 * u_cell_size;
|
|
37
|
+
vec2 span = u_cell_size - 2.0 * u_cell_inset;
|
|
38
|
+
float x = a_cell.x - half_size.x + u_cell_inset.x + a_corner.x * span.x;
|
|
39
|
+
float y = a_cell.y - half_size.y + u_cell_inset.y + a_corner.y * span.y;
|
|
40
|
+
gl_Position = u_projection * vec4(x, y, 0.0, 1.0);
|
|
41
|
+
v_color_t = a_color_t;
|
|
42
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
precision highp float;
|
|
14
|
+
|
|
15
|
+
uniform vec4 u_color;
|
|
16
|
+
uniform float u_line_width;
|
|
17
|
+
|
|
18
|
+
varying float v_edge_dist;
|
|
19
|
+
|
|
20
|
+
void main() {
|
|
21
|
+
float dist = abs(v_edge_dist);
|
|
22
|
+
float coreEdge = u_line_width / (u_line_width + 1.5);
|
|
23
|
+
float alpha = 1.0 - smoothstep(coreEdge, 1.0, dist);
|
|
24
|
+
|
|
25
|
+
gl_FragColor = vec4(u_color.rgb, u_color.a * alpha);
|
|
26
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
// Uniform-color line shader used by bar's line-glyph overlay. The
|
|
14
|
+
// LineChart pipeline uses `line.vert.glsl` instead, which drives color
|
|
15
|
+
// from a per-point series-id + gradient LUT. Bar pre-computes one
|
|
16
|
+
// `s.color` per series from its own palette resolver, so a uniform
|
|
17
|
+
// is the right fit here.
|
|
18
|
+
attribute vec2 a_start;
|
|
19
|
+
attribute vec2 a_end;
|
|
20
|
+
|
|
21
|
+
// Per-vertex attribute (advance every vertex, divisor=0)
|
|
22
|
+
// 0 = start+left, 1 = start+right, 2 = end+left, 3 = end+right
|
|
23
|
+
attribute float a_corner;
|
|
24
|
+
|
|
25
|
+
uniform mat4 u_projection;
|
|
26
|
+
uniform vec2 u_resolution;
|
|
27
|
+
uniform float u_line_width;
|
|
28
|
+
|
|
29
|
+
varying float v_edge_dist;
|
|
30
|
+
|
|
31
|
+
void main() {
|
|
32
|
+
vec4 clipStart = u_projection * vec4(a_start, 0.0, 1.0);
|
|
33
|
+
vec4 clipEnd = u_projection * vec4(a_end, 0.0, 1.0);
|
|
34
|
+
|
|
35
|
+
vec2 pixelStart = clipStart.xy * u_resolution * 0.5;
|
|
36
|
+
vec2 pixelEnd = clipEnd.xy * u_resolution * 0.5;
|
|
37
|
+
|
|
38
|
+
vec2 dir = pixelEnd - pixelStart;
|
|
39
|
+
float segLen = length(dir);
|
|
40
|
+
dir = segLen > 0.001 ? dir / segLen : vec2(1.0, 0.0);
|
|
41
|
+
|
|
42
|
+
vec2 normal = vec2(-dir.y, dir.x);
|
|
43
|
+
|
|
44
|
+
float isEnd = step(1.5, a_corner);
|
|
45
|
+
float side = 1.0 - mod(a_corner, 2.0) * 2.0;
|
|
46
|
+
|
|
47
|
+
vec4 clipPos = mix(clipStart, clipEnd, isEnd);
|
|
48
|
+
|
|
49
|
+
float halfWidth = (u_line_width + 1.5) * 0.5;
|
|
50
|
+
vec2 clipOffset = (normal * side * halfWidth) / (u_resolution * 0.5);
|
|
51
|
+
|
|
52
|
+
gl_Position = clipPos + vec4(clipOffset, 0.0, 0.0);
|
|
53
|
+
v_edge_dist = side;
|
|
54
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
precision highp float;
|
|
14
|
+
|
|
15
|
+
uniform float u_line_width;
|
|
16
|
+
|
|
17
|
+
varying float v_edge_dist;
|
|
18
|
+
varying vec3 v_color;
|
|
19
|
+
|
|
20
|
+
void main() {
|
|
21
|
+
// |v_edge_dist| ranges from 0 (line centre) to 1 (outer AA fringe edge).
|
|
22
|
+
// The solid core of the line extends to coreEdge; beyond that we fade out.
|
|
23
|
+
float dist = abs(v_edge_dist);
|
|
24
|
+
float coreEdge = u_line_width / (u_line_width + 1.5);
|
|
25
|
+
float alpha = 1.0 - smoothstep(coreEdge, 1.0, dist);
|
|
26
|
+
|
|
27
|
+
gl_FragColor = vec4(v_color, alpha);
|
|
28
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
// Per-instance attributes (advance once per segment via divisor=1).
|
|
14
|
+
// Both `a_start`/`a_end` and `a_color_start`/`a_color_end` read from
|
|
15
|
+
// the same flat buffers using overlapping offsets: instance i reads
|
|
16
|
+
// vertex[i] into `*_start` and vertex[i+1] into `*_end`. Each per-
|
|
17
|
+
// series draw call binds into its own slot range, so segments never
|
|
18
|
+
// cross series boundaries — the CPU-side rebinding in `drawLineSeries`
|
|
19
|
+
// is the safeguard, so the shader contains no discard branch.
|
|
20
|
+
//
|
|
21
|
+
// `a_color_start` / `a_color_end` carry the segment endpoints' raw
|
|
22
|
+
// color values (numeric data value for gradient, dictionary index for
|
|
23
|
+
// categorical). The gradient LUT is sampled using the same mapping the
|
|
24
|
+
// scatter shader uses — `(v - cmin) / (cmax - cmin)` with sign-aware
|
|
25
|
+
// handling for zero-crossing domains. The two endpoints' colors are
|
|
26
|
+
// averaged so the segment reads as a single chord in gradient space.
|
|
27
|
+
attribute vec2 a_start;
|
|
28
|
+
attribute vec2 a_end;
|
|
29
|
+
attribute float a_color_start;
|
|
30
|
+
attribute float a_color_end;
|
|
31
|
+
|
|
32
|
+
// Per-vertex attribute (advance every vertex, divisor=0)
|
|
33
|
+
// 0 = start+left, 1 = start+right, 2 = end+left, 3 = end+right
|
|
34
|
+
attribute float a_corner;
|
|
35
|
+
|
|
36
|
+
uniform mat4 u_projection;
|
|
37
|
+
uniform vec2 u_resolution;
|
|
38
|
+
uniform float u_line_width;
|
|
39
|
+
uniform vec2 u_color_range;
|
|
40
|
+
uniform sampler2D u_gradient_lut;
|
|
41
|
+
|
|
42
|
+
varying float v_edge_dist;
|
|
43
|
+
varying vec3 v_color;
|
|
44
|
+
|
|
45
|
+
float colorT(float v, float cmin, float cmax) {
|
|
46
|
+
if(cmax <= cmin) {
|
|
47
|
+
return 0.5;
|
|
48
|
+
} else if(cmin < 0.0 && cmax > 0.0) {
|
|
49
|
+
float denom = max(-cmin, cmax);
|
|
50
|
+
return clamp(0.5 + 0.5 * (v / denom), 0.0, 1.0);
|
|
51
|
+
}
|
|
52
|
+
return clamp((v - cmin) / (cmax - cmin), 0.0, 1.0);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
void main() {
|
|
56
|
+
// Average the two endpoints so the segment takes one color — keeps
|
|
57
|
+
// the fragment shader cheap (no interpolated t sample) and matches
|
|
58
|
+
// the single-tone feel of the old per-series palette.
|
|
59
|
+
float cmin = u_color_range.x;
|
|
60
|
+
float cmax = u_color_range.y;
|
|
61
|
+
float avgVal = 0.5 * (a_color_start + a_color_end);
|
|
62
|
+
float t = colorT(avgVal, cmin, cmax);
|
|
63
|
+
v_color = texture2D(u_gradient_lut, vec2(t, 0.5)).rgb;
|
|
64
|
+
|
|
65
|
+
vec4 clipStart = u_projection * vec4(a_start, 0.0, 1.0);
|
|
66
|
+
vec4 clipEnd = u_projection * vec4(a_end, 0.0, 1.0);
|
|
67
|
+
|
|
68
|
+
vec2 pixelStart = clipStart.xy * u_resolution * 0.5;
|
|
69
|
+
vec2 pixelEnd = clipEnd.xy * u_resolution * 0.5;
|
|
70
|
+
|
|
71
|
+
vec2 dir = pixelEnd - pixelStart;
|
|
72
|
+
float segLen = length(dir);
|
|
73
|
+
dir = segLen > 0.001 ? dir / segLen : vec2(1.0, 0.0);
|
|
74
|
+
|
|
75
|
+
vec2 normal = vec2(-dir.y, dir.x);
|
|
76
|
+
|
|
77
|
+
float isEnd = step(1.5, a_corner);
|
|
78
|
+
float side = 1.0 - mod(a_corner, 2.0) * 2.0;
|
|
79
|
+
|
|
80
|
+
vec4 clipPos = mix(clipStart, clipEnd, isEnd);
|
|
81
|
+
|
|
82
|
+
float halfWidth = (u_line_width + 1.5) * 0.5;
|
|
83
|
+
vec2 clipOffset = (normal * side * halfWidth) / (u_resolution * 0.5);
|
|
84
|
+
|
|
85
|
+
gl_Position = clipPos + vec4(clipOffset, 0.0, 0.0);
|
|
86
|
+
v_edge_dist = side;
|
|
87
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
precision highp float;
|
|
14
|
+
|
|
15
|
+
varying float v_color_t;
|
|
16
|
+
varying float v_point_size;
|
|
17
|
+
|
|
18
|
+
uniform sampler2D u_gradient_lut;
|
|
19
|
+
|
|
20
|
+
void main() {
|
|
21
|
+
// Distance from center of point sprite in [0, 0.5] space
|
|
22
|
+
vec2 coord = gl_PointCoord - vec2(0.5);
|
|
23
|
+
float dist = length(coord);
|
|
24
|
+
|
|
25
|
+
// Discard fragments clearly outside the circle
|
|
26
|
+
if(dist > 0.5) {
|
|
27
|
+
discard;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Anti-alias: smooth falloff over ~1.5 screen pixels at the edge.
|
|
31
|
+
// In point-coord space, 1 pixel = 1/v_point_size.
|
|
32
|
+
float pixelWidth = 1.5 / max(v_point_size, 1.0);
|
|
33
|
+
float alpha = 1.0 - smoothstep(0.5 - pixelWidth, 0.5, dist);
|
|
34
|
+
|
|
35
|
+
// LUT lookup — t is already sign-aware (pre-baked CPU-side via
|
|
36
|
+
// `colorValueToT`), so the shader is a pure sampler.
|
|
37
|
+
vec4 color = texture2D(u_gradient_lut, vec2(clamp(v_color_t, 0.0, 1.0), 0.5));
|
|
38
|
+
gl_FragColor = vec4(color.rgb, color.a * alpha);
|
|
39
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
|
2
|
+
// ┃ ██████ ██████ ██████ █ █ █ █ █ █▄ ▀███ █ ┃
|
|
3
|
+
// ┃ ▄▄▄▄▄█ █▄▄▄▄▄ ▄▄▄▄▄█ ▀▀▀▀▀█▀▀▀▀▀ █ ▀▀▀▀▀█ ████████▌▐███ ███▄ ▀█ █ ▀▀▀▀▀ ┃
|
|
4
|
+
// ┃ █▀▀▀▀▀ █▀▀▀▀▀ █▀██▀▀ ▄▄▄▄▄ █ ▄▄▄▄▄█ ▄▄▄▄▄█ ████████▌▐███ █████▄ █ ▄▄▄▄▄ ┃
|
|
5
|
+
// ┃ █ ██████ █ ▀█▄ █ ██████ █ ███▌▐███ ███████▄ █ ┃
|
|
6
|
+
// ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
|
|
7
|
+
// ┃ Copyright (c) 2017, the Perspective Authors. ┃
|
|
8
|
+
// ┃ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ ┃
|
|
9
|
+
// ┃ This file is part of the Perspective library, distributed under the terms ┃
|
|
10
|
+
// ┃ of the [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0). ┃
|
|
11
|
+
// ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
|
|
12
|
+
|
|
13
|
+
attribute vec2 a_position;
|
|
14
|
+
attribute float a_color_value;
|
|
15
|
+
attribute float a_size_value;
|
|
16
|
+
|
|
17
|
+
uniform mat4 u_projection;
|
|
18
|
+
uniform float u_point_size;
|
|
19
|
+
// Data extents of the color column. The vertex shader folds these into a
|
|
20
|
+
// sign-aware `t` whose 50% stop is always the sign pivot, matching the
|
|
21
|
+
// CPU-side `colorValueToT` helper used by heatmap and the Canvas2D
|
|
22
|
+
// legend / tooltip.
|
|
23
|
+
uniform vec2 u_color_range;
|
|
24
|
+
uniform vec2 u_size_range;
|
|
25
|
+
uniform vec2 u_point_size_range;
|
|
26
|
+
|
|
27
|
+
varying float v_color_t;
|
|
28
|
+
varying float v_point_size;
|
|
29
|
+
|
|
30
|
+
void main() {
|
|
31
|
+
// No unused-slot discard: tight per-series draws in `points.ts`
|
|
32
|
+
// already bound `gl.drawArrays(gl.POINTS, s*cap, count[s])` to
|
|
33
|
+
// valid rows, so the shader never sees a tail slot. A historical
|
|
34
|
+
// sentinel branch here culled `a_color_value < 0.0`, which under
|
|
35
|
+
// current dispatch silently dropped real numeric color data
|
|
36
|
+
// whenever the user's color column legitimately went negative
|
|
37
|
+
// (e.g., a diverging `Profit` column).
|
|
38
|
+
gl_Position = u_projection * vec4(a_position, 0.0, 1.0);
|
|
39
|
+
|
|
40
|
+
float sizeRange = u_size_range.y - u_size_range.x;
|
|
41
|
+
if(sizeRange > 0.0) {
|
|
42
|
+
float size_t = clamp((a_size_value - u_size_range.x) / sizeRange, 0.0, 1.0);
|
|
43
|
+
gl_PointSize = mix(u_point_size_range.x, u_point_size_range.y, size_t);
|
|
44
|
+
} else {
|
|
45
|
+
gl_PointSize = u_point_size;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
v_point_size = gl_PointSize;
|
|
49
|
+
|
|
50
|
+
// Color-t mapping. Linear across `[cmin, cmax]` for single-sign
|
|
51
|
+
// domains (which includes categorical `[0, N-1]` split / string
|
|
52
|
+
// indices, so the colors match `interpolatePalette`'s even sampling
|
|
53
|
+
// used by the legend). When the domain actually crosses zero we
|
|
54
|
+
// switch to sign-aware so the value 0 always lands at the 50% stop
|
|
55
|
+
// of the diverging gradient — matching heatmap and the Canvas2D
|
|
56
|
+
// tooltip paths.
|
|
57
|
+
float cmin = u_color_range.x;
|
|
58
|
+
float cmax = u_color_range.y;
|
|
59
|
+
if(cmax <= cmin) {
|
|
60
|
+
v_color_t = 0.5;
|
|
61
|
+
} else if(cmin < 0.0 && cmax > 0.0) {
|
|
62
|
+
float denom = max(-cmin, cmax);
|
|
63
|
+
v_color_t = clamp(0.5 + 0.5 * (a_color_value / denom), 0.0, 1.0);
|
|
64
|
+
} else {
|
|
65
|
+
v_color_t = clamp((a_color_value - cmin) / (cmax - cmin), 0.0, 1.0);
|
|
66
|
+
}
|
|
67
|
+
}
|