@fjader/svelte 0.2.1 → 0.2.3
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/dist/components/axes/BandAxisTicks.svelte +63 -24
- package/dist/components/axes/BandAxisTicks.svelte.d.ts +5 -5
- package/dist/components/charts/ChartContainer.svelte +2 -1
- package/dist/components/guides/legend/ContinuousColorLegend.svelte +2 -1
- package/dist/components/guides/legend/OrdinalColorLegend.svelte +92 -34
- package/dist/components/marks/AreaMarkX.svelte +19 -6
- package/dist/components/marks/AreaMarkY.svelte +19 -6
- package/dist/components/marks/BarMarkX.svelte +3 -0
- package/dist/components/marks/BarMarkY.svelte +3 -0
- package/dist/components/marks/DotsMark.svelte +3 -0
- package/dist/components/marks/LineMark.svelte +3 -0
- package/dist/components/marks/ParallelCoordinatesMark.svelte +6 -0
- package/dist/components/marks/ParallelCoordinatesMark.svelte.d.ts +3 -0
- package/dist/components/marks/RectMark.svelte +3 -0
- package/dist/components/marks/RectXMark.svelte +3 -0
- package/dist/components/marks/RectYMark.svelte +3 -0
- package/dist/components/marks/RuleMarkX.svelte +10 -2
- package/dist/components/marks/RuleMarkY.svelte +10 -2
- package/dist/components/marks/TextMark.svelte +68 -4
- package/dist/components/marks/lifecycle/MarkLifecycleV2.svelte.d.ts +15 -1
- package/dist/components/marks/lifecycle/MarkLifecycleV2.svelte.js +116 -27
- package/dist/components/marks/lifecycle/domain-queries.js +13 -11
- package/dist/components/marks/lifecycle/transform-scale-key.d.ts +16 -0
- package/dist/components/marks/lifecycle/transform-scale-key.js +27 -0
- package/dist/components/marks/utils/area-outline.d.ts +24 -0
- package/dist/components/marks/utils/area-outline.js +10 -0
- package/dist/components/marks/utils/reactive-config.d.ts +1 -1
- package/dist/components/marks/utils/reactive-config.js +3 -0
- package/dist/components/rendering/Areas.svelte +32 -9
- package/dist/components/rendering/Areas.svelte.d.ts +2 -0
- package/dist/components/rendering/BaseGPURenderer.svelte.js +4 -1
- package/dist/components/rendering/Dots.svelte +24 -3
- package/dist/components/rendering/Dots.svelte.d.ts +2 -0
- package/dist/components/rendering/GridLine.svelte +2 -1
- package/dist/components/rendering/Lines.svelte +51 -10
- package/dist/components/rendering/Lines.svelte.d.ts +9 -0
- package/dist/components/rendering/ParallelLines.svelte +28 -8
- package/dist/components/rendering/ParallelLines.svelte.d.ts +2 -0
- package/dist/components/rendering/Rects.svelte +20 -5
- package/dist/components/rendering/Rects.svelte.d.ts +2 -0
- package/dist/components/rendering/RuleX.svelte +20 -5
- package/dist/components/rendering/RuleX.svelte.d.ts +2 -0
- package/dist/components/rendering/RuleY.svelte +20 -5
- package/dist/components/rendering/RuleY.svelte.d.ts +2 -0
- package/dist/components/rendering/activity-reads.d.ts +93 -0
- package/dist/components/rendering/activity-reads.js +135 -0
- package/dist/components/rendering/uniform-sizes.d.ts +26 -0
- package/dist/components/rendering/uniform-sizes.js +28 -0
- package/dist/config/ChartConfig.svelte.d.ts +2 -0
- package/dist/data/DataAccessor.js +1 -1
- package/dist/gpu/ColorScaleShaderLib.d.ts +14 -2
- package/dist/gpu/ColorScaleShaderLib.js +59 -7
- package/dist/gpu/GPUCoordinator.svelte.d.ts +8 -0
- package/dist/gpu/GPUCoordinator.svelte.js +68 -32
- package/dist/gpu/NanShaderLib.d.ts +30 -0
- package/dist/gpu/NanShaderLib.js +42 -0
- package/dist/gpu/ResolveShader.d.ts +3 -3
- package/dist/gpu/ResolveShader.js +6 -5
- package/dist/gpu/ScaleTemplateSystem.d.ts +19 -0
- package/dist/gpu/ScaleTemplateSystem.js +86 -7
- package/dist/gpu/SizeScaleShaderLib.d.ts +5 -5
- package/dist/gpu/SizeScaleShaderLib.js +6 -5
- package/dist/gpu/decimation/M4Shader.d.ts +13 -7
- package/dist/gpu/decimation/M4Shader.js +79 -64
- package/dist/gpu/identity-slot-packing.d.ts +157 -40
- package/dist/gpu/identity-slot-packing.js +262 -62
- package/dist/gpu/tracked-scales.d.ts +14 -0
- package/dist/gpu/tracked-scales.js +18 -0
- package/dist/index.js +1 -0
- package/dist/interactors/BandLabelToggle.svelte +5 -9
- package/dist/interactors/BandLabelToggle.svelte.d.ts +3 -3
- package/dist/interactors/DerivedInterval1D.svelte +26 -54
- package/dist/interactors/Interval1D.svelte +2 -1
- package/dist/interactors/Interval2D.svelte +2 -1
- package/dist/interactors/ParallelAxisSource.svelte +4 -4
- package/dist/interactors/ParallelAxisSource.svelte.d.ts +2 -1
- package/dist/interactors/ParallelBrushes.svelte +8 -9
- package/dist/interactors/ParallelBrushes.svelte.d.ts +3 -3
- package/dist/interactors/Toggle.svelte +17 -36
- package/dist/interactors/Toggle.svelte.d.ts +4 -3
- package/dist/interactors/Tooltip.svelte +2 -1
- package/dist/interactors/TooltipManager.svelte.js +8 -3
- package/dist/interactors/relay-clauses.d.ts +23 -0
- package/dist/interactors/relay-clauses.js +60 -0
- package/dist/query-engine/CrossfilterSelection.svelte.d.ts +88 -15
- package/dist/query-engine/CrossfilterSelection.svelte.js +94 -20
- package/dist/query-engine/FieldActivity.svelte.d.ts +79 -0
- package/dist/query-engine/FieldActivity.svelte.js +207 -0
- package/dist/query-engine/FilterGroup.svelte.d.ts +53 -29
- package/dist/query-engine/FilterGroup.svelte.js +181 -122
- package/dist/query-engine/FilterGroupRegistry.svelte.d.ts +42 -0
- package/dist/query-engine/FilterGroupRegistry.svelte.js +103 -1
- package/dist/query-engine/MarkHandle.svelte.d.ts +9 -1
- package/dist/query-engine/MarkHandle.svelte.js +12 -2
- package/dist/query-engine/QueryEngine.d.ts +52 -16
- package/dist/query-engine/QueryEngine.js +90 -28
- package/dist/query-engine/categorical-identity.d.ts +99 -27
- package/dist/query-engine/categorical-identity.js +210 -51
- package/dist/query-engine/index.d.ts +2 -1
- package/dist/query-engine/index.js +1 -0
- package/dist/query-engine/preagg/Preagg.d.ts +1 -1
- package/dist/query-engine/preagg/Preagg.js +11 -9
- package/dist/query-engine/preagg/plan.d.ts +9 -5
- package/dist/query-engine/preagg/plan.js +13 -11
- package/dist/query-engine/toggle-predicate.js +12 -1
- package/dist/scales/ActivityTable.d.ts +99 -0
- package/dist/scales/ActivityTable.js +211 -0
- package/dist/scales/BandScaleState.svelte.d.ts +28 -7
- package/dist/scales/BandScaleState.svelte.js +55 -20
- package/dist/scales/ChartScales.svelte.d.ts +2 -2
- package/dist/scales/ColorScaleState.svelte.d.ts +36 -8
- package/dist/scales/ColorScaleState.svelte.js +118 -24
- package/dist/scales/DomainResolver.d.ts +2 -0
- package/dist/scales/DomainResolver.js +15 -8
- package/dist/scales/ScaleRegistry.svelte.d.ts +9 -0
- package/dist/scales/ScaleRegistry.svelte.js +22 -1
- package/dist/scales/TimeScaleState.svelte.js +7 -1
- package/dist/spec/index.js +1 -0
- package/dist/spec/types.d.ts +2 -0
- package/dist/transforms/index.d.ts +27 -0
- package/dist/transforms/index.js +97 -3
- package/dist/types.d.ts +30 -0
- package/package.json +1 -1
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { activityReads, colorActivityWGSL } from './activity-reads';
|
|
3
|
+
import { PARALLEL_MAX_AXES, UNIFORM_BYTES } from './uniform-sizes';
|
|
2
4
|
import { getContext, onMount, onDestroy } from 'svelte';
|
|
3
5
|
import { RendererHost } from './RendererHost.svelte';
|
|
4
6
|
import { getGPUContext } from '../../gpu';
|
|
5
7
|
import { getCurveWGSL, getCurveResolution } from '../../gpu/CurveShaderLib';
|
|
8
|
+
import { NAN_WGSL } from '../../gpu/NanShaderLib';
|
|
6
9
|
import { DEFAULT_STROKE_COLOR } from '../../scales/color-utils';
|
|
7
10
|
import type { ChartContext, CurveType, WebGPUCanvasContext } from '../../types';
|
|
8
11
|
|
|
9
|
-
const MAX_AXES =
|
|
10
|
-
const UNIFORM_SIZE =
|
|
12
|
+
const MAX_AXES = PARALLEL_MAX_AXES;
|
|
13
|
+
const UNIFORM_SIZE = UNIFORM_BYTES.parallelConfig;
|
|
11
14
|
// One ScaleParam (16 bytes) per axis, filled by the coordinator.
|
|
12
|
-
const AXIS_SCALES_SIZE =
|
|
15
|
+
const AXIS_SCALES_SIZE = UNIFORM_BYTES.parallelAxisScales;
|
|
13
16
|
|
|
14
17
|
// Both x and y so ScaleTemplateSystem generates scaleX(), scaleLinearY(), pixelsToClip()
|
|
15
18
|
const rendererDefinition = {
|
|
@@ -31,6 +34,8 @@
|
|
|
31
34
|
colorValueData?: Float32Array | null;
|
|
32
35
|
colorMode?: number;
|
|
33
36
|
colorScaleIndex?: number;
|
|
37
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
38
|
+
groupIndex?: number;
|
|
34
39
|
constantColor?: [number, number, number, number];
|
|
35
40
|
axisOrder: number[];
|
|
36
41
|
/** Each axis's scale id, in data (not visual) order. */
|
|
@@ -50,6 +55,7 @@
|
|
|
50
55
|
colorValueData = null,
|
|
51
56
|
colorMode = 0,
|
|
52
57
|
colorScaleIndex = 0,
|
|
58
|
+
groupIndex = 0,
|
|
53
59
|
constantColor = DEFAULT_STROKE_COLOR,
|
|
54
60
|
axisOrder,
|
|
55
61
|
axisScaleIds,
|
|
@@ -86,6 +92,9 @@
|
|
|
86
92
|
// (N-1) segments × resolution sub-quads × 6 verts + N circles × 6 verts
|
|
87
93
|
const vertexCount = $derived((axisCount - 1) * 6 * resolution + axisCount * 6);
|
|
88
94
|
|
|
95
|
+
/** The selection activity this shader reads; routing reads the same table. */
|
|
96
|
+
const ACTIVITY_READS = activityReads('parallel');
|
|
97
|
+
|
|
89
98
|
// evaluateCurve() and CURVE_RESOLUTION are prepended from CurveShaderLib.
|
|
90
99
|
// With linear (resolution=1): single quad per segment, identical to original.
|
|
91
100
|
// With bump-x (resolution=128): smooth S-curves between axes, adaptive.
|
|
@@ -100,7 +109,7 @@
|
|
|
100
109
|
opacity: f32,
|
|
101
110
|
colorMode: u32,
|
|
102
111
|
colorScaleIndex: u32,
|
|
103
|
-
|
|
112
|
+
groupIndex: u32,
|
|
104
113
|
_pad1: u32,
|
|
105
114
|
constantColor: vec4<f32>,
|
|
106
115
|
axisOrder: array<vec4<u32>, 4>,
|
|
@@ -123,7 +132,7 @@
|
|
|
123
132
|
// writes; only linear math is applied to them today.
|
|
124
133
|
@group(1) @binding(3) var<uniform> axisScales: array<ScaleParam, ${MAX_AXES}>;
|
|
125
134
|
|
|
126
|
-
|
|
135
|
+
${NAN_WGSL}
|
|
127
136
|
const DISCARD_POS = vec4<f32>(2.0, 2.0, 2.0, 1.0);
|
|
128
137
|
|
|
129
138
|
fn getAxisOrder(visualIdx: u32) -> u32 {
|
|
@@ -190,7 +199,12 @@
|
|
|
190
199
|
var output: VertexOutput;
|
|
191
200
|
output.position = pixelsToClip(pos);
|
|
192
201
|
output.colorValue = colorValues[rowIdx];
|
|
193
|
-
output.alpha = config.opacity
|
|
202
|
+
output.alpha = config.opacity * selectionDim(
|
|
203
|
+
${colorActivityWGSL(ACTIVITY_READS, {
|
|
204
|
+
color: 'config.colorMode, config.colorScaleIndex, colorValues[rowIdx]',
|
|
205
|
+
group: 'config.groupIndex'
|
|
206
|
+
})}
|
|
207
|
+
);
|
|
194
208
|
output.circleUV = quadPosition;
|
|
195
209
|
output.circleRadius = halfWidth;
|
|
196
210
|
return output;
|
|
@@ -269,7 +283,12 @@
|
|
|
269
283
|
var output: VertexOutput;
|
|
270
284
|
output.position = pixelsToClip(finalPos);
|
|
271
285
|
output.colorValue = colorValues[rowIdx];
|
|
272
|
-
output.alpha = config.opacity
|
|
286
|
+
output.alpha = config.opacity * selectionDim(
|
|
287
|
+
${colorActivityWGSL(ACTIVITY_READS, {
|
|
288
|
+
color: 'config.colorMode, config.colorScaleIndex, colorValues[rowIdx]',
|
|
289
|
+
group: 'config.groupIndex'
|
|
290
|
+
})}
|
|
291
|
+
);
|
|
273
292
|
output.circleUV = vec2<f32>(-2.0, -2.0);
|
|
274
293
|
output.circleRadius = 0.0;
|
|
275
294
|
return output;
|
|
@@ -360,7 +379,8 @@
|
|
|
360
379
|
f32[3] = opacity;
|
|
361
380
|
u32[4] = colorMode;
|
|
362
381
|
u32[5] = colorScaleIndex;
|
|
363
|
-
|
|
382
|
+
u32[6] = groupIndex;
|
|
383
|
+
// u32[7] = padding
|
|
364
384
|
f32[8] = constantColor[0];
|
|
365
385
|
f32[9] = constantColor[1];
|
|
366
386
|
f32[10] = constantColor[2];
|
|
@@ -6,6 +6,8 @@ interface Props {
|
|
|
6
6
|
colorValueData?: Float32Array | null;
|
|
7
7
|
colorMode?: number;
|
|
8
8
|
colorScaleIndex?: number;
|
|
9
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
10
|
+
groupIndex?: number;
|
|
9
11
|
constantColor?: [number, number, number, number];
|
|
10
12
|
axisOrder: number[];
|
|
11
13
|
/** Each axis's scale id, in data (not visual) order. */
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { UNIFORM_BYTES } from './uniform-sizes';
|
|
2
3
|
import { getContext, onMount, onDestroy } from 'svelte';
|
|
3
4
|
import { RendererHost } from './RendererHost.svelte';
|
|
4
5
|
import { getGPUContext } from '../../gpu';
|
|
5
6
|
import { DEFAULT_FILL_COLOR } from '../../scales/color-utils';
|
|
6
7
|
import type { ChartContext, WebGPUCanvasContext } from '../../types';
|
|
8
|
+
import { activityReads, markActivityWGSL } from './activity-reads';
|
|
7
9
|
|
|
8
10
|
const rectRendererDefinition = {
|
|
9
11
|
x: { concept: 'extent', channels: ['x0', 'x1'] },
|
|
@@ -30,7 +32,7 @@
|
|
|
30
32
|
COLOR_MODE: 0,
|
|
31
33
|
COLOR_SCALE_INDEX: 4,
|
|
32
34
|
INSET: 8,
|
|
33
|
-
|
|
35
|
+
GROUP_INDEX: 12,
|
|
34
36
|
CONSTANT_COLOR: 16,
|
|
35
37
|
DX: 32,
|
|
36
38
|
DY: 36
|
|
@@ -49,6 +51,8 @@
|
|
|
49
51
|
zIndex?: number;
|
|
50
52
|
colorMode?: number;
|
|
51
53
|
colorScaleIndex?: number;
|
|
54
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
55
|
+
groupIndex?: number;
|
|
52
56
|
constantColor?: [number, number, number, number];
|
|
53
57
|
inset?: number;
|
|
54
58
|
dx?: number;
|
|
@@ -78,6 +82,7 @@
|
|
|
78
82
|
zIndex = 0,
|
|
79
83
|
colorMode = 0,
|
|
80
84
|
colorScaleIndex = 0,
|
|
85
|
+
groupIndex = 0,
|
|
81
86
|
constantColor = DEFAULT_FILL_COLOR,
|
|
82
87
|
inset = 0,
|
|
83
88
|
dx = 0,
|
|
@@ -119,13 +124,16 @@
|
|
|
119
124
|
|
|
120
125
|
const rectVertexCount = 6;
|
|
121
126
|
|
|
127
|
+
/** The selection activities this shader reads; routing reads the same table. */
|
|
128
|
+
const ACTIVITY_READS = activityReads('rects');
|
|
129
|
+
|
|
122
130
|
const rectsShaderCode = `
|
|
123
131
|
// MarkConstants uniform for per-mark configuration
|
|
124
132
|
struct MarkConstants {
|
|
125
133
|
colorMode: u32, // 0 = constant, 1 = scale
|
|
126
134
|
colorScaleIndex: u32, // Index into colorConfigs
|
|
127
135
|
inset: f32, // Pixel inset on all sides
|
|
128
|
-
|
|
136
|
+
groupIndex: u32, // Page-wide filter group index, for activity reads
|
|
129
137
|
constantColor: vec4<f32>, // Used when colorMode = 0
|
|
130
138
|
dx: f32, // Horizontal pixel offset
|
|
131
139
|
dy: f32, // Vertical pixel offset
|
|
@@ -182,7 +190,14 @@
|
|
|
182
190
|
var output: VertexOutput;
|
|
183
191
|
output.position = vec4<f32>(normalizedPos.x, -normalizedPos.y, 0.0, 1.0);
|
|
184
192
|
output.colorValue = colorValue;
|
|
185
|
-
output.alpha = alpha
|
|
193
|
+
output.alpha = alpha * selectionDim(
|
|
194
|
+
${markActivityWGSL(ACTIVITY_READS, {
|
|
195
|
+
color: 'markConstants.colorMode, markConstants.colorScaleIndex, colorValue',
|
|
196
|
+
x: 'x0',
|
|
197
|
+
y: 'y0',
|
|
198
|
+
group: 'markConstants.groupIndex'
|
|
199
|
+
})}
|
|
200
|
+
);
|
|
186
201
|
return output;
|
|
187
202
|
}
|
|
188
203
|
|
|
@@ -295,14 +310,14 @@
|
|
|
295
310
|
// re-fires once data loads.
|
|
296
311
|
if (colorMode === 1 && !colorValueData) return;
|
|
297
312
|
|
|
298
|
-
const buffer = new ArrayBuffer(
|
|
313
|
+
const buffer = new ArrayBuffer(UNIFORM_BYTES.rectsMarkConstants);
|
|
299
314
|
const view = new DataView(buffer);
|
|
300
315
|
const LE = true;
|
|
301
316
|
|
|
302
317
|
view.setUint32(UNIFORM_OFFSETS.COLOR_MODE, colorMode, LE);
|
|
303
318
|
view.setUint32(UNIFORM_OFFSETS.COLOR_SCALE_INDEX, colorScaleIndex, LE);
|
|
319
|
+
view.setUint32(UNIFORM_OFFSETS.GROUP_INDEX, groupIndex, LE);
|
|
304
320
|
view.setFloat32(UNIFORM_OFFSETS.INSET, inset, LE);
|
|
305
|
-
// padding at 12
|
|
306
321
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 0, constantColor[0], LE);
|
|
307
322
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 4, constantColor[1], LE);
|
|
308
323
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 8, constantColor[2], LE);
|
|
@@ -10,6 +10,8 @@ interface Props {
|
|
|
10
10
|
zIndex?: number;
|
|
11
11
|
colorMode?: number;
|
|
12
12
|
colorScaleIndex?: number;
|
|
13
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
14
|
+
groupIndex?: number;
|
|
13
15
|
constantColor?: [number, number, number, number];
|
|
14
16
|
inset?: number;
|
|
15
17
|
dx?: number;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { UNIFORM_BYTES } from './uniform-sizes';
|
|
2
3
|
import { getContext, onMount, onDestroy } from 'svelte';
|
|
3
4
|
import { RendererHost } from './RendererHost.svelte';
|
|
4
5
|
import { getGPUContext } from '../../gpu';
|
|
5
6
|
import { DEFAULT_FILL_COLOR } from '../../scales/color-utils';
|
|
6
7
|
import type { ChartContext, WebGPUCanvasContext } from '../../types';
|
|
8
|
+
import { activityReads, markActivityWGSL } from './activity-reads';
|
|
7
9
|
|
|
8
10
|
// Named Bindings — stable indices regardless of hasExtent
|
|
9
11
|
const BINDINGS = {
|
|
@@ -23,7 +25,7 @@
|
|
|
23
25
|
COLOR_MODE: 0,
|
|
24
26
|
COLOR_SCALE_INDEX: 4,
|
|
25
27
|
STROKE_WIDTH: 8,
|
|
26
|
-
|
|
28
|
+
GROUP_INDEX: 12,
|
|
27
29
|
CONSTANT_COLOR: 16,
|
|
28
30
|
_PAD1: 32,
|
|
29
31
|
_PAD2: 36,
|
|
@@ -42,6 +44,8 @@
|
|
|
42
44
|
zIndex?: number;
|
|
43
45
|
colorMode?: number;
|
|
44
46
|
colorScaleIndex?: number;
|
|
47
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
48
|
+
groupIndex?: number;
|
|
45
49
|
constantColor?: [number, number, number, number];
|
|
46
50
|
strokeWidth?: number;
|
|
47
51
|
markId?: string;
|
|
@@ -58,6 +62,7 @@
|
|
|
58
62
|
zIndex = 0,
|
|
59
63
|
colorMode = 0,
|
|
60
64
|
colorScaleIndex = 0,
|
|
65
|
+
groupIndex = 0,
|
|
61
66
|
constantColor = DEFAULT_FILL_COLOR,
|
|
62
67
|
strokeWidth = 1,
|
|
63
68
|
markId = ''
|
|
@@ -113,12 +118,15 @@
|
|
|
113
118
|
const initializationError = $derived(host.error);
|
|
114
119
|
let lineGeometryBuffer: GPUBuffer;
|
|
115
120
|
|
|
121
|
+
/** The selection activities this shader reads; routing reads the same table. */
|
|
122
|
+
const ACTIVITY_READS = activityReads('rulex', hasExtent);
|
|
123
|
+
|
|
116
124
|
const ruleXShaderCode = `
|
|
117
125
|
struct MarkConstants {
|
|
118
126
|
colorMode: u32,
|
|
119
127
|
colorScaleIndex: u32,
|
|
120
128
|
strokeWidth: f32,
|
|
121
|
-
|
|
129
|
+
groupIndex: u32,
|
|
122
130
|
constantColor: vec4<f32>,
|
|
123
131
|
_pad1: f32,
|
|
124
132
|
_pad2: f32,
|
|
@@ -173,7 +181,14 @@
|
|
|
173
181
|
var output: VertexOutput;
|
|
174
182
|
output.position = vec4<f32>(normalizedPos.x, -normalizedPos.y, 0.0, 1.0);
|
|
175
183
|
output.colorValue = colorValue;
|
|
176
|
-
output.alpha = alpha
|
|
184
|
+
output.alpha = alpha * selectionDim(
|
|
185
|
+
${markActivityWGSL(ACTIVITY_READS, {
|
|
186
|
+
color: 'markConstants.colorMode, markConstants.colorScaleIndex, colorValue',
|
|
187
|
+
x: 'x',
|
|
188
|
+
y: 'y0',
|
|
189
|
+
group: 'markConstants.groupIndex'
|
|
190
|
+
})}
|
|
191
|
+
);
|
|
177
192
|
return output;
|
|
178
193
|
}
|
|
179
194
|
|
|
@@ -266,14 +281,14 @@
|
|
|
266
281
|
if (renderer?.resourcesCreated) {
|
|
267
282
|
if (colorMode === 1 && !colorValueData) return;
|
|
268
283
|
|
|
269
|
-
const buffer = new ArrayBuffer(
|
|
284
|
+
const buffer = new ArrayBuffer(UNIFORM_BYTES.ruleXMarkConstants);
|
|
270
285
|
const view = new DataView(buffer);
|
|
271
286
|
const LE = true;
|
|
272
287
|
|
|
273
288
|
view.setUint32(UNIFORM_OFFSETS.COLOR_MODE, colorMode, LE);
|
|
274
289
|
view.setUint32(UNIFORM_OFFSETS.COLOR_SCALE_INDEX, colorScaleIndex, LE);
|
|
290
|
+
view.setUint32(UNIFORM_OFFSETS.GROUP_INDEX, groupIndex, LE);
|
|
275
291
|
view.setFloat32(UNIFORM_OFFSETS.STROKE_WIDTH, strokeWidth, LE);
|
|
276
|
-
// padding at 12
|
|
277
292
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 0, constantColor[0], LE);
|
|
278
293
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 4, constantColor[1], LE);
|
|
279
294
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 8, constantColor[2], LE);
|
|
@@ -9,6 +9,8 @@ interface Props {
|
|
|
9
9
|
zIndex?: number;
|
|
10
10
|
colorMode?: number;
|
|
11
11
|
colorScaleIndex?: number;
|
|
12
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
13
|
+
groupIndex?: number;
|
|
12
14
|
constantColor?: [number, number, number, number];
|
|
13
15
|
strokeWidth?: number;
|
|
14
16
|
markId?: string;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
+
import { UNIFORM_BYTES } from './uniform-sizes';
|
|
2
3
|
import { getContext, onMount, onDestroy } from 'svelte';
|
|
3
4
|
import { RendererHost } from './RendererHost.svelte';
|
|
4
5
|
import { getGPUContext } from '../../gpu';
|
|
5
6
|
import { DEFAULT_FILL_COLOR } from '../../scales/color-utils';
|
|
6
7
|
import type { ChartContext, WebGPUCanvasContext } from '../../types';
|
|
8
|
+
import { activityReads, markActivityWGSL } from './activity-reads';
|
|
7
9
|
|
|
8
10
|
// Named Bindings — stable indices regardless of hasExtent
|
|
9
11
|
const BINDINGS = {
|
|
@@ -23,7 +25,7 @@
|
|
|
23
25
|
COLOR_MODE: 0,
|
|
24
26
|
COLOR_SCALE_INDEX: 4,
|
|
25
27
|
STROKE_WIDTH: 8,
|
|
26
|
-
|
|
28
|
+
GROUP_INDEX: 12,
|
|
27
29
|
CONSTANT_COLOR: 16,
|
|
28
30
|
_PAD1: 32,
|
|
29
31
|
_PAD2: 36,
|
|
@@ -42,6 +44,8 @@
|
|
|
42
44
|
zIndex?: number;
|
|
43
45
|
colorMode?: number;
|
|
44
46
|
colorScaleIndex?: number;
|
|
47
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
48
|
+
groupIndex?: number;
|
|
45
49
|
constantColor?: [number, number, number, number];
|
|
46
50
|
strokeWidth?: number;
|
|
47
51
|
markId?: string;
|
|
@@ -58,6 +62,7 @@
|
|
|
58
62
|
zIndex = 0,
|
|
59
63
|
colorMode = 0,
|
|
60
64
|
colorScaleIndex = 0,
|
|
65
|
+
groupIndex = 0,
|
|
61
66
|
constantColor = DEFAULT_FILL_COLOR,
|
|
62
67
|
strokeWidth = 1,
|
|
63
68
|
markId = ''
|
|
@@ -112,12 +117,15 @@
|
|
|
112
117
|
const initializationError = $derived(host.error);
|
|
113
118
|
let lineGeometryBuffer: GPUBuffer;
|
|
114
119
|
|
|
120
|
+
/** The selection activities this shader reads; routing reads the same table. */
|
|
121
|
+
const ACTIVITY_READS = activityReads('ruley', hasExtent);
|
|
122
|
+
|
|
115
123
|
const ruleYShaderCode = `
|
|
116
124
|
struct MarkConstants {
|
|
117
125
|
colorMode: u32,
|
|
118
126
|
colorScaleIndex: u32,
|
|
119
127
|
strokeWidth: f32,
|
|
120
|
-
|
|
128
|
+
groupIndex: u32,
|
|
121
129
|
constantColor: vec4<f32>,
|
|
122
130
|
_pad1: f32,
|
|
123
131
|
_pad2: f32,
|
|
@@ -172,7 +180,14 @@
|
|
|
172
180
|
var output: VertexOutput;
|
|
173
181
|
output.position = vec4<f32>(normalizedPos.x, -normalizedPos.y, 0.0, 1.0);
|
|
174
182
|
output.colorValue = colorValue;
|
|
175
|
-
output.alpha = alpha
|
|
183
|
+
output.alpha = alpha * selectionDim(
|
|
184
|
+
${markActivityWGSL(ACTIVITY_READS, {
|
|
185
|
+
color: 'markConstants.colorMode, markConstants.colorScaleIndex, colorValue',
|
|
186
|
+
x: 'x0',
|
|
187
|
+
y: 'y',
|
|
188
|
+
group: 'markConstants.groupIndex'
|
|
189
|
+
})}
|
|
190
|
+
);
|
|
176
191
|
return output;
|
|
177
192
|
}
|
|
178
193
|
|
|
@@ -265,14 +280,14 @@
|
|
|
265
280
|
if (renderer?.resourcesCreated) {
|
|
266
281
|
if (colorMode === 1 && !colorValueData) return;
|
|
267
282
|
|
|
268
|
-
const buffer = new ArrayBuffer(
|
|
283
|
+
const buffer = new ArrayBuffer(UNIFORM_BYTES.ruleYMarkConstants);
|
|
269
284
|
const view = new DataView(buffer);
|
|
270
285
|
const LE = true;
|
|
271
286
|
|
|
272
287
|
view.setUint32(UNIFORM_OFFSETS.COLOR_MODE, colorMode, LE);
|
|
273
288
|
view.setUint32(UNIFORM_OFFSETS.COLOR_SCALE_INDEX, colorScaleIndex, LE);
|
|
289
|
+
view.setUint32(UNIFORM_OFFSETS.GROUP_INDEX, groupIndex, LE);
|
|
274
290
|
view.setFloat32(UNIFORM_OFFSETS.STROKE_WIDTH, strokeWidth, LE);
|
|
275
|
-
// padding at 12
|
|
276
291
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 0, constantColor[0], LE);
|
|
277
292
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 4, constantColor[1], LE);
|
|
278
293
|
view.setFloat32(UNIFORM_OFFSETS.CONSTANT_COLOR + 8, constantColor[2], LE);
|
|
@@ -9,6 +9,8 @@ interface Props {
|
|
|
9
9
|
zIndex?: number;
|
|
10
10
|
colorMode?: number;
|
|
11
11
|
colorScaleIndex?: number;
|
|
12
|
+
/** The page-wide index of this mark's filter group: which run of a field's activity block it reads. */
|
|
13
|
+
groupIndex?: number;
|
|
12
14
|
constantColor?: [number, number, number, number];
|
|
13
15
|
strokeWidth?: number;
|
|
14
16
|
markId?: string;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which selection activities a mark reads: its ordinal colour, its band x,
|
|
3
|
+
* its band y. One answer per renderer, used twice:
|
|
4
|
+
*
|
|
5
|
+
* - The renderer builds its shader's `markActivity` call from it, so a read
|
|
6
|
+
* the table does not list is passed as 1.0 and cannot happen.
|
|
7
|
+
* - MarkLifecycleV2 turns it into the mark's `reads`, the identity keys of the
|
|
8
|
+
* fields it dims by, which decide whether a categorical selection on a field
|
|
9
|
+
* dims the mark or filters it.
|
|
10
|
+
*
|
|
11
|
+
* The two must agree exactly. A mark routed to dim on a field its shader does
|
|
12
|
+
* not read would be neither dimmed nor filtered; one whose shader reads a field
|
|
13
|
+
* routing missed would be filtered and dimmed at once. Deriving both from this
|
|
14
|
+
* table is what keeps them together. One case they still disagree on: a field
|
|
15
|
+
* whose activity block did not fit in the identity slot buffer (see the known
|
|
16
|
+
* limit in identity-slot-packing.ts).
|
|
17
|
+
*
|
|
18
|
+
* A function of the config, not a constant per renderer, because a rule's
|
|
19
|
+
* answer depends on a prop: a rule without an extent spans the whole cross
|
|
20
|
+
* axis, belongs to no category on it, and must not dim by it.
|
|
21
|
+
*/
|
|
22
|
+
import { NO_GROUP } from '../../gpu/identity-slot-packing';
|
|
23
|
+
/** The renderers that read selection activity. Text reads it on the CPU. */
|
|
24
|
+
export type ActivityRenderer = 'dots' | 'rects' | 'rulex' | 'ruley' | 'lines' | 'areas' | 'parallel' | 'text';
|
|
25
|
+
export interface ActivityReads {
|
|
26
|
+
readonly color: boolean;
|
|
27
|
+
readonly x: boolean;
|
|
28
|
+
readonly y: boolean;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* What a renderer reads. `hasExtent` is a rule's: RuleX with y1/y2, RuleY with
|
|
32
|
+
* x1/x2. Lines, areas and parallel coordinates dim by colour only: a line over
|
|
33
|
+
* a band axis spans its categories.
|
|
34
|
+
*/
|
|
35
|
+
export declare function activityReads(renderer: ActivityRenderer, hasExtent?: boolean): ActivityReads;
|
|
36
|
+
/**
|
|
37
|
+
* Whether a rule spans an extent on its cross axis: both ends given, as a
|
|
38
|
+
* field or a constant. A rule mark builds its renderer's extent data from this
|
|
39
|
+
* and hands it to routing as `ruleExtent`, so the two cannot disagree; a
|
|
40
|
+
* constant end (y1={0}, or the y shorthand) counts like a field.
|
|
41
|
+
*/
|
|
42
|
+
export declare function ruleHasExtent(lo: unknown, hi: unknown): boolean;
|
|
43
|
+
/** The renderer a mark type draws with, or null for one that reads no activity. */
|
|
44
|
+
export declare function rendererForMark(markType: string): ActivityRenderer | null;
|
|
45
|
+
/**
|
|
46
|
+
* A mark's reads: the identity keys of the fields whose activity it reads,
|
|
47
|
+
* sorted, from what its renderer reads and the identity key of each of its
|
|
48
|
+
* categorical scales (null for a channel with no such scale, or a scale with
|
|
49
|
+
* no identity: a field with no identity has no activity to dim by, so a
|
|
50
|
+
* selection on it filters the mark).
|
|
51
|
+
*/
|
|
52
|
+
export declare function readsFor(reads: ActivityReads, keys: {
|
|
53
|
+
color: string | null;
|
|
54
|
+
x: string | null;
|
|
55
|
+
y: string | null;
|
|
56
|
+
}): readonly string[];
|
|
57
|
+
/** A mark that reads no activity. Shared, so its reads never look changed. */
|
|
58
|
+
export declare const NO_READS: readonly string[];
|
|
59
|
+
/**
|
|
60
|
+
* How a mark responds to selections in its filter group (the `selectionResponse`
|
|
61
|
+
* prop). 'auto', the default: a categorical selection on a field the mark draws
|
|
62
|
+
* by (its band axes, its ordinal colour) dims it, and any other selection
|
|
63
|
+
* filters it. 'filter': every selection filters it, even on a field it draws
|
|
64
|
+
* by, so its aggregates are recomputed for the subset (top N within a region).
|
|
65
|
+
*/
|
|
66
|
+
export type SelectionResponse = 'auto' | 'filter';
|
|
67
|
+
export { NO_GROUP };
|
|
68
|
+
/** A mark's reads under its selection response: none for 'filter', which never dims. */
|
|
69
|
+
export declare function readsForResponse(response: SelectionResponse | undefined, reads: readonly string[]): readonly string[];
|
|
70
|
+
/** The group index a mark's shader reads activity with: NO_GROUP for 'filter'. */
|
|
71
|
+
export declare function groupIndexForResponse(response: SelectionResponse | undefined, groupIndex: number): number;
|
|
72
|
+
/**
|
|
73
|
+
* The WGSL activity of a renderer that reads colour only (lines, areas,
|
|
74
|
+
* parallel coordinates): `markColorActivity(...)`, or 1.0 if the table says
|
|
75
|
+
* it reads nothing. Throws for a renderer that reads a band axis, whose call
|
|
76
|
+
* is markActivityWGSL.
|
|
77
|
+
*/
|
|
78
|
+
export declare function colorActivityWGSL(reads: ActivityReads, args: {
|
|
79
|
+
color: string;
|
|
80
|
+
group: string;
|
|
81
|
+
}): string;
|
|
82
|
+
/**
|
|
83
|
+
* The WGSL `markActivity(...)` call for `reads`: each activity the renderer
|
|
84
|
+
* reads, and 1.0 for each it does not. `color` is markColorActivity's first
|
|
85
|
+
* three arguments; `x` and `y` are the band channel values; `group` the mark's
|
|
86
|
+
* group index.
|
|
87
|
+
*/
|
|
88
|
+
export declare function markActivityWGSL(reads: ActivityReads, args: {
|
|
89
|
+
color: string;
|
|
90
|
+
x: string;
|
|
91
|
+
y: string;
|
|
92
|
+
group: string;
|
|
93
|
+
}): string;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which selection activities a mark reads: its ordinal colour, its band x,
|
|
3
|
+
* its band y. One answer per renderer, used twice:
|
|
4
|
+
*
|
|
5
|
+
* - The renderer builds its shader's `markActivity` call from it, so a read
|
|
6
|
+
* the table does not list is passed as 1.0 and cannot happen.
|
|
7
|
+
* - MarkLifecycleV2 turns it into the mark's `reads`, the identity keys of the
|
|
8
|
+
* fields it dims by, which decide whether a categorical selection on a field
|
|
9
|
+
* dims the mark or filters it.
|
|
10
|
+
*
|
|
11
|
+
* The two must agree exactly. A mark routed to dim on a field its shader does
|
|
12
|
+
* not read would be neither dimmed nor filtered; one whose shader reads a field
|
|
13
|
+
* routing missed would be filtered and dimmed at once. Deriving both from this
|
|
14
|
+
* table is what keeps them together. One case they still disagree on: a field
|
|
15
|
+
* whose activity block did not fit in the identity slot buffer (see the known
|
|
16
|
+
* limit in identity-slot-packing.ts).
|
|
17
|
+
*
|
|
18
|
+
* A function of the config, not a constant per renderer, because a rule's
|
|
19
|
+
* answer depends on a prop: a rule without an extent spans the whole cross
|
|
20
|
+
* axis, belongs to no category on it, and must not dim by it.
|
|
21
|
+
*/
|
|
22
|
+
import { NO_GROUP } from '../../gpu/identity-slot-packing';
|
|
23
|
+
const ALL = { color: true, x: true, y: true };
|
|
24
|
+
const COLOR_ONLY = { color: true, x: false, y: false };
|
|
25
|
+
/**
|
|
26
|
+
* What a renderer reads. `hasExtent` is a rule's: RuleX with y1/y2, RuleY with
|
|
27
|
+
* x1/x2. Lines, areas and parallel coordinates dim by colour only: a line over
|
|
28
|
+
* a band axis spans its categories.
|
|
29
|
+
*/
|
|
30
|
+
export function activityReads(renderer, hasExtent = false) {
|
|
31
|
+
switch (renderer) {
|
|
32
|
+
case 'dots':
|
|
33
|
+
case 'rects':
|
|
34
|
+
case 'text':
|
|
35
|
+
return ALL;
|
|
36
|
+
case 'rulex':
|
|
37
|
+
return { color: true, x: true, y: hasExtent };
|
|
38
|
+
case 'ruley':
|
|
39
|
+
return { color: true, x: hasExtent, y: true };
|
|
40
|
+
case 'lines':
|
|
41
|
+
case 'areas':
|
|
42
|
+
case 'parallel':
|
|
43
|
+
return COLOR_ONLY;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Whether a rule spans an extent on its cross axis: both ends given, as a
|
|
48
|
+
* field or a constant. A rule mark builds its renderer's extent data from this
|
|
49
|
+
* and hands it to routing as `ruleExtent`, so the two cannot disagree; a
|
|
50
|
+
* constant end (y1={0}, or the y shorthand) counts like a field.
|
|
51
|
+
*/
|
|
52
|
+
export function ruleHasExtent(lo, hi) {
|
|
53
|
+
return lo !== undefined && hi !== undefined;
|
|
54
|
+
}
|
|
55
|
+
/** The renderer a mark type draws with, or null for one that reads no activity. */
|
|
56
|
+
export function rendererForMark(markType) {
|
|
57
|
+
switch (markType) {
|
|
58
|
+
case 'dot':
|
|
59
|
+
return 'dots';
|
|
60
|
+
case 'bary':
|
|
61
|
+
case 'barx':
|
|
62
|
+
case 'rect':
|
|
63
|
+
case 'rectx':
|
|
64
|
+
case 'recty':
|
|
65
|
+
return 'rects';
|
|
66
|
+
case 'rulex':
|
|
67
|
+
return 'rulex';
|
|
68
|
+
case 'ruley':
|
|
69
|
+
return 'ruley';
|
|
70
|
+
case 'line':
|
|
71
|
+
return 'lines';
|
|
72
|
+
case 'areax':
|
|
73
|
+
case 'areay':
|
|
74
|
+
return 'areas';
|
|
75
|
+
case 'parallel':
|
|
76
|
+
return 'parallel';
|
|
77
|
+
case 'text':
|
|
78
|
+
return 'text';
|
|
79
|
+
default:
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* A mark's reads: the identity keys of the fields whose activity it reads,
|
|
85
|
+
* sorted, from what its renderer reads and the identity key of each of its
|
|
86
|
+
* categorical scales (null for a channel with no such scale, or a scale with
|
|
87
|
+
* no identity: a field with no identity has no activity to dim by, so a
|
|
88
|
+
* selection on it filters the mark).
|
|
89
|
+
*/
|
|
90
|
+
export function readsFor(reads, keys) {
|
|
91
|
+
const out = [];
|
|
92
|
+
if (reads.color && keys.color)
|
|
93
|
+
out.push(keys.color);
|
|
94
|
+
if (reads.x && keys.x)
|
|
95
|
+
out.push(keys.x);
|
|
96
|
+
if (reads.y && keys.y)
|
|
97
|
+
out.push(keys.y);
|
|
98
|
+
if (out.length === 0)
|
|
99
|
+
return NO_READS;
|
|
100
|
+
return [...new Set(out)].sort();
|
|
101
|
+
}
|
|
102
|
+
/** A mark that reads no activity. Shared, so its reads never look changed. */
|
|
103
|
+
export const NO_READS = [];
|
|
104
|
+
export { NO_GROUP };
|
|
105
|
+
/** A mark's reads under its selection response: none for 'filter', which never dims. */
|
|
106
|
+
export function readsForResponse(response, reads) {
|
|
107
|
+
return response === 'filter' ? NO_READS : reads;
|
|
108
|
+
}
|
|
109
|
+
/** The group index a mark's shader reads activity with: NO_GROUP for 'filter'. */
|
|
110
|
+
export function groupIndexForResponse(response, groupIndex) {
|
|
111
|
+
return response === 'filter' ? NO_GROUP : groupIndex;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The WGSL activity of a renderer that reads colour only (lines, areas,
|
|
115
|
+
* parallel coordinates): `markColorActivity(...)`, or 1.0 if the table says
|
|
116
|
+
* it reads nothing. Throws for a renderer that reads a band axis, whose call
|
|
117
|
+
* is markActivityWGSL.
|
|
118
|
+
*/
|
|
119
|
+
export function colorActivityWGSL(reads, args) {
|
|
120
|
+
if (reads.x || reads.y)
|
|
121
|
+
throw new Error('colorActivityWGSL: this renderer reads a band axis');
|
|
122
|
+
return reads.color ? `markColorActivity(${args.color}, ${args.group})` : '1.0';
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The WGSL `markActivity(...)` call for `reads`: each activity the renderer
|
|
126
|
+
* reads, and 1.0 for each it does not. `color` is markColorActivity's first
|
|
127
|
+
* three arguments; `x` and `y` are the band channel values; `group` the mark's
|
|
128
|
+
* group index.
|
|
129
|
+
*/
|
|
130
|
+
export function markActivityWGSL(reads, args) {
|
|
131
|
+
const color = reads.color ? `markColorActivity(${args.color}, ${args.group})` : '1.0';
|
|
132
|
+
const x = reads.x ? `bandActivityX(${args.x}, ${args.group})` : '1.0';
|
|
133
|
+
const y = reads.y ? `bandActivityY(${args.y}, ${args.group})` : '1.0';
|
|
134
|
+
return `markActivity(${color}, ${x}, ${y})`;
|
|
135
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The byte size of every renderer's uniform struct, as WGSL lays it out.
|
|
3
|
+
*
|
|
4
|
+
* Renderers allocate their uniform buffers from these, and BaseGPURenderer
|
|
5
|
+
* sizes its stand-in from the largest: a binding not yet written is bound to
|
|
6
|
+
* the stand-in, and WebGPU rejects a draw whose uniform buffer is smaller than
|
|
7
|
+
* the struct it declares, which loses every chart's frame in that submit. A
|
|
8
|
+
* comment saying "must fit the largest struct" went stale the first time a
|
|
9
|
+
* struct grew, so uniform-sizes.test.ts derives each size from the shader
|
|
10
|
+
* source and fails when one drifts.
|
|
11
|
+
*/
|
|
12
|
+
/** Axes a parallel coordinates chart can hold: its axis arrays are sized for it. */
|
|
13
|
+
export declare const PARALLEL_MAX_AXES = 16;
|
|
14
|
+
export declare const UNIFORM_BYTES: {
|
|
15
|
+
readonly dotsMarkConstants: 48;
|
|
16
|
+
readonly rectsMarkConstants: 48;
|
|
17
|
+
readonly ruleXMarkConstants: 48;
|
|
18
|
+
readonly ruleYMarkConstants: 48;
|
|
19
|
+
readonly linesMarkConstants: 64;
|
|
20
|
+
readonly areasMarkConstants: 64;
|
|
21
|
+
readonly gridLineRuleConstants: 32;
|
|
22
|
+
readonly parallelConfig: 176;
|
|
23
|
+
readonly parallelAxisScales: number;
|
|
24
|
+
};
|
|
25
|
+
/** The stand-in uniform buffer: as large as the largest struct any renderer binds. */
|
|
26
|
+
export declare const UNIFORM_STAND_IN_BYTES: number;
|