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.
- package/CHANGELOG.md +7 -0
- package/dist/charts/canvas.d.cts +4 -1
- package/dist/charts/canvas.d.ts +4 -1
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +5 -2
- package/dist/charts/core.d.ts +5 -2
- package/dist/charts/core.js +6 -4
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +65 -53
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -2
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +342 -323
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +17 -0
- package/dist/charts/engine/color.d.ts +17 -0
- package/dist/charts/engine/color.js +27 -3
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +6 -0
- package/dist/charts/engine/controller.d.ts +6 -0
- package/dist/charts/engine/controller.js +317 -253
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/curve.cjs +2 -0
- package/dist/charts/engine/curve.cjs.map +1 -0
- package/dist/charts/engine/curve.d.cts +15 -0
- package/dist/charts/engine/curve.d.ts +15 -0
- package/dist/charts/engine/curve.js +56 -0
- package/dist/charts/engine/curve.js.map +1 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +15 -2
- package/dist/charts/engine/data.d.ts +15 -2
- package/dist/charts/engine/data.js +98 -38
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/dom.cjs +1 -1
- package/dist/charts/engine/dom.cjs.map +1 -1
- package/dist/charts/engine/dom.d.cts +5 -3
- package/dist/charts/engine/dom.d.ts +5 -3
- package/dist/charts/engine/dom.js +27 -22
- package/dist/charts/engine/dom.js.map +1 -1
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.js +132 -61
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +30 -3
- package/dist/charts/engine/model.d.ts +30 -3
- package/dist/charts/engine/model.js +225 -108
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +2 -0
- package/dist/charts/engine/overlay.d.ts +2 -0
- package/dist/charts/engine/overlay.js +16 -16
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +71 -5
- package/dist/charts/engine/presets.d.ts +71 -5
- package/dist/charts/engine/presets.js +120 -33
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.js +149 -111
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/renderers/range.cjs +1 -1
- package/dist/charts/engine/renderers/range.cjs.map +1 -1
- package/dist/charts/engine/renderers/range.js +4 -4
- package/dist/charts/engine/renderers/range.js.map +1 -1
- package/dist/charts/engine/renderers/shaders.cjs +37 -19
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
- package/dist/charts/engine/renderers/shaders.d.cts +2 -2
- package/dist/charts/engine/renderers/shaders.d.ts +2 -2
- package/dist/charts/engine/renderers/shaders.js +37 -19
- package/dist/charts/engine/renderers/shaders.js.map +1 -1
- package/dist/charts/engine/renderers/types.cjs.map +1 -1
- package/dist/charts/engine/renderers/types.d.cts +11 -4
- package/dist/charts/engine/renderers/types.d.ts +11 -4
- package/dist/charts/engine/renderers/types.js.map +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl2.js +33 -12
- package/dist/charts/engine/renderers/webgl2.js.map +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgpu.js +18 -15
- package/dist/charts/engine/renderers/webgpu.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +19 -6
- package/dist/charts/engine/scene.d.ts +19 -6
- package/dist/charts/engine/scene.js +201 -89
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/canvas.cjs +2 -0
- package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
- package/dist/charts/engine/shapes/canvas.d.cts +58 -0
- package/dist/charts/engine/shapes/canvas.d.ts +58 -0
- package/dist/charts/engine/shapes/canvas.js +159 -0
- package/dist/charts/engine/shapes/canvas.js.map +1 -0
- package/dist/charts/engine/shapes/chart.cjs +2 -0
- package/dist/charts/engine/shapes/chart.cjs.map +1 -0
- package/dist/charts/engine/shapes/chart.d.cts +6 -0
- package/dist/charts/engine/shapes/chart.d.ts +6 -0
- package/dist/charts/engine/shapes/chart.js +273 -0
- package/dist/charts/engine/shapes/chart.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +2 -0
- package/dist/charts/engine/shapes/draw.cjs.map +1 -0
- package/dist/charts/engine/shapes/draw.d.cts +20 -0
- package/dist/charts/engine/shapes/draw.d.ts +20 -0
- package/dist/charts/engine/shapes/draw.js +152 -0
- package/dist/charts/engine/shapes/draw.js.map +1 -0
- package/dist/charts/engine/shapes/funnel.cjs +2 -0
- package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
- package/dist/charts/engine/shapes/funnel.d.cts +6 -0
- package/dist/charts/engine/shapes/funnel.d.ts +6 -0
- package/dist/charts/engine/shapes/funnel.js +149 -0
- package/dist/charts/engine/shapes/funnel.js.map +1 -0
- package/dist/charts/engine/shapes/gauge.cjs +2 -0
- package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
- package/dist/charts/engine/shapes/gauge.d.cts +7 -0
- package/dist/charts/engine/shapes/gauge.d.ts +7 -0
- package/dist/charts/engine/shapes/gauge.js +173 -0
- package/dist/charts/engine/shapes/gauge.js.map +1 -0
- package/dist/charts/engine/shapes/hit.cjs +2 -0
- package/dist/charts/engine/shapes/hit.cjs.map +1 -0
- package/dist/charts/engine/shapes/hit.d.cts +28 -0
- package/dist/charts/engine/shapes/hit.d.ts +28 -0
- package/dist/charts/engine/shapes/hit.js +124 -0
- package/dist/charts/engine/shapes/hit.js.map +1 -0
- package/dist/charts/engine/shapes/index.d.cts +9 -0
- package/dist/charts/engine/shapes/index.d.ts +9 -0
- package/dist/charts/engine/shapes/layout.cjs +3 -0
- package/dist/charts/engine/shapes/layout.cjs.map +1 -0
- package/dist/charts/engine/shapes/layout.d.cts +88 -0
- package/dist/charts/engine/shapes/layout.d.ts +88 -0
- package/dist/charts/engine/shapes/layout.js +266 -0
- package/dist/charts/engine/shapes/layout.js.map +1 -0
- package/dist/charts/engine/shapes/pie.cjs +2 -0
- package/dist/charts/engine/shapes/pie.cjs.map +1 -0
- package/dist/charts/engine/shapes/pie.d.cts +20 -0
- package/dist/charts/engine/shapes/pie.d.ts +20 -0
- package/dist/charts/engine/shapes/pie.js +302 -0
- package/dist/charts/engine/shapes/pie.js.map +1 -0
- package/dist/charts/engine/shapes/radar.cjs +2 -0
- package/dist/charts/engine/shapes/radar.cjs.map +1 -0
- package/dist/charts/engine/shapes/radar.d.cts +8 -0
- package/dist/charts/engine/shapes/radar.d.ts +8 -0
- package/dist/charts/engine/shapes/radar.js +197 -0
- package/dist/charts/engine/shapes/radar.js.map +1 -0
- package/dist/charts/engine/shapes/runtime.cjs +2 -0
- package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
- package/dist/charts/engine/shapes/runtime.d.cts +29 -0
- package/dist/charts/engine/shapes/runtime.d.ts +29 -0
- package/dist/charts/engine/shapes/runtime.js +97 -0
- package/dist/charts/engine/shapes/runtime.js.map +1 -0
- package/dist/charts/engine/shapes/scene.cjs +2 -0
- package/dist/charts/engine/shapes/scene.cjs.map +1 -0
- package/dist/charts/engine/shapes/scene.d.cts +257 -0
- package/dist/charts/engine/shapes/scene.d.ts +257 -0
- package/dist/charts/engine/shapes/scene.js +123 -0
- package/dist/charts/engine/shapes/scene.js.map +1 -0
- package/dist/charts/engine/shapes/treemap.cjs +2 -0
- package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
- package/dist/charts/engine/shapes/treemap.d.cts +14 -0
- package/dist/charts/engine/shapes/treemap.d.ts +14 -0
- package/dist/charts/engine/shapes/treemap.js +213 -0
- package/dist/charts/engine/shapes/treemap.js.map +1 -0
- package/dist/charts/engine/shapes/types.d.cts +292 -0
- package/dist/charts/engine/shapes/types.d.ts +292 -0
- package/dist/charts/engine/signature.cjs +2 -0
- package/dist/charts/engine/signature.cjs.map +1 -0
- package/dist/charts/engine/signature.d.cts +9 -0
- package/dist/charts/engine/signature.d.ts +9 -0
- package/dist/charts/engine/signature.js +13 -0
- package/dist/charts/engine/signature.js.map +1 -0
- package/dist/charts/engine/theme.cjs +1 -1
- package/dist/charts/engine/theme.cjs.map +1 -1
- package/dist/charts/engine/theme.d.cts +10 -1
- package/dist/charts/engine/theme.d.ts +10 -1
- package/dist/charts/engine/theme.js +40 -16
- package/dist/charts/engine/theme.js.map +1 -1
- package/dist/charts/engine/types.d.cts +70 -9
- package/dist/charts/engine/types.d.ts +70 -9
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +4 -2
- package/dist/charts/index.d.ts +4 -2
- package/dist/charts/index.js +8 -5
- package/dist/charts/react/Chart.cjs +1 -1
- package/dist/charts/react/Chart.cjs.map +1 -1
- package/dist/charts/react/Chart.d.cts +8 -1
- package/dist/charts/react/Chart.d.ts +8 -1
- package/dist/charts/react/Chart.js +66 -47
- package/dist/charts/react/Chart.js.map +1 -1
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.d.cts +10 -2
- package/dist/charts/react/charts.d.ts +10 -2
- package/dist/charts/react/charts.js +174 -51
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/shapes.cjs +2 -0
- package/dist/charts/react/shapes.cjs.map +1 -0
- package/dist/charts/react/shapes.d.cts +255 -0
- package/dist/charts/react/shapes.d.ts +255 -0
- package/dist/charts/react/shapes.js +242 -0
- package/dist/charts/react/shapes.js.map +1 -0
- package/dist/charts/react/types.d.cts +73 -4
- package/dist/charts/react/types.d.ts +73 -4
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +12 -3
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +334 -270
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/curve.cjs +2 -0
- package/dist/native/charts/src/engine/curve.cjs.map +1 -0
- package/dist/native/charts/src/engine/curve.js +56 -0
- package/dist/native/charts/src/engine/curve.js.map +1 -0
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +98 -38
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +229 -112
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js +16 -16
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +11 -4
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +209 -97
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/theme.cjs.map +1 -1
- package/dist/native/charts/src/engine/theme.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +31 -19
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/source/components/Chart/scene.tsx +54 -20
- package/dist/taro/index.js +1059 -579
- package/dist/uni/charts-canvas.js +3 -1
- package/dist/weapp/controls.js +966 -225
- 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:
|
|
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(
|
|
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.
|
|
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
|
|
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
|
-
|
|
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) *
|
|
113
|
-
return vec4f(
|
|
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
|
|
190
|
-
in
|
|
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
|
-
|
|
197
|
-
float y = c.x > 0.5 ? p.y :
|
|
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.
|
|
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
|
|
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
|
-
|
|
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) *
|
|
235
|
-
outColor = vec4(
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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:
|
|
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(
|
|
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.
|
|
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
|
|
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
|
-
|
|
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) *
|
|
89
|
-
return vec4f(
|
|
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
|
|
164
|
-
in
|
|
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
|
-
|
|
171
|
-
float y = c.x > 0.5 ? p.y :
|
|
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.
|
|
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
|
|
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
|
-
|
|
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) *
|
|
213
|
-
outColor = vec4(
|
|
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
|
|
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
|
-
/**
|
|
53
|
-
instances:
|
|
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
|
-
/**
|
|
53
|
-
instances:
|
|
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
|
|
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`:
|
|
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
|