@genome-spy/core 0.48.1 → 0.49.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/dist/bundle/index.es.js +7485 -7097
- package/dist/bundle/index.js +124 -111
- package/dist/schema.json +838 -344
- package/dist/src/data/collector.d.ts +10 -8
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +131 -33
- package/dist/src/data/collector.test.d.ts +2 -0
- package/dist/src/data/collector.test.d.ts.map +1 -0
- package/dist/src/data/collector.test.js +55 -1
- package/dist/src/data/dataFlow.test.d.ts +2 -0
- package/dist/src/data/dataFlow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.d.ts +2 -0
- package/dist/src/data/flow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.js +19 -14
- package/dist/src/data/flowNode.test.d.ts +2 -0
- package/dist/src/data/flowNode.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.d.ts +2 -0
- package/dist/src/data/flowOptimizer.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.js +9 -10
- package/dist/src/data/formats/fasta.test.d.ts +2 -0
- package/dist/src/data/formats/fasta.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.d.ts +2 -0
- package/dist/src/data/sources/inlineSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.js +23 -16
- package/dist/src/data/sources/sequenceSource.test.d.ts +2 -0
- package/dist/src/data/sources/sequenceSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.test.js +59 -42
- package/dist/src/data/transforms/clone.test.d.ts +2 -0
- package/dist/src/data/transforms/clone.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.d.ts +2 -0
- package/dist/src/data/transforms/coverage.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.js +1 -1
- package/dist/src/data/transforms/filter.d.ts +10 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -1
- package/dist/src/data/transforms/filter.js +30 -1
- package/dist/src/data/transforms/filter.test.d.ts +2 -0
- package/dist/src/data/transforms/filter.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.d.ts +2 -0
- package/dist/src/data/transforms/flatten.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.js +10 -7
- package/dist/src/data/transforms/flattenDelimited.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +16 -13
- package/dist/src/data/transforms/flattenSequence.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenSequence.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.test.js +1 -1
- package/dist/src/data/transforms/formula.test.d.ts +2 -0
- package/dist/src/data/transforms/formula.test.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.test.js +1 -1
- package/dist/src/data/transforms/identifier.d.ts +1 -1
- package/dist/src/data/transforms/identifier.d.ts.map +1 -1
- package/dist/src/data/transforms/identifier.js +2 -2
- package/dist/src/data/transforms/identifier.test.d.ts +2 -0
- package/dist/src/data/transforms/identifier.test.d.ts.map +1 -0
- package/dist/src/data/transforms/identifier.test.js +23 -14
- package/dist/src/data/transforms/pileup.test.d.ts +2 -0
- package/dist/src/data/transforms/pileup.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.d.ts +2 -0
- package/dist/src/data/transforms/project.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.js +1 -1
- package/dist/src/data/transforms/regexExtract.test.d.ts +2 -0
- package/dist/src/data/transforms/regexExtract.test.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.test.js +6 -3
- package/dist/src/data/transforms/regexFold.test.d.ts +2 -0
- package/dist/src/data/transforms/regexFold.test.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.test.d.ts +2 -0
- package/dist/src/data/transforms/sample.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.d.ts +2 -0
- package/dist/src/data/transforms/stack.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.js +8 -8
- package/dist/src/encoder/accessor.d.ts +17 -14
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +127 -56
- package/dist/src/encoder/accessor.test.d.ts +2 -0
- package/dist/src/encoder/accessor.test.d.ts.map +1 -0
- package/dist/src/encoder/accessor.test.js +145 -31
- package/dist/src/encoder/encoder.d.ts +26 -13
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +98 -114
- package/dist/src/encoder/encoder.test.d.ts +2 -0
- package/dist/src/encoder/encoder.test.d.ts.map +1 -0
- package/dist/src/encoder/encoder.test.js +85 -82
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
- package/dist/src/fonts/bmFontManager.js +10 -4
- package/dist/src/genome/genome.test.d.ts +2 -0
- package/dist/src/genome/genome.test.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.test.d.ts +2 -0
- package/dist/src/genome/scaleIndex.test.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.test.d.ts +2 -0
- package/dist/src/genome/scaleLocus.test.d.ts.map +1 -0
- package/dist/src/genomeSpy.d.ts +3 -2
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +29 -21
- package/dist/src/gl/dataToVertices.d.ts +5 -7
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +42 -30
- package/dist/src/gl/glslScaleGenerator.d.ts +84 -15
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +260 -73
- package/dist/src/gl/includes/picking.vertex.glsl.js +1 -1
- package/dist/src/marks/link.common.glsl.js +1 -1
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.js +10 -0
- package/dist/src/marks/link.vertex.glsl.js +1 -1
- package/dist/src/marks/mark.d.ts +6 -9
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +212 -95
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +5 -1
- package/dist/src/marks/rect.d.ts.map +1 -1
- package/dist/src/marks/rect.js +9 -4
- package/dist/src/marks/rule.d.ts.map +1 -1
- package/dist/src/marks/rule.js +4 -0
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +5 -1
- package/dist/src/scale/scale.test.d.ts +2 -0
- package/dist/src/scale/scale.test.d.ts.map +1 -0
- package/dist/src/scale/scale.test.js +2 -0
- package/dist/src/scale/ticks.test.d.ts +2 -0
- package/dist/src/scale/ticks.test.d.ts.map +1 -0
- package/dist/src/scale/ticks.test.js +6 -0
- package/dist/src/selection/selection.d.ts +39 -0
- package/dist/src/selection/selection.d.ts.map +1 -0
- package/dist/src/selection/selection.js +78 -0
- package/dist/src/spec/channel.d.ts +137 -83
- package/dist/src/spec/mark.d.ts +9 -0
- package/dist/src/spec/parameter.d.ts +112 -3
- package/dist/src/spec/root.d.ts +0 -1
- package/dist/src/spec/transform.d.ts +19 -1
- package/dist/src/spec/view.d.ts +3 -3
- package/dist/src/tooltip/dataTooltipHandler.js +1 -1
- package/dist/src/types/encoder.d.ts +80 -26
- package/dist/src/types/rendering.d.ts +1 -0
- package/dist/src/types/selectionTypes.d.ts +44 -0
- package/dist/src/types/viewContext.d.ts +1 -4
- package/dist/src/utils/addBaseUrl.test.d.ts +2 -0
- package/dist/src/utils/addBaseUrl.test.d.ts.map +1 -0
- package/dist/src/utils/animator.d.ts.map +1 -1
- package/dist/src/utils/animator.js +3 -1
- package/dist/src/utils/binnedIndex.test.d.ts +2 -0
- package/dist/src/utils/binnedIndex.test.d.ts.map +1 -0
- package/dist/src/utils/cloner.test.d.ts +2 -0
- package/dist/src/utils/cloner.test.d.ts.map +1 -0
- package/dist/src/utils/coalesce.test.d.ts +2 -0
- package/dist/src/utils/coalesce.test.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.test.d.ts +2 -0
- package/dist/src/utils/concatIterables.test.d.ts.map +1 -0
- package/dist/src/utils/domainArray.test.d.ts +2 -0
- package/dist/src/utils/domainArray.test.d.ts.map +1 -0
- package/dist/src/utils/expression.d.ts +2 -2
- package/dist/src/utils/expression.d.ts.map +1 -1
- package/dist/src/utils/expression.js +11 -2
- package/dist/src/utils/indexer.test.d.ts +2 -0
- package/dist/src/utils/indexer.test.d.ts.map +1 -0
- package/dist/src/utils/inertia.d.ts.map +1 -1
- package/dist/src/utils/inertia.js +4 -0
- package/dist/src/utils/inputBinding.d.ts.map +1 -1
- package/dist/src/utils/inputBinding.js +4 -0
- package/dist/src/utils/iterateNestedMaps.d.ts +4 -3
- package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -1
- package/dist/src/utils/iterateNestedMaps.js +3 -2
- package/dist/src/utils/iterateNestedMaps.test.d.ts +2 -0
- package/dist/src/utils/iterateNestedMaps.test.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.test.d.ts +2 -0
- package/dist/src/utils/kWayMerge.test.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.test.d.ts +2 -0
- package/dist/src/utils/mergeObjects.test.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.test.d.ts +2 -0
- package/dist/src/utils/numberExtractor.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.test.d.ts +2 -0
- package/dist/src/utils/propertyCacher.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts +2 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.js +3 -0
- package/dist/src/utils/radixSort.d.ts +9 -0
- package/dist/src/utils/radixSort.d.ts.map +1 -0
- package/dist/src/utils/radixSort.js +130 -0
- package/dist/src/utils/radixSort.test.d.ts +2 -0
- package/dist/src/utils/radixSort.test.d.ts.map +1 -0
- package/dist/src/utils/radixSort.test.js +51 -0
- package/dist/src/utils/reservationMap.test.d.ts +2 -0
- package/dist/src/utils/reservationMap.test.d.ts.map +1 -0
- package/dist/src/utils/ringBuffer.test.d.ts +2 -0
- package/dist/src/utils/ringBuffer.test.d.ts.map +1 -0
- package/dist/src/utils/topK.test.d.ts +2 -0
- package/dist/src/utils/topK.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.d.ts +2 -0
- package/dist/src/utils/trees.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.js +8 -3
- package/dist/src/utils/variableTools.test.d.ts +2 -0
- package/dist/src/utils/variableTools.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.d.ts +19 -6
- package/dist/src/view/axisResolution.d.ts.map +1 -1
- package/dist/src/view/axisResolution.js +16 -7
- package/dist/src/view/axisResolution.test.d.ts +2 -0
- package/dist/src/view/axisResolution.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.test.js +16 -11
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.d.ts +1 -1
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +34 -5
- package/dist/src/view/flowBuilder.test.d.ts +2 -0
- package/dist/src/view/flowBuilder.test.d.ts.map +1 -0
- package/dist/src/view/gridView.d.ts +0 -6
- package/dist/src/view/gridView.d.ts.map +1 -1
- package/dist/src/view/layerView.d.ts +0 -6
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.test.d.ts +2 -0
- package/dist/src/view/layout/flexLayout.test.d.ts.map +1 -0
- package/dist/src/view/layout/grid.test.d.ts +2 -0
- package/dist/src/view/layout/grid.test.d.ts.map +1 -0
- package/dist/src/view/layout/rectangle.test.d.ts +2 -0
- package/dist/src/view/layout/rectangle.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.d.ts +32 -5
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +97 -9
- package/dist/src/view/paramMediator.test.d.ts +2 -0
- package/dist/src/view/paramMediator.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.test.js +17 -1
- package/dist/src/view/scaleResolution.d.ts +17 -9
- package/dist/src/view/scaleResolution.d.ts.map +1 -1
- package/dist/src/view/scaleResolution.js +51 -34
- package/dist/src/view/scaleResolution.test.d.ts +2 -0
- package/dist/src/view/scaleResolution.test.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.test.js +2 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +15 -3
- package/dist/src/view/unitView.d.ts +5 -15
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +81 -101
- package/dist/src/view/view.d.ts +1 -1
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.test.d.ts +2 -0
- package/dist/src/view/view.test.d.ts.map +1 -0
- package/dist/src/view/view.test.js +73 -55
- package/dist/src/view/viewFactory.test.d.ts +2 -0
- package/dist/src/view/viewFactory.test.d.ts.map +1 -0
- package/dist/src/view/viewFactory.test.js +2 -2
- package/dist/src/view/zoom.js +2 -2
- package/package.json +5 -2
|
@@ -10,23 +10,23 @@ import { color as d3color } from "d3-color";
|
|
|
10
10
|
import {
|
|
11
11
|
getDiscreteRangeMapper,
|
|
12
12
|
isColorChannel,
|
|
13
|
-
isDatumDef,
|
|
14
13
|
isDiscreteChannel,
|
|
15
14
|
getPrimaryChannel,
|
|
16
|
-
isValueDef,
|
|
17
15
|
isFieldDef,
|
|
18
16
|
} from "../encoder/encoder.js";
|
|
19
17
|
import { asArray, peek } from "../utils/arrayUtils.js";
|
|
20
18
|
import { InternMap } from "internmap";
|
|
21
|
-
import { isExprRef } from "../view/paramMediator.js";
|
|
19
|
+
import { isExprRef, validateParameterName } from "../view/paramMediator.js";
|
|
22
20
|
import scaleNull from "../utils/scaleNull.js";
|
|
23
21
|
|
|
24
22
|
export const ATTRIBUTE_PREFIX = "attr_";
|
|
25
23
|
export const DOMAIN_PREFIX = "uDomain_";
|
|
26
24
|
export const RANGE_PREFIX = "range_";
|
|
25
|
+
export const ACCESSOR_FUNCTION_PREFIX = "accessor_";
|
|
27
26
|
export const SCALE_FUNCTION_PREFIX = "scale_";
|
|
28
27
|
export const SCALED_FUNCTION_PREFIX = "getScaled_";
|
|
29
28
|
export const RANGE_TEXTURE_PREFIX = "uRangeTexture_";
|
|
29
|
+
export const PARAM_PREFIX = "uParam_";
|
|
30
30
|
|
|
31
31
|
// https://stackoverflow.com/a/47543127
|
|
32
32
|
const FLT_MAX = 3.402823466e38;
|
|
@@ -51,13 +51,37 @@ function splitScaleType(type) {
|
|
|
51
51
|
};
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
* @param {Channel} channel
|
|
57
|
+
* @param {number} conditionNumber
|
|
58
|
+
* @returns {string}
|
|
59
|
+
*/
|
|
60
|
+
export function makeAccessorFunctionName(channel, conditionNumber) {
|
|
61
|
+
return `${ACCESSOR_FUNCTION_PREFIX}${channel}_${conditionNumber}`;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* @typedef {object} AccessorParts
|
|
66
|
+
* @prop {Channel} channel
|
|
67
|
+
* @prop {string} accessorGlsl
|
|
68
|
+
* @prop {string} accessorFunctionName
|
|
69
|
+
* @prop {string} [attributeName]
|
|
70
|
+
* @prop {string} [attributeGlsl]
|
|
71
|
+
* @prop {string} [uniformName]
|
|
72
|
+
* @prop {string} [uniformGlsl]
|
|
73
|
+
* @prop {(x: any) => any} [adjuster]
|
|
74
|
+
*/
|
|
75
|
+
|
|
54
76
|
/**
|
|
55
77
|
* Generates GLSL code for a constant value.
|
|
56
78
|
*
|
|
57
79
|
* @param {Channel} channel
|
|
80
|
+
* @param {number} conditionNumber
|
|
58
81
|
* @param {number | number[] | string | boolean} value
|
|
82
|
+
* @returns {AccessorParts}
|
|
59
83
|
*/
|
|
60
|
-
export function generateConstantValueGlsl(channel, value) {
|
|
84
|
+
export function generateConstantValueGlsl(channel, conditionNumber, value) {
|
|
61
85
|
/** @type {VectorizedValue} */
|
|
62
86
|
let vec;
|
|
63
87
|
if (isDiscreteChannel(channel)) {
|
|
@@ -84,13 +108,21 @@ export function generateConstantValueGlsl(channel, value) {
|
|
|
84
108
|
vec = vectorize(value);
|
|
85
109
|
}
|
|
86
110
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
111
|
+
const accessorFunctionName = makeAccessorFunctionName(
|
|
112
|
+
channel,
|
|
113
|
+
conditionNumber
|
|
114
|
+
);
|
|
115
|
+
const accessorGlsl = `
|
|
116
|
+
${vec.type} ${accessorFunctionName}() {
|
|
90
117
|
// Constant value
|
|
91
118
|
return ${vec};
|
|
92
119
|
}`;
|
|
93
|
-
|
|
120
|
+
|
|
121
|
+
return {
|
|
122
|
+
channel,
|
|
123
|
+
accessorGlsl,
|
|
124
|
+
accessorFunctionName,
|
|
125
|
+
};
|
|
94
126
|
}
|
|
95
127
|
|
|
96
128
|
/**
|
|
@@ -98,8 +130,10 @@ ${vec.type} ${SCALED_FUNCTION_PREFIX}${channel}() {
|
|
|
98
130
|
* used as dynamic mark properties that map to encoding channels.
|
|
99
131
|
*
|
|
100
132
|
* @param {Channel} channel
|
|
133
|
+
* @param {number} conditionNumber
|
|
134
|
+
* @returns {AccessorParts}
|
|
101
135
|
*/
|
|
102
|
-
export function generateDynamicValueGlslAndUniform(channel) {
|
|
136
|
+
export function generateDynamicValueGlslAndUniform(channel, conditionNumber) {
|
|
103
137
|
let dataType = "float";
|
|
104
138
|
/** @type {(x: any) => any} */
|
|
105
139
|
let adjuster = (x) => x;
|
|
@@ -109,13 +143,16 @@ export function generateDynamicValueGlslAndUniform(channel) {
|
|
|
109
143
|
adjuster = (x) => cssColorToArray(x);
|
|
110
144
|
}
|
|
111
145
|
|
|
112
|
-
const uniformName = `u${capitalize(channel)}`;
|
|
146
|
+
const uniformName = `u${capitalize(channel)}_${conditionNumber}`;
|
|
113
147
|
|
|
114
148
|
const uniformGlsl = ` // Dynamic value\n uniform ${dataType} ${uniformName};`;
|
|
115
149
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
150
|
+
const accessorFunctionName = makeAccessorFunctionName(
|
|
151
|
+
channel,
|
|
152
|
+
conditionNumber
|
|
153
|
+
);
|
|
154
|
+
let accessorGlsl = `
|
|
155
|
+
${dataType} ${accessorFunctionName}() {
|
|
119
156
|
// Dynamic value
|
|
120
157
|
return ${uniformName};
|
|
121
158
|
}`;
|
|
@@ -124,56 +161,95 @@ ${dataType} ${SCALED_FUNCTION_PREFIX}${channel}() {
|
|
|
124
161
|
channel,
|
|
125
162
|
uniformName,
|
|
126
163
|
uniformGlsl,
|
|
127
|
-
|
|
164
|
+
accessorGlsl,
|
|
165
|
+
accessorFunctionName,
|
|
128
166
|
adjuster,
|
|
129
167
|
};
|
|
130
168
|
}
|
|
131
169
|
|
|
132
170
|
/**
|
|
133
|
-
*
|
|
134
171
|
* @param {Channel} channel
|
|
135
|
-
* @param {
|
|
136
|
-
* @param {
|
|
172
|
+
* @param {any} scale
|
|
173
|
+
* @param {number} conditionNumber
|
|
137
174
|
* @param {Channel[]} [sharedQuantitativeChannels] Channels that share the same quantitative field
|
|
175
|
+
* @returns {AccessorParts}
|
|
138
176
|
*/
|
|
139
|
-
|
|
140
|
-
export function generateScaleGlsl(
|
|
177
|
+
export function generateDataGlsl(
|
|
141
178
|
channel,
|
|
142
|
-
|
|
143
|
-
|
|
179
|
+
scale,
|
|
180
|
+
conditionNumber,
|
|
144
181
|
sharedQuantitativeChannels = [channel]
|
|
145
182
|
) {
|
|
146
|
-
|
|
147
|
-
throw new Error(
|
|
148
|
-
`Cannot create scale for "value": ${JSON.stringify(channelDef)}`
|
|
149
|
-
);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Typecast to any to make it easier to handle all the different scale variants
|
|
154
|
-
* @type {any}
|
|
155
|
-
*/
|
|
156
|
-
const scale = scaleResolution ? scaleResolution.scale : scaleNull();
|
|
157
|
-
|
|
158
|
-
const primary = getPrimaryChannel(channel);
|
|
183
|
+
const { attributeType } = getAttributeAndArrayTypes(scale, channel);
|
|
159
184
|
const attributeName =
|
|
160
185
|
ATTRIBUTE_PREFIX + makeAttributeName(sharedQuantitativeChannels);
|
|
161
|
-
const domainUniformName = DOMAIN_PREFIX + primary;
|
|
162
|
-
const rangeName = RANGE_PREFIX + primary;
|
|
163
186
|
|
|
164
|
-
|
|
165
|
-
const discrete = isDiscrete(scale.type);
|
|
187
|
+
const attributeGlsl = `in highp ${attributeType} ${attributeName};`;
|
|
166
188
|
|
|
167
|
-
const
|
|
168
|
-
|
|
189
|
+
const accessorFunctionName = makeAccessorFunctionName(
|
|
190
|
+
channel,
|
|
191
|
+
conditionNumber
|
|
192
|
+
);
|
|
169
193
|
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
194
|
+
const accessorGlsl = `
|
|
195
|
+
${attributeType} ${accessorFunctionName}() {
|
|
196
|
+
return ${attributeName};
|
|
197
|
+
}`;
|
|
198
|
+
|
|
199
|
+
return {
|
|
200
|
+
channel,
|
|
201
|
+
attributeName,
|
|
202
|
+
attributeGlsl,
|
|
203
|
+
accessorGlsl,
|
|
204
|
+
accessorFunctionName,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* @param {Channel} channel
|
|
209
|
+
* @param {any} scale
|
|
210
|
+
* @param {number} conditionNumber
|
|
211
|
+
* @returns {AccessorParts}
|
|
212
|
+
*/
|
|
213
|
+
export function generateDatumGlslAndUniform(channel, scale, conditionNumber) {
|
|
214
|
+
const { attributeType } = getAttributeAndArrayTypes(scale, channel);
|
|
215
|
+
|
|
216
|
+
// TODO: Use uniform prefix
|
|
217
|
+
const uniformName = ATTRIBUTE_PREFIX + makeAttributeName(channel);
|
|
218
|
+
const uniformGlsl = ` uniform highp ${attributeType} ${uniformName};`;
|
|
219
|
+
|
|
220
|
+
const accessorFunctionName = makeAccessorFunctionName(
|
|
221
|
+
channel,
|
|
222
|
+
conditionNumber
|
|
223
|
+
);
|
|
224
|
+
const accessorGlsl = `
|
|
225
|
+
${attributeType} ${accessorFunctionName}() {
|
|
226
|
+
return ${uniformName};
|
|
227
|
+
}`;
|
|
228
|
+
|
|
229
|
+
return {
|
|
230
|
+
channel,
|
|
231
|
+
uniformName,
|
|
232
|
+
uniformGlsl,
|
|
233
|
+
accessorGlsl,
|
|
234
|
+
accessorFunctionName,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
*
|
|
240
|
+
* @param {Channel} channel
|
|
241
|
+
* @param {any} scale
|
|
242
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
243
|
+
*/
|
|
244
|
+
// eslint-disable-next-line complexity
|
|
245
|
+
export function generateScaleGlsl(channel, scale, channelDef) {
|
|
246
|
+
scale ??= scaleNull();
|
|
247
|
+
|
|
248
|
+
const primary = getPrimaryChannel(channel);
|
|
249
|
+
const domainUniformName = DOMAIN_PREFIX + primary;
|
|
250
|
+
const rangeUniformName = RANGE_PREFIX + primary;
|
|
251
|
+
|
|
252
|
+
const { hp, attributeType } = getAttributeAndArrayTypes(scale, channel);
|
|
177
253
|
|
|
178
254
|
const domainLength = scale.domain ? scale.domain().length : undefined;
|
|
179
255
|
|
|
@@ -189,8 +265,6 @@ export function generateScaleGlsl(
|
|
|
189
265
|
glsl.push(`// Channel: ${channel}`);
|
|
190
266
|
glsl.push("");
|
|
191
267
|
|
|
192
|
-
glsl.push(`#define ${channel}_DEFINED`);
|
|
193
|
-
|
|
194
268
|
const { transform } = splitScaleType(scale.type);
|
|
195
269
|
|
|
196
270
|
/**
|
|
@@ -204,14 +278,18 @@ export function generateScaleGlsl(
|
|
|
204
278
|
let functionCall;
|
|
205
279
|
switch (transform) {
|
|
206
280
|
case "linear":
|
|
207
|
-
functionCall = makeScaleCall(
|
|
281
|
+
functionCall = makeScaleCall(
|
|
282
|
+
"scaleLinear",
|
|
283
|
+
"domain",
|
|
284
|
+
rangeUniformName
|
|
285
|
+
);
|
|
208
286
|
break;
|
|
209
287
|
|
|
210
288
|
case "log":
|
|
211
289
|
functionCall = makeScaleCall(
|
|
212
290
|
"scaleLog",
|
|
213
291
|
"domain",
|
|
214
|
-
|
|
292
|
+
rangeUniformName,
|
|
215
293
|
scale.base()
|
|
216
294
|
);
|
|
217
295
|
break;
|
|
@@ -220,7 +298,7 @@ export function generateScaleGlsl(
|
|
|
220
298
|
functionCall = makeScaleCall(
|
|
221
299
|
"scaleSymlog",
|
|
222
300
|
"domain",
|
|
223
|
-
|
|
301
|
+
rangeUniformName,
|
|
224
302
|
scale.constant()
|
|
225
303
|
);
|
|
226
304
|
break;
|
|
@@ -230,7 +308,7 @@ export function generateScaleGlsl(
|
|
|
230
308
|
functionCall = makeScaleCall(
|
|
231
309
|
"scalePow",
|
|
232
310
|
"domain",
|
|
233
|
-
|
|
311
|
+
rangeUniformName,
|
|
234
312
|
scale.exponent()
|
|
235
313
|
);
|
|
236
314
|
break;
|
|
@@ -240,7 +318,7 @@ export function generateScaleGlsl(
|
|
|
240
318
|
functionCall = makeScaleCall(
|
|
241
319
|
"scaleBandHp",
|
|
242
320
|
"domain",
|
|
243
|
-
|
|
321
|
+
rangeUniformName,
|
|
244
322
|
scale.paddingInner(),
|
|
245
323
|
scale.paddingOuter(),
|
|
246
324
|
scale.align(),
|
|
@@ -253,7 +331,7 @@ export function generateScaleGlsl(
|
|
|
253
331
|
functionCall = makeScaleCall(
|
|
254
332
|
"scaleBand",
|
|
255
333
|
"domain",
|
|
256
|
-
|
|
334
|
+
rangeUniformName,
|
|
257
335
|
scale.paddingInner(),
|
|
258
336
|
scale.paddingOuter(),
|
|
259
337
|
scale.align(),
|
|
@@ -303,17 +381,17 @@ export function generateScaleGlsl(
|
|
|
303
381
|
}
|
|
304
382
|
rangeUniform = ` uniform ${getFloatVectorType(
|
|
305
383
|
range.length
|
|
306
|
-
)} ${
|
|
384
|
+
)} ${rangeUniformName};`;
|
|
307
385
|
} else if (range.length && range.every(isNumber)) {
|
|
308
386
|
const vectorizedRange = vectorizeRange(range);
|
|
309
387
|
|
|
310
388
|
glsl.push(
|
|
311
|
-
`const ${vectorizedRange.type} ${
|
|
389
|
+
`const ${vectorizedRange.type} ${rangeUniformName} = ${vectorizedRange};`
|
|
312
390
|
);
|
|
313
391
|
}
|
|
314
392
|
}
|
|
315
393
|
|
|
316
|
-
const returnType =
|
|
394
|
+
const returnType = getScaledDataTypeForChannel(channel);
|
|
317
395
|
|
|
318
396
|
/**
|
|
319
397
|
* An optional interpolator function that maps the transformed value to the range.
|
|
@@ -340,10 +418,6 @@ export function generateScaleGlsl(
|
|
|
340
418
|
interpolate = `getDiscreteColor(${textureUniformName}, int(transformed)).r`;
|
|
341
419
|
}
|
|
342
420
|
|
|
343
|
-
const [attributeGlsl, markUniformGlsl] = isDatumDef(channelDef)
|
|
344
|
-
? [undefined, ` uniform highp ${attributeType} ${attributeName};`]
|
|
345
|
-
: [`in highp ${attributeType} ${attributeName};`, undefined];
|
|
346
|
-
|
|
347
421
|
/** @type {string[]} Channel's scale function*/
|
|
348
422
|
const scaleBody = [];
|
|
349
423
|
|
|
@@ -409,12 +483,6 @@ ${returnType} ${SCALE_FUNCTION_PREFIX}${channel}(${attributeType} value) {
|
|
|
409
483
|
${scaleBody.map((x) => ` ${x}\n`).join("")}
|
|
410
484
|
}`);
|
|
411
485
|
|
|
412
|
-
// A convenience getter for the scaled value
|
|
413
|
-
glsl.push(`
|
|
414
|
-
${returnType} ${SCALED_FUNCTION_PREFIX}${channel}() {
|
|
415
|
-
return ${SCALE_FUNCTION_PREFIX}${channel}(${attributeName});
|
|
416
|
-
}`);
|
|
417
|
-
|
|
418
486
|
const concatenated = glsl.join("\n");
|
|
419
487
|
|
|
420
488
|
if (usesDomain && channel == primary) {
|
|
@@ -429,18 +497,58 @@ ${returnType} ${SCALED_FUNCTION_PREFIX}${channel}() {
|
|
|
429
497
|
}
|
|
430
498
|
|
|
431
499
|
return {
|
|
432
|
-
attributeName,
|
|
433
|
-
attributeGlsl,
|
|
434
|
-
// Ends up in the Mark uniform block
|
|
435
|
-
markUniformGlsl,
|
|
436
500
|
glsl: concatenated,
|
|
437
501
|
domainUniformName,
|
|
438
502
|
domainUniform,
|
|
439
|
-
|
|
503
|
+
rangeUniformName,
|
|
440
504
|
rangeUniform,
|
|
441
505
|
};
|
|
442
506
|
}
|
|
443
507
|
|
|
508
|
+
/**
|
|
509
|
+
*
|
|
510
|
+
* @param {Channel} channel
|
|
511
|
+
* @param {import("../types/encoder.js").Accessor[]} accessors
|
|
512
|
+
*/
|
|
513
|
+
export function generateConditionalEncoderGlsl(channel, accessors) {
|
|
514
|
+
const type = getScaledDataTypeForChannel(channel);
|
|
515
|
+
|
|
516
|
+
/** @type {string[]} */
|
|
517
|
+
const conditions = [];
|
|
518
|
+
/** @type {string[]} */
|
|
519
|
+
const statements = [];
|
|
520
|
+
|
|
521
|
+
for (let i = 0; i < accessors.length; i++) {
|
|
522
|
+
const accessor = accessors[i];
|
|
523
|
+
const accessorFunctionName = makeAccessorFunctionName(channel, i);
|
|
524
|
+
const { param, empty } = accessor.predicate;
|
|
525
|
+
|
|
526
|
+
const paramUniform = PARAM_PREFIX + validateParameterName(param);
|
|
527
|
+
const idAttribute = ATTRIBUTE_PREFIX + "uniqueId";
|
|
528
|
+
|
|
529
|
+
// Hardcoded condition for single point selection ... for now.
|
|
530
|
+
conditions.push(
|
|
531
|
+
param
|
|
532
|
+
? `${idAttribute} == ${paramUniform}${
|
|
533
|
+
empty ? ` || ${paramUniform} == uint(0)` : ""
|
|
534
|
+
}`
|
|
535
|
+
: null
|
|
536
|
+
);
|
|
537
|
+
|
|
538
|
+
statements.push(
|
|
539
|
+
accessor.scaleChannel
|
|
540
|
+
? `return ${SCALE_FUNCTION_PREFIX}${channel}(${accessorFunctionName}());`
|
|
541
|
+
: `return ${accessorFunctionName}();`
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
return `${type} ${SCALED_FUNCTION_PREFIX}${channel}() {
|
|
546
|
+
${ifElseGlsl(conditions, statements)}
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
#define ${channel}_DEFINED`;
|
|
550
|
+
}
|
|
551
|
+
|
|
444
552
|
/**
|
|
445
553
|
* Adds a trailing decimal zero so that GLSL is happy.
|
|
446
554
|
*
|
|
@@ -506,6 +614,17 @@ function getFloatVectorType(numComponents) {
|
|
|
506
614
|
}
|
|
507
615
|
}
|
|
508
616
|
|
|
617
|
+
/**
|
|
618
|
+
* @param {Channel} channel
|
|
619
|
+
*/
|
|
620
|
+
export function getScaledDataTypeForChannel(channel) {
|
|
621
|
+
return isColorChannel(channel)
|
|
622
|
+
? "vec3"
|
|
623
|
+
: channel == "uniqueId"
|
|
624
|
+
? "uint"
|
|
625
|
+
: "float";
|
|
626
|
+
}
|
|
627
|
+
|
|
509
628
|
/**
|
|
510
629
|
* @param {string} color
|
|
511
630
|
*/
|
|
@@ -551,6 +670,37 @@ function makeFunctionCall(name, ...args) {
|
|
|
551
670
|
return `${name}(${fixedArgs.join(", ")})`;
|
|
552
671
|
}
|
|
553
672
|
|
|
673
|
+
/**
|
|
674
|
+
*
|
|
675
|
+
* @param {import("../types/encoder.js").VegaScale} scale
|
|
676
|
+
* @param {import("../spec/channel.js").Channel} channel
|
|
677
|
+
*/
|
|
678
|
+
export function getAttributeAndArrayTypes(scale, channel) {
|
|
679
|
+
const discrete = scale && isDiscrete(scale.type);
|
|
680
|
+
const hp = scale && isHighPrecisionScale(scale.type);
|
|
681
|
+
const largeHp = hp && isLargeGenome(scale.domain());
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* @type {{attributeType: string, arrayConstructor: Uint32ArrayConstructor | Uint16ArrayConstructor | Float32ArrayConstructor}}
|
|
685
|
+
*/
|
|
686
|
+
const props = largeHp
|
|
687
|
+
? { attributeType: "uvec2", arrayConstructor: Uint32Array }
|
|
688
|
+
: hp
|
|
689
|
+
? { attributeType: "uint", arrayConstructor: Uint32Array }
|
|
690
|
+
: discrete
|
|
691
|
+
? { attributeType: "uint", arrayConstructor: Uint16Array }
|
|
692
|
+
: channel == "uniqueId"
|
|
693
|
+
? { attributeType: "uint", arrayConstructor: Uint32Array }
|
|
694
|
+
: { attributeType: "float", arrayConstructor: Float32Array };
|
|
695
|
+
|
|
696
|
+
return Object.assign(props, {
|
|
697
|
+
numComponents: +(props.attributeType.match(/^vec([234])$/)?.[1] ?? 1),
|
|
698
|
+
discrete,
|
|
699
|
+
hp,
|
|
700
|
+
largeHp,
|
|
701
|
+
});
|
|
702
|
+
}
|
|
703
|
+
|
|
554
704
|
/**
|
|
555
705
|
* True if scale needs more than 24 bits (float32) of precision.
|
|
556
706
|
*
|
|
@@ -686,3 +836,40 @@ export const getRangeForGlsl = (scale, channel) =>
|
|
|
686
836
|
: scale.range
|
|
687
837
|
? scale.range()
|
|
688
838
|
: undefined;
|
|
839
|
+
|
|
840
|
+
/**
|
|
841
|
+
* @param {string[]} conditions
|
|
842
|
+
* @param {string[]} statements
|
|
843
|
+
* @returns {string}
|
|
844
|
+
*/
|
|
845
|
+
export function ifElseGlsl(conditions, statements) {
|
|
846
|
+
if (conditions.length != statements.length) {
|
|
847
|
+
throw new Error("Unequal array lengths");
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
const n = conditions.length;
|
|
851
|
+
|
|
852
|
+
if (n == 0) {
|
|
853
|
+
return "";
|
|
854
|
+
} else if (n == 1 && conditions[0] == null) {
|
|
855
|
+
return statements[0];
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
const parts = [];
|
|
859
|
+
for (let i = 0; i < n; i++) {
|
|
860
|
+
const condition = conditions[i];
|
|
861
|
+
const ifelse =
|
|
862
|
+
i == 0
|
|
863
|
+
? `if (${condition})`
|
|
864
|
+
: condition == null && i == n - 1
|
|
865
|
+
? `else`
|
|
866
|
+
: `else if (${condition})`;
|
|
867
|
+
parts.push(
|
|
868
|
+
` ${ifelse} {
|
|
869
|
+
${statements[i]}
|
|
870
|
+
}`
|
|
871
|
+
);
|
|
872
|
+
}
|
|
873
|
+
|
|
874
|
+
return parts.join("\n");
|
|
875
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "/**Based on concepts presented at:*https:*https:*/out highp vec4 vPickingColor;/***Passes the unique id to the fragment shader as a color if picking is enabled.*Returns true if picking is enabled.*/bool setupPicking(){if(uPickingEnabled){\n#ifdef uniqueId_DEFINED\
|
|
1
|
+
const shader = "/**Based on concepts presented at:*https:*https:*/out highp vec4 vPickingColor;/***Passes the unique id to the fragment shader as a color if picking is enabled.*Returns true if picking is enabled.*/bool setupPicking(){if(uPickingEnabled){\n#ifdef uniqueId_DEFINED\nuint id=attr_uniqueId;vPickingColor=vec4(ivec4(id>>0,id>>8,id>>16,id>>24)&0xFF)/float(0xFF);\n#else\nvPickingColor=vec4(1.0);\n#endif\nreturn true;}return false;}";
|
|
2
2
|
export default shader;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "layout(std140)uniform Mark{uniform float uArcHeightFactor;uniform float uMinArcHeight;uniform float uMinPickingSize;uniform int uShape;uniform int uOrient;uniform bool uClampApex;uniform float uMaxChordLength;uniform vec2 uArcFadingDistance;uniform int uSegmentBreaks;\n#pragma markUniforms\n};";
|
|
1
|
+
const shader = "layout(std140)uniform Mark{uniform float uArcHeightFactor;uniform float uMinArcHeight;uniform float uMinPickingSize;uniform int uShape;uniform int uOrient;uniform bool uClampApex;uniform float uMaxChordLength;uniform vec2 uArcFadingDistance;uniform bool uNoFadingOnPointSelection;uniform int uSegmentBreaks;\n#pragma markUniforms\n};";
|
|
2
2
|
export default shader;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/marks/link.js"],"names":[],"mappings":"AAYA;
|
|
1
|
+
{"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/marks/link.js"],"names":[],"mappings":"AAYA;IAgCQ;;;;;OAKG;IACH,yBAEC;IAoHD;;;;;;MAKC;CAwFR;iBA/PgB,WAAW"}
|
package/dist/src/marks/link.js
CHANGED
|
@@ -35,6 +35,7 @@ export default class LinkMark extends Mark {
|
|
|
35
35
|
clampApex: false,
|
|
36
36
|
maxChordLength: 50000,
|
|
37
37
|
arcFadingDistance: false,
|
|
38
|
+
noFadingOnPointSelection: true,
|
|
38
39
|
|
|
39
40
|
linkShape: "arc",
|
|
40
41
|
orient: "vertical",
|
|
@@ -138,10 +139,19 @@ export default class LinkMark extends Mark {
|
|
|
138
139
|
props.segments,
|
|
139
140
|
(x) => x + 1
|
|
140
141
|
);
|
|
142
|
+
this.registerMarkUniformValue(
|
|
143
|
+
"uNoFadingOnPointSelection",
|
|
144
|
+
props.noFadingOnPointSelection,
|
|
145
|
+
(x) => !!x
|
|
146
|
+
);
|
|
141
147
|
}
|
|
142
148
|
|
|
143
149
|
updateGraphicsData() {
|
|
144
150
|
const collector = this.unitView.getCollector();
|
|
151
|
+
if (!collector) {
|
|
152
|
+
console.debug("No collector");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
145
155
|
const itemCount = collector.getItemCount();
|
|
146
156
|
|
|
147
157
|
const builder = new LinkVertexBuilder({
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "out vec4 vColor;out float vSize;out float vNormalLengthInPixels;const int SHAPE_ARC=0;const int SHAPE_DOME=1;const int SHAPE_DIAGONAL=2;const int SHAPE_LINE=3;const int ORIENT_VERTICAL=0;const int ORIENT_HORIZONTAL=1;float distanceFromLine(vec2 pointOnLine1,vec2 pointOnLine2,vec2 point){vec2 a=point-pointOnLine1;vec2 b=pointOnLine2-pointOnLine1;vec2 proj=dot(a,b)/dot(b,b)*b;return length(a-proj);}bool isInsideViewport(vec2 point,float marginFactor){vec2 margin=uViewportSize*vec2(marginFactor);return point.x>=-margin.x&&point.x<=uViewportSize.x+margin.x&&point.y>=-margin.y&&point.y<=uViewportSize.y+margin.y;}void main(void){float pixelSize=1.0/uDevicePixelRatio;float opacity=getScaled_opacity()*uViewOpacity;vec2 p1,p2,p3,p4;vec2 a=applySampleFacet(vec2(getScaled_x(),getScaled_y()))*uViewportSize;vec2 b=applySampleFacet(vec2(getScaled_x2(),getScaled_y2()))*uViewportSize;if(uShape<=SHAPE_DOME){if(uShape==SHAPE_DOME){vec2 height=vec2(0.0);if(uOrient==ORIENT_VERTICAL){p1=vec2(min(a.x,b.x),b.y);p4=vec2(max(a.x,b.x),b.y);height=vec2(0.0,a.y-b.y);if(uClampApex){if(p4.x>0.0){p1.x=max(p1.x,-p4.x);}if(p1.x<uViewportSize.x){p4.x=min(p4.x,2.0*uViewportSize.x-p1.x);}}}else{p1=vec2(b.x,min(a.y,b.y));p4=vec2(b.x,max(a.y,b.y));height=vec2(a.x-b.x,0.0);if(uClampApex){if(p4.y>0.0){p1.y=max(p1.y,-p4.y);}if(p1.y<uViewportSize.y){p4.y=min(p4.y,2.0*uViewportSize.y-p1.y);}}}vec2 controlOffset=height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}if(uShape==SHAPE_ARC){p1=a;p4=b;vec2 chordVector=p4-p1;vec2 unitChordVector=normalize(chordVector);vec2 chordNormal=vec2(-unitChordVector.y,unitChordVector.x);float chordLength=length(chordVector);if(chordLength>uMaxChordLength){if(isInsideViewport(p1,2.0)){chordLength=uMaxChordLength;p4=p1+unitChordVector*uMaxChordLength;}else if(isInsideViewport(p4,2.0)){chordLength=uMaxChordLength;p1=p4-unitChordVector*uMaxChordLength;}}float height=max(chordLength/2.0*uArcHeightFactor,uMinArcHeight);vec2 controlOffset=chordNormal*height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}}else if(uShape==SHAPE_DIAGONAL){if(uOrient==ORIENT_VERTICAL){p1=a;p2=vec2(a.x,(a.y+b.y)/2.0);p3=vec2(b.x,(a.y+b.y)/2.0);p4=b;}else{p1=a;p2=vec2((a.x+b.x)/2.0,a.y);p3=vec2((a.x+b.x)/2.0,b.y);p4=b;}}else if(uShape==SHAPE_LINE){p1=a;p2=(a+b)/2.0;p3=p2;p4=b;}vec2 strip=vec2(float(gl_VertexID/2)/float(uSegmentBreaks),float(gl_VertexID % 2)-0.5);float t=smoothstep(0.0,1.0,strip.x);vec2 C1=p4-3.0*p3+3.0*p2-p1;vec2 C2=3.0*p3-6.0*p2+3.0*p1;vec2 C3=3.0*p2-3.0*p1;vec2 C4=p1;vec2 p;if(t==0.0){p=p1;}else if(t==1.0){p=p4;}else{p=C1*t*t*t+C2*t*t+C3*t+C4;}vec2 tangent=normalize(3.0*C1*t*t+2.0*C2*t+C3);vec2 normal=vec2(-tangent.y,tangent.x);float size=getScaled_size();if(size<pixelSize){opacity*=size/pixelSize;size=pixelSize;}float paddedSize=uPickingEnabled? max(size,uMinPickingSize): size+pixelSize;vNormalLengthInPixels=strip.y*paddedSize;if(uShape==SHAPE_ARC&&uArcFadingDistance[0]>0.0&&uArcFadingDistance[1]>0.0){float d=distanceFromLine(p1,p4,p);float distanceOpacity=smoothstep(uArcFadingDistance[1],uArcFadingDistance[0],d);opacity*=distanceOpacity;if(distanceOpacity<=0.0){vNormalLengthInPixels=0.0;}}p+=normal*vNormalLengthInPixels;gl_Position=pixelsToNdc(p);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vSize=paddedSize;setupPicking();}";
|
|
1
|
+
const shader = "out vec4 vColor;out float vSize;out float vNormalLengthInPixels;const int SHAPE_ARC=0;const int SHAPE_DOME=1;const int SHAPE_DIAGONAL=2;const int SHAPE_LINE=3;const int ORIENT_VERTICAL=0;const int ORIENT_HORIZONTAL=1;float distanceFromLine(vec2 pointOnLine1,vec2 pointOnLine2,vec2 point){vec2 a=point-pointOnLine1;vec2 b=pointOnLine2-pointOnLine1;vec2 proj=dot(a,b)/dot(b,b)*b;return length(a-proj);}bool isInsideViewport(vec2 point,float marginFactor){vec2 margin=uViewportSize*vec2(marginFactor);return point.x>=-margin.x&&point.x<=uViewportSize.x+margin.x&&point.y>=-margin.y&&point.y<=uViewportSize.y+margin.y;}void main(void){float pixelSize=1.0/uDevicePixelRatio;float opacity=getScaled_opacity()*uViewOpacity;vec2 p1,p2,p3,p4;vec2 a=applySampleFacet(vec2(getScaled_x(),getScaled_y()))*uViewportSize;vec2 b=applySampleFacet(vec2(getScaled_x2(),getScaled_y2()))*uViewportSize;if(uShape<=SHAPE_DOME){if(uShape==SHAPE_DOME){vec2 height=vec2(0.0);if(uOrient==ORIENT_VERTICAL){p1=vec2(min(a.x,b.x),b.y);p4=vec2(max(a.x,b.x),b.y);height=vec2(0.0,a.y-b.y);if(uClampApex){if(p4.x>0.0){p1.x=max(p1.x,-p4.x);}if(p1.x<uViewportSize.x){p4.x=min(p4.x,2.0*uViewportSize.x-p1.x);}}}else{p1=vec2(b.x,min(a.y,b.y));p4=vec2(b.x,max(a.y,b.y));height=vec2(a.x-b.x,0.0);if(uClampApex){if(p4.y>0.0){p1.y=max(p1.y,-p4.y);}if(p1.y<uViewportSize.y){p4.y=min(p4.y,2.0*uViewportSize.y-p1.y);}}}vec2 controlOffset=height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}if(uShape==SHAPE_ARC){p1=a;p4=b;vec2 chordVector=p4-p1;vec2 unitChordVector=normalize(chordVector);vec2 chordNormal=vec2(-unitChordVector.y,unitChordVector.x);float chordLength=length(chordVector);if(chordLength>uMaxChordLength){if(isInsideViewport(p1,2.0)){chordLength=uMaxChordLength;p4=p1+unitChordVector*uMaxChordLength;}else if(isInsideViewport(p4,2.0)){chordLength=uMaxChordLength;p1=p4-unitChordVector*uMaxChordLength;}}float height=max(chordLength/2.0*uArcHeightFactor,uMinArcHeight);vec2 controlOffset=chordNormal*height/0.75;p2=p1+controlOffset;p3=p4+controlOffset;}}else if(uShape==SHAPE_DIAGONAL){if(uOrient==ORIENT_VERTICAL){p1=a;p2=vec2(a.x,(a.y+b.y)/2.0);p3=vec2(b.x,(a.y+b.y)/2.0);p4=b;}else{p1=a;p2=vec2((a.x+b.x)/2.0,a.y);p3=vec2((a.x+b.x)/2.0,b.y);p4=b;}}else if(uShape==SHAPE_LINE){p1=a;p2=(a+b)/2.0;p3=p2;p4=b;}vec2 strip=vec2(float(gl_VertexID/2)/float(uSegmentBreaks),float(gl_VertexID % 2)-0.5);float t=smoothstep(0.0,1.0,strip.x);vec2 C1=p4-3.0*p3+3.0*p2-p1;vec2 C2=3.0*p3-6.0*p2+3.0*p1;vec2 C3=3.0*p2-3.0*p1;vec2 C4=p1;vec2 p;if(t==0.0){p=p1;}else if(t==1.0){p=p4;}else{p=C1*t*t*t+C2*t*t+C3*t+C4;}vec2 tangent=normalize(3.0*C1*t*t+2.0*C2*t+C3);vec2 normal=vec2(-tangent.y,tangent.x);float size=getScaled_size();if(size<pixelSize){opacity*=size/pixelSize;size=pixelSize;}float paddedSize=uPickingEnabled? max(size,uMinPickingSize): size+pixelSize;vNormalLengthInPixels=strip.y*paddedSize;if(uShape==SHAPE_ARC&&uArcFadingDistance[0]>0.0&&uArcFadingDistance[1]>0.0&&(!uNoFadingOnPointSelection||!isPointSelected())){float d=distanceFromLine(p1,p4,p);float distanceOpacity=smoothstep(uArcFadingDistance[1],uArcFadingDistance[0],d);opacity*=distanceOpacity;if(distanceOpacity<=0.0){vNormalLengthInPixels=0.0;}}p+=normal*vNormalLengthInPixels;gl_Position=pixelsToNdc(p);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vSize=paddedSize;setupPicking();}";
|
|
2
2
|
export default shader;
|
package/dist/src/marks/mark.d.ts
CHANGED
|
@@ -20,8 +20,8 @@ export default class Mark {
|
|
|
20
20
|
*/
|
|
21
21
|
constructor(unitView: import("../view/unitView.js").default);
|
|
22
22
|
unitView: import("../view/unitView.js").default;
|
|
23
|
-
/** @type {Record<
|
|
24
|
-
encoders: Record<
|
|
23
|
+
/** @type {Partial<Record<Channel, import("../types/encoder.js").Encoder>>} */
|
|
24
|
+
encoders: Partial<Record<import("../spec/channel.js").Channel, import("../types/encoder.js").Encoder>>;
|
|
25
25
|
/**
|
|
26
26
|
* @type {import("twgl.js").BufferInfo & { allocatedVertices?: number }}
|
|
27
27
|
* @protected
|
|
@@ -85,9 +85,6 @@ export default class Mark {
|
|
|
85
85
|
/**
|
|
86
86
|
* Returns attribute info for WebGL attributes that match visual channels.
|
|
87
87
|
*
|
|
88
|
-
* Note: attributes and channels do not necessarily match.
|
|
89
|
-
* For example, rectangles have x, y, x2, and y2 channels but only x and y as attributes.
|
|
90
|
-
*
|
|
91
88
|
* @returns {string[]}
|
|
92
89
|
*/
|
|
93
90
|
getAttributes(): string[];
|
|
@@ -98,14 +95,14 @@ export default class Mark {
|
|
|
98
95
|
/**
|
|
99
96
|
* @returns {Encoding}
|
|
100
97
|
*/
|
|
101
|
-
getDefaultEncoding(): import("../spec/channel.js").Encoding
|
|
98
|
+
getDefaultEncoding(): import("../spec/channel.js").Encoding;
|
|
102
99
|
/**
|
|
103
100
|
* Adds intelligent defaults etc to the encoding.
|
|
104
101
|
*
|
|
105
102
|
* @param {Encoding} encoding
|
|
106
103
|
* @returns {Encoding}
|
|
107
104
|
*/
|
|
108
|
-
fixEncoding(encoding: import("../spec/channel.js").Encoding
|
|
105
|
+
fixEncoding(encoding: import("../spec/channel.js").Encoding): import("../spec/channel.js").Encoding;
|
|
109
106
|
/**
|
|
110
107
|
* Handles dynamic properties that are not bound to uniforms but need
|
|
111
108
|
* to trigger a graphics update, i.e., rebuild the vertex buffer.
|
|
@@ -119,7 +116,7 @@ export default class Mark {
|
|
|
119
116
|
*
|
|
120
117
|
* @returns {Encoding}
|
|
121
118
|
*/
|
|
122
|
-
get encoding(): import("../spec/channel.js").Encoding
|
|
119
|
+
get encoding(): import("../spec/channel.js").Encoding;
|
|
123
120
|
getContext(): import("../types/viewContext.js").default;
|
|
124
121
|
getType(): import("../spec/mark.js").MarkType;
|
|
125
122
|
initializeData(): void;
|
|
@@ -136,7 +133,7 @@ export default class Mark {
|
|
|
136
133
|
* Update WebGL buffers from the data
|
|
137
134
|
*/
|
|
138
135
|
updateGraphicsData(): void;
|
|
139
|
-
getSampleFacetMode(): "
|
|
136
|
+
getSampleFacetMode(): "SAMPLE_FACET_UNIFORM" | "SAMPLE_FACET_TEXTURE";
|
|
140
137
|
/**
|
|
141
138
|
*
|
|
142
139
|
* @param {string} vertexShader
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":";AAoDA,0DAA2D;AAC3D,0DAA2D;AAE3D;;;;;;;;;;;;GAYG;AACH;IAgBI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAuG/C;IApGG,gDAAwB;IAExB,8EAA8E;IAC9E,uGAAyB;IAIzB;;;OAGG;IACH,sBAHU,OAAO,SAAS,EAAE,UAAU,GAAG;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAG5C;IAE3B;;;;;;;OAOG;IACH,2BAHU,IAAI,MAAM,EAAE,MAAM,CAAC,CAGG;IAEhC;;;OAGG;IACH,uBAHU,OAAO,SAAS,EAAE,WAAW,CAGX;IAE5B;;;OAGG;IACH,2BAHU,OAAO,SAAS,EAAE,eAAe,CAGX;IAEhC;;;OAGG;IACH,2BAHU,OAAO,SAAS,EAAE,gBAAgB,CAGZ;IAEhC;;;;;OAKG;IACH,2BAHU,OAAO,SAAS,EAAE,gBAAgB,CAGZ;IAEhC;;;;;OAKG;IACH,uCAA+B;IAE/B,kFAAkF;IAClF,UADW,SAAS,GAAG,CAAC,CACM;IAG9B,wBAAwB;IACxB,uDAqBC;IAED;;;;;;;;OAQG;IACH,kEAKC;IAGL,sBAEC;IAED;;;;OAIG;IACH,iBAFa,MAAM,EAAE,CAKpB;IAED;;OAEG;IACH,+DAWC;IAED;;OAEG;IACH,4DAcC;IAED;;;;;OAKG;IACH,oGAEC;IAED;;;;;;OAMG;IACH,yGAkCC;IAED;;;;OAIG;IACH,sDAiDC;IAED,wDAEC;IAED,8CAEC;IAED,uBAEC;IAED;;;OAGG;IACH,2BAEC;IAED;;OAEG;IACH,oCAEC;IAED;;OAEG;IACH,2BAEC;IAED,sEAeC;IAED;;;;;;OAMG;IAEH,6CANW,MAAM,kBACN,MAAM,iBACN,MAAM,EAAE,QA8UlB;IALG;;;;;;MAIC;IAGL;;;;;;OAMG;IACH,uCA6CC;IAED;;;;;;OAMG;IACH,+CAHW,MAAM,UACK,GAAG,KAAE,IAAI,CAe9B;IAED;;;;;;;;;;OAUG;IACH,mDAJW,MAAM,sFAEsB,GAAG,QA6BzC;IAED;;OAEG;IACH,2BAwBC;IAED;;;OAGG;IACH,6BAFW,GAAG,QAyCb;IAED,yBAAyB;IACzB,uDAEC;IAED,yBAAyB;IACzB,iCAEC;IAED,gCAEC;IAED,+BAEC;IAED,yCAEC;IAED;;;;;OAKG;IACH,gCAcC;IAED;;OAEG;IACH,4CAOC;IAED;;;;;;;;OAQG;IAEH,uBAJW,OAAO,uBAAuB,EAAE,sBAAsB,GACpD,CAAC,MAAM,IAAI,CAAC,EAAE,CAsF1B;IAED;;;;;;OAMG;IACH,qCAJW,oBAAoB,GAClB,OAAO,CAqCnB;IAED;;;;;;;OAOG;IACH,gBAJW,oBAAoB,SACP,IAAI,CAM3B;IAED;;;OAGG;IACH,2BAHW,YAAY,WACZ,OAAO,WAAW,EAAE,oBAAoB,cAiElD;IAED;;;;;;OAMG;IACH,oBAJW,OAAO,6BAA6B,EAAE,OAAO,aAC7C,OAAO,6BAA6B,EAAE,OAAO,GAC3C,OAAO,CAuHnB;IAED;;;;;;;;;OASG;IACH,qBAJW,MAAM,KACN,OAAO,oBAAoB,EAAE,MAAM,GACjC,GAAG,CAIf;;CACJ;+BAvwCY,OAAO,uBAAuB,EAAE,gBAAgB;;;;;;wBAEnD,OAAO;;mCAEJ,gBAAgB,GAAG,qBAAqB;oCAG1C,MAAM,SACN,MAAM;AAiwCjB;;;GAGG;AACH;IACI,cAEC;IAkBD;;;OAGG;IACH,2BAFW,IAAI,CAAC,EAAE,OAAO,yBAAyB,EAAE,UAAU,CAAC,QAiB9D;CACJ;0BAj0CyB,WAAW"}
|