@genome-spy/core 0.48.2 → 0.50.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 +7434 -7107
- package/dist/bundle/index.js +116 -103
- package/dist/schema.json +3975 -2819
- 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/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.test.d.ts +2 -0
- package/dist/src/data/transforms/identifier.test.d.ts.map +1 -0
- 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 +15 -6
- package/dist/src/gl/dataToVertices.d.ts +6 -8
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +42 -33
- 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/common.glsl.js +1 -1
- package/dist/src/marks/link.common.glsl.js +1 -1
- package/dist/src/marks/link.d.ts +8 -1
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.fragment.glsl.js +1 -1
- package/dist/src/marks/link.js +47 -31
- package/dist/src/marks/link.vertex.glsl.js +1 -1
- package/dist/src/marks/mark.d.ts +24 -25
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +246 -118
- package/dist/src/marks/markUtils.d.ts +25 -0
- package/dist/src/marks/markUtils.d.ts.map +1 -1
- package/dist/src/marks/markUtils.js +41 -1
- package/dist/src/marks/point.common.glsl.js +1 -1
- package/dist/src/marks/point.d.ts +8 -1
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +34 -25
- package/dist/src/marks/point.vertex.glsl.js +1 -1
- package/dist/src/marks/rect.d.ts +8 -1
- package/dist/src/marks/rect.d.ts.map +1 -1
- package/dist/src/marks/rect.js +28 -23
- package/dist/src/marks/rule.d.ts +8 -1
- package/dist/src/marks/rule.d.ts.map +1 -1
- package/dist/src/marks/rule.js +23 -16
- package/dist/src/marks/text.d.ts +10 -1
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.fragment.glsl.js +1 -1
- package/dist/src/marks/text.js +53 -47
- package/dist/src/marks/text.vertex.glsl.js +1 -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 +150 -83
- package/dist/src/spec/mark.d.ts +133 -78
- 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 +5 -10
- package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -1
- package/dist/src/tooltip/dataTooltipHandler.js +1 -1
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +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/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/inputBinding.d.ts.map +1 -1
- package/dist/src/utils/inputBinding.js +4 -0
- 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.test.d.ts +2 -0
- package/dist/src/utils/radixSort.test.d.ts.map +1 -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/axisView.js +2 -2
- 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/flowBuilder.test.js +1 -1
- package/dist/src/view/gridView.d.ts +0 -6
- package/dist/src/view/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView.js +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 +39 -5
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +120 -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 +37 -1
- package/dist/src/view/scaleResolution.d.ts +17 -15
- package/dist/src/view/scaleResolution.d.ts.map +1 -1
- package/dist/src/view/scaleResolution.js +70 -68
- 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 +8 -20
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +100 -102
- 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/viewUtils.d.ts +1 -1
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/zoom.js +2 -2
- package/package.json +5 -2
package/dist/src/marks/point.js
CHANGED
|
@@ -17,6 +17,9 @@ import { fixFill, fixStroke } from "./markUtils.js";
|
|
|
17
17
|
/** @type {Record<string, import("../spec/channel.js").ChannelDef>} */
|
|
18
18
|
const defaultEncoding = {};
|
|
19
19
|
|
|
20
|
+
/**
|
|
21
|
+
* @extends {Mark<import("../spec/mark.js").PointProps>}
|
|
22
|
+
*/
|
|
20
23
|
export default class PointMark extends Mark {
|
|
21
24
|
#semanticZoomFraction = () => 0;
|
|
22
25
|
|
|
@@ -26,28 +29,28 @@ export default class PointMark extends Mark {
|
|
|
26
29
|
constructor(unitView) {
|
|
27
30
|
super(unitView);
|
|
28
31
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
);
|
|
32
|
+
this.augmentDefaultProperties({
|
|
33
|
+
x: 0.5,
|
|
34
|
+
y: 0.5,
|
|
35
|
+
color: "#4c78a8",
|
|
36
|
+
filled: true,
|
|
37
|
+
opacity: 1.0,
|
|
38
|
+
size: 100.0,
|
|
39
|
+
// @ts-expect-error - TODO: Should be datum instead of value. But needs fixing.
|
|
40
|
+
semanticScore: 0.0,
|
|
41
|
+
shape: "circle",
|
|
42
|
+
strokeWidth: 2.0,
|
|
43
|
+
fillGradientStrength: 0.0,
|
|
44
|
+
dx: 0,
|
|
45
|
+
dy: 0,
|
|
46
|
+
angle: 0,
|
|
47
|
+
|
|
48
|
+
sampleFacetPadding: 0.1,
|
|
49
|
+
|
|
50
|
+
semanticZoomFraction: 0.02,
|
|
51
|
+
|
|
52
|
+
minPickingSize: 2.0,
|
|
53
|
+
});
|
|
51
54
|
|
|
52
55
|
// TODO: This mess should be simplified
|
|
53
56
|
// TODO: createExpression should accept constant values or ExprRefs and allow
|
|
@@ -68,9 +71,11 @@ export default class PointMark extends Mark {
|
|
|
68
71
|
}
|
|
69
72
|
}
|
|
70
73
|
|
|
74
|
+
/**
|
|
75
|
+
* @returns {import("../spec/channel.js").Channel[]}
|
|
76
|
+
*/
|
|
71
77
|
getAttributes() {
|
|
72
78
|
return [
|
|
73
|
-
"inwardStroke",
|
|
74
79
|
"uniqueId",
|
|
75
80
|
"facetIndex",
|
|
76
81
|
"x",
|
|
@@ -79,7 +84,6 @@ export default class PointMark extends Mark {
|
|
|
79
84
|
"semanticScore",
|
|
80
85
|
"shape",
|
|
81
86
|
"strokeWidth",
|
|
82
|
-
"gradientStrength",
|
|
83
87
|
"dx",
|
|
84
88
|
"dy",
|
|
85
89
|
"fill",
|
|
@@ -135,7 +139,7 @@ export default class PointMark extends Mark {
|
|
|
135
139
|
// Semantic zooming is currently solely a feature of point mark.
|
|
136
140
|
// Build a sorted sample that allows for computing p-quantiles
|
|
137
141
|
const semanticScoreAccessor =
|
|
138
|
-
this.
|
|
142
|
+
this.encoders["semanticScore"]?.dataAccessor?.asNumberAccessor();
|
|
139
143
|
if (semanticScoreAccessor) {
|
|
140
144
|
// n chosen using Stetson-Harrison
|
|
141
145
|
// TODO: Throw on missing scores
|
|
@@ -173,10 +177,15 @@ export default class PointMark extends Mark {
|
|
|
173
177
|
"uGradientStrength",
|
|
174
178
|
props.fillGradientStrength
|
|
175
179
|
);
|
|
180
|
+
this.registerMarkUniformValue("uMinPickingSize", props.minPickingSize);
|
|
176
181
|
}
|
|
177
182
|
|
|
178
183
|
updateGraphicsData() {
|
|
179
184
|
const collector = this.unitView.getCollector();
|
|
185
|
+
if (!collector) {
|
|
186
|
+
console.debug("No collector");
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
180
189
|
const itemCount = collector.getItemCount();
|
|
181
190
|
|
|
182
191
|
const builder = new PointVertexBuilder({
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "out float vRadius;out float vRadiusWithPadding;out lowp vec4 vFillColor;out lowp vec4 vStrokeColor;out lowp float vShape;out lowp float vHalfStrokeWidth;out mat2 vRotationMatrix;const float CIRCLE=0.0;const float SQUARE=1.0;const float CROSS=2.0;const float DIAMOND=3.0;const float TRIANGLE_UP=4.0;const float TRIANGLE_RIGHT=5.0;const float TRIANGLE_DOWN=6.0;const float TRIANGLE_LEFT=7.0;const float TICK_UP=8.0;const float TICK_RIGHT=9.0;const float TICK_DOWN=10.0;const float TICK_LEFT=11.0;float computeSemanticThresholdFactor(){return getScaled_semanticScore()>=uSemanticThreshold ? 1.0 : 0.0;}vec2 getDxDy(){\n#if defined(dx_DEFINED) || defined(dy_DEFINED)\nreturn vec2(getScaled_dx(),getScaled_dy())/uViewportSize;\n#else\nreturn vec2(0.0,0.0);\n#endif\n}void main(void){float shapeAngle=0.0;float semanticThresholdFactor=computeSemanticThresholdFactor();if(semanticThresholdFactor<=0.0){gl_PointSize=0.0;gl_Position=vec4(100.0,0.0,0.0,0.0);return;}float size=getScaled_size();vec2 pos=vec2(getScaled_x(),getScaled_y())+getDxDy();gl_Position=unitToNdc(applySampleFacet(pos));float strokeWidth=getScaled_strokeWidth();float diameter=sqrt(size)*uScaleFactor*semanticThresholdFactor;float opacity=uViewOpacity;if(strokeWidth<=0.0||uInwardStroke){float minDiameter=1.0/uDevicePixelRatio;if(diameter<minDiameter){opacity*=pow(diameter/minDiameter,2.5);diameter=minDiameter;}}float fillOpa=getScaled_fillOpacity()*opacity;float strokeOpa=getScaled_strokeOpacity()*opacity;vShape=getScaled_shape();bool circle=vShape==0.0;if(vShape>TICK_UP&&vShape<=TICK_LEFT){shapeAngle=(vShape-TICK_UP)*90.0;vShape=TICK_UP;}else if(vShape>TRIANGLE_UP&&vShape<=TRIANGLE_LEFT){shapeAngle=(vShape-TRIANGLE_UP)*90.0;vShape=TRIANGLE_UP;}float angleInDegrees=getScaled_angle();float angle=-(shapeAngle+angleInDegrees)*PI/180.0;float sinTheta=sin(angle);float cosTheta=cos(angle);vRotationMatrix=mat2(cosTheta,sinTheta,-sinTheta,cosTheta);float roomForRotation=circle ? 1.0 : sin(mod(angle,PI/2.0)+PI/4.0)/sin(PI/4.0);float aaPadding=1.0/uDevicePixelRatio;float rotationPadding=(diameter*roomForRotation)-diameter;float strokePadding=uInwardStroke ? 0.0 : strokeWidth*(circle ? 1.0 : sqrt(3.0));float padding=rotationPadding+strokePadding+aaPadding;gl_PointSize=(diameter+padding)*uDevicePixelRatio;vRadius=diameter/2.0;vRadiusWithPadding=vRadius+padding/2.0;vHalfStrokeWidth=strokeWidth/2.0;vFillColor=vec4(getScaled_fill()*fillOpa,fillOpa);vStrokeColor=vec4(getScaled_stroke()*strokeOpa,strokeOpa);setupPicking();}";
|
|
1
|
+
const shader = "out float vRadius;out float vRadiusWithPadding;out lowp vec4 vFillColor;out lowp vec4 vStrokeColor;out lowp float vShape;out lowp float vHalfStrokeWidth;out mat2 vRotationMatrix;const float CIRCLE=0.0;const float SQUARE=1.0;const float CROSS=2.0;const float DIAMOND=3.0;const float TRIANGLE_UP=4.0;const float TRIANGLE_RIGHT=5.0;const float TRIANGLE_DOWN=6.0;const float TRIANGLE_LEFT=7.0;const float TICK_UP=8.0;const float TICK_RIGHT=9.0;const float TICK_DOWN=10.0;const float TICK_LEFT=11.0;float computeSemanticThresholdFactor(){return getScaled_semanticScore()>=uSemanticThreshold ? 1.0 : 0.0;}vec2 getDxDy(){\n#if defined(dx_DEFINED) || defined(dy_DEFINED)\nreturn vec2(getScaled_dx(),getScaled_dy())/uViewportSize;\n#else\nreturn vec2(0.0,0.0);\n#endif\n}void main(void){float shapeAngle=0.0;float semanticThresholdFactor=computeSemanticThresholdFactor();if(semanticThresholdFactor<=0.0){gl_PointSize=0.0;gl_Position=vec4(100.0,0.0,0.0,0.0);return;}float size=getScaled_size();vec2 pos=vec2(getScaled_x(),getScaled_y())+getDxDy();gl_Position=unitToNdc(applySampleFacet(pos));float strokeWidth=getScaled_strokeWidth();float diameter=sqrt(size)*uScaleFactor*semanticThresholdFactor;float opacity=uViewOpacity;if(strokeWidth<=0.0||uInwardStroke){float minDiameter=1.0/uDevicePixelRatio;if(diameter<minDiameter){opacity*=pow(diameter/minDiameter,2.5);diameter=minDiameter;}}float fillOpa=getScaled_fillOpacity()*opacity;float strokeOpa=getScaled_strokeOpacity()*opacity;vShape=getScaled_shape();bool circle=vShape==0.0;if(vShape>TICK_UP&&vShape<=TICK_LEFT){shapeAngle=(vShape-TICK_UP)*90.0;vShape=TICK_UP;}else if(vShape>TRIANGLE_UP&&vShape<=TRIANGLE_LEFT){shapeAngle=(vShape-TRIANGLE_UP)*90.0;vShape=TRIANGLE_UP;}float angleInDegrees=getScaled_angle();float angle=-(shapeAngle+angleInDegrees)*PI/180.0;float sinTheta=sin(angle);float cosTheta=cos(angle);vRotationMatrix=mat2(cosTheta,sinTheta,-sinTheta,cosTheta);float roomForRotation=circle ? 1.0 : sin(mod(angle,PI/2.0)+PI/4.0)/sin(PI/4.0);float aaPadding=1.0/uDevicePixelRatio;float rotationPadding=(diameter*roomForRotation)-diameter;float strokePadding=uInwardStroke ? 0.0 : strokeWidth*(circle ? 1.0 : sqrt(3.0));float padding=rotationPadding+strokePadding+aaPadding;gl_PointSize=max((diameter+padding),uPickingEnabled ? uMinPickingSize : 0.0)*uDevicePixelRatio;vRadius=diameter/2.0;vRadiusWithPadding=vRadius+padding/2.0;vHalfStrokeWidth=strokeWidth/2.0;vFillColor=vec4(getScaled_fill()*fillOpa,fillOpa);vStrokeColor=vec4(getScaled_stroke()*strokeOpa,strokeOpa);setupPicking();}";
|
|
2
2
|
export default shader;
|
package/dist/src/marks/rect.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @extends {Mark<import("../spec/mark.js").RectProps>}
|
|
3
|
+
*/
|
|
4
|
+
export default class RectMark extends Mark<import("../spec/mark.js").RectProps> {
|
|
5
|
+
/**
|
|
6
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
7
|
+
*/
|
|
8
|
+
constructor(unitView: import("../view/unitView.js").default);
|
|
2
9
|
/**
|
|
3
10
|
* Finds a datum that overlaps the given value on the x domain.
|
|
4
11
|
* The result is unspecified if multiple data are found.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/marks/rect.js"],"names":[],"mappings":"AAaA;
|
|
1
|
+
{"version":3,"file":"rect.d.ts","sourceRoot":"","sources":["../../../src/marks/rect.js"],"names":[],"mappings":"AAaA;;GAEG;AACH;IACI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAkB/C;IAuMD;;;;;;;;;;OAUG;IACH,8BALW,GAAG,KACH,OAAO,oBAAoB,EAAE,MAAM,GACjC,GAAG,CAyBf;;CACJ;iBAvQgB,WAAW"}
|
package/dist/src/marks/rect.js
CHANGED
|
@@ -11,6 +11,9 @@ import { isValueDef } from "../encoder/encoder.js";
|
|
|
11
11
|
import { getCachedOrCall } from "../utils/propertyCacher.js";
|
|
12
12
|
import { isDiscrete } from "vega-scale";
|
|
13
13
|
|
|
14
|
+
/**
|
|
15
|
+
* @extends {Mark<import("../spec/mark.js").RectProps>}
|
|
16
|
+
*/
|
|
14
17
|
export default class RectMark extends Mark {
|
|
15
18
|
/**
|
|
16
19
|
* @param {import("../view/unitView.js").default} unitView
|
|
@@ -18,27 +21,24 @@ export default class RectMark extends Mark {
|
|
|
18
21
|
constructor(unitView) {
|
|
19
22
|
super(unitView);
|
|
20
23
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
minOpacity: 1.0,
|
|
35
|
-
|
|
36
|
-
tessellationZoomThreshold: 10, // This works with genomes, but likely breaks with other data. TODO: Fix, TODO: log2
|
|
37
|
-
tessellationTiles: 35, // TODO: Tiles per unit (bp)
|
|
38
|
-
})
|
|
39
|
-
);
|
|
24
|
+
this.augmentDefaultProperties({
|
|
25
|
+
x2: undefined,
|
|
26
|
+
y2: undefined,
|
|
27
|
+
filled: true,
|
|
28
|
+
color: "#4c78a8",
|
|
29
|
+
opacity: 1.0,
|
|
30
|
+
strokeWidth: 3,
|
|
31
|
+
cornerRadius: 0.0,
|
|
32
|
+
|
|
33
|
+
minWidth: 0.5, // Minimum width/height prevents annoying flickering when zooming
|
|
34
|
+
minHeight: 0.5,
|
|
35
|
+
minOpacity: 1.0,
|
|
36
|
+
});
|
|
40
37
|
}
|
|
41
38
|
|
|
39
|
+
/**
|
|
40
|
+
* @returns {import("../spec/channel.js").Channel[]}
|
|
41
|
+
*/
|
|
42
42
|
getAttributes() {
|
|
43
43
|
return [
|
|
44
44
|
"uniqueId",
|
|
@@ -126,7 +126,8 @@ export default class RectMark extends Mark {
|
|
|
126
126
|
|
|
127
127
|
#isStroked() {
|
|
128
128
|
const sw = this.encoding.strokeWidth;
|
|
129
|
-
|
|
129
|
+
// True if there's any chance for a stroke to be drawn
|
|
130
|
+
return !(isValueDef(sw) && !sw.value) || "condition" in sw;
|
|
130
131
|
}
|
|
131
132
|
|
|
132
133
|
async initializeGraphics() {
|
|
@@ -177,6 +178,10 @@ export default class RectMark extends Mark {
|
|
|
177
178
|
|
|
178
179
|
updateGraphicsData() {
|
|
179
180
|
const collector = this.unitView.getCollector();
|
|
181
|
+
if (!collector) {
|
|
182
|
+
console.debug("No collector");
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
180
185
|
const numItems = collector.getItemCount();
|
|
181
186
|
|
|
182
187
|
const builder = new RectVertexBuilder({
|
|
@@ -251,13 +256,13 @@ export default class RectMark extends Mark {
|
|
|
251
256
|
const scaleType = e.x.scale.type;
|
|
252
257
|
|
|
253
258
|
if (isDiscrete(scaleType)) {
|
|
254
|
-
const a = e.x.
|
|
259
|
+
const a = e.x.dataAccessor;
|
|
255
260
|
// TODO: Binary search
|
|
256
261
|
return data.find((d) => x == a(d));
|
|
257
262
|
} else {
|
|
258
263
|
// TODO: Handle point features on locus/index scales
|
|
259
|
-
const a = e.x.
|
|
260
|
-
const a2 = e.x2.
|
|
264
|
+
const a = e.x.dataAccessor;
|
|
265
|
+
const a2 = e.x2.dataAccessor;
|
|
261
266
|
// TODO: Binary search
|
|
262
267
|
return data.find((d) => x >= a(d) && x < a2(d));
|
|
263
268
|
}
|
package/dist/src/marks/rule.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @extends {Mark<import("../spec/mark.js").RuleProps>}
|
|
3
|
+
*/
|
|
4
|
+
export default class RuleMark extends Mark<import("../spec/mark.js").RuleProps> {
|
|
5
|
+
/**
|
|
6
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
7
|
+
*/
|
|
8
|
+
constructor(unitView: import("../view/unitView.js").default);
|
|
2
9
|
dashTextureSize: number;
|
|
3
10
|
dashTexture: WebGLTexture;
|
|
4
11
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/marks/rule.js"],"names":[],"mappings":"AAcA;
|
|
1
|
+
{"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../../src/marks/rule.js"],"names":[],"mappings":"AAcA;;GAEG;AACH;IACI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAoB/C;IAfG,wBAAwB;IA4GpB,0BAOE;CAgGb;iBA3OgB,WAAW"}
|
package/dist/src/marks/rule.js
CHANGED
|
@@ -12,6 +12,9 @@ import COMMON_SHADER from "./rule.common.glsl.js";
|
|
|
12
12
|
import { RuleVertexBuilder } from "../gl/dataToVertices.js";
|
|
13
13
|
import { isChannelDefWithScale } from "../encoder/encoder.js";
|
|
14
14
|
|
|
15
|
+
/**
|
|
16
|
+
* @extends {Mark<import("../spec/mark.js").RuleProps>}
|
|
17
|
+
*/
|
|
15
18
|
export default class RuleMark extends Mark {
|
|
16
19
|
/**
|
|
17
20
|
* @param {import("../view/unitView.js").default} unitView
|
|
@@ -21,24 +24,24 @@ export default class RuleMark extends Mark {
|
|
|
21
24
|
|
|
22
25
|
this.dashTextureSize = 0;
|
|
23
26
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
strokeCap: "butt",
|
|
38
|
-
})
|
|
39
|
-
);
|
|
27
|
+
this.augmentDefaultProperties({
|
|
28
|
+
x2: undefined,
|
|
29
|
+
y2: undefined,
|
|
30
|
+
size: 1,
|
|
31
|
+
color: "black",
|
|
32
|
+
opacity: 1.0,
|
|
33
|
+
|
|
34
|
+
minLength: 0.0,
|
|
35
|
+
/** @type {number[]} */
|
|
36
|
+
strokeDash: null,
|
|
37
|
+
strokeDashOffset: 0,
|
|
38
|
+
strokeCap: "butt",
|
|
39
|
+
});
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
+
/**
|
|
43
|
+
* @returns {import("../spec/channel.js").Channel[]}
|
|
44
|
+
*/
|
|
42
45
|
getAttributes() {
|
|
43
46
|
return [
|
|
44
47
|
"uniqueId",
|
|
@@ -165,6 +168,10 @@ export default class RuleMark extends Mark {
|
|
|
165
168
|
|
|
166
169
|
updateGraphicsData() {
|
|
167
170
|
const collector = this.unitView.getCollector();
|
|
171
|
+
if (!collector) {
|
|
172
|
+
console.debug("No collector");
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
168
175
|
const itemCount = collector.getItemCount();
|
|
169
176
|
|
|
170
177
|
const builder = new RuleVertexBuilder({
|
package/dist/src/marks/text.d.ts
CHANGED
|
@@ -5,8 +5,17 @@
|
|
|
5
5
|
* - Valve's SDF paper: https://doi.org/10.1145/1281500.1281665
|
|
6
6
|
* - Multi-channel SDF fonts: https://github.com/Chlumsky/msdfgen
|
|
7
7
|
* - Google's web fonts as SDFs: https://github.com/etiennepinchon/aframe-fonts
|
|
8
|
+
*
|
|
9
|
+
* @extends {Mark<import("../spec/mark.js").TextProps>}
|
|
8
10
|
*/
|
|
9
|
-
export default class TextMark extends Mark {
|
|
11
|
+
export default class TextMark extends Mark<import("../spec/mark.js").TextProps> {
|
|
12
|
+
/**
|
|
13
|
+
* @typedef {import("../spec/mark.js").MarkProps} MarkProps
|
|
14
|
+
*/
|
|
15
|
+
/**
|
|
16
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
17
|
+
*/
|
|
18
|
+
constructor(unitView: import("../view/unitView.js").default);
|
|
10
19
|
font: import("../fonts/bmFontManager.js").FontEntry;
|
|
11
20
|
}
|
|
12
21
|
import Mark from "./mark.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/marks/text.js"],"names":[],"mappings":"AAgCA
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/marks/text.js"],"names":[],"mappings":"AAgCA;;;;;;;;;GASG;AACH;IACI;;OAEG;IACH;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EA8D/C;IAbG,oDAMmD;CA+M1D;iBAxSgB,WAAW"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "uniform sampler2D uTexture;in vec2 vTexCoord;in float vEdgeFadeOpacity;in vec4 vColor;in float vSlope;out lowp vec4 fragColor;float median(float r,float g,float b){return max(min(r,g),min(max(r,g),b));}void main(){vec3 c=texture(uTexture,vTexCoord).rgb;float sigDist=1.0-median(c.r,c.g,c.b);float slope=uLogoLetter? 0.7/length(vec2(dFdy(sigDist),dFdx(sigDist))): vSlope;float opa=clamp((sigDist-0.5)*slope+0.5,0.0,1.0);opa*=
|
|
1
|
+
const shader = "uniform sampler2D uTexture;in vec2 vTexCoord;in float vEdgeFadeOpacity;in vec4 vColor;in float vSlope;in float vGamma;out lowp vec4 fragColor;float median(float r,float g,float b){return max(min(r,g),min(max(r,g),b));}void main(){vec3 c=texture(uTexture,vTexCoord).rgb;float sigDist=1.0-median(c.r,c.g,c.b);float slope=uLogoLetter? 0.7/length(vec2(dFdy(sigDist),dFdx(sigDist))): vSlope;float opa=clamp((sigDist-0.5)*slope+0.5,0.0,1.0);opa*=clamp(vEdgeFadeOpacity,0.0,1.0);opa=pow(opa,vGamma);fragColor=vColor*opa;if(uPickingEnabled){fragColor=vPickingColor;}}";
|
|
2
2
|
export default shader;
|
package/dist/src/marks/text.js
CHANGED
|
@@ -37,6 +37,8 @@ const baselines = {
|
|
|
37
37
|
* - Valve's SDF paper: https://doi.org/10.1145/1281500.1281665
|
|
38
38
|
* - Multi-channel SDF fonts: https://github.com/Chlumsky/msdfgen
|
|
39
39
|
* - Google's web fonts as SDFs: https://github.com/etiennepinchon/aframe-fonts
|
|
40
|
+
*
|
|
41
|
+
* @extends {Mark<import("../spec/mark.js").TextProps>}
|
|
40
42
|
*/
|
|
41
43
|
export default class TextMark extends Mark {
|
|
42
44
|
/**
|
|
@@ -48,52 +50,49 @@ export default class TextMark extends Mark {
|
|
|
48
50
|
constructor(unitView) {
|
|
49
51
|
super(unitView);
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
viewportEdgeFadeDistanceLeft: -Infinity,
|
|
95
|
-
})
|
|
96
|
-
);
|
|
53
|
+
this.augmentDefaultProperties({
|
|
54
|
+
x: 0.5,
|
|
55
|
+
y: 0.5,
|
|
56
|
+
x2: undefined,
|
|
57
|
+
y2: undefined,
|
|
58
|
+
text: "",
|
|
59
|
+
size: 11.0,
|
|
60
|
+
color: "black",
|
|
61
|
+
opacity: 1.0,
|
|
62
|
+
|
|
63
|
+
// Use the built-in default
|
|
64
|
+
font: undefined,
|
|
65
|
+
fontStyle: undefined,
|
|
66
|
+
fontWeight: undefined,
|
|
67
|
+
|
|
68
|
+
align: "center",
|
|
69
|
+
baseline: "middle",
|
|
70
|
+
dx: 0,
|
|
71
|
+
dy: 0,
|
|
72
|
+
angle: 0,
|
|
73
|
+
|
|
74
|
+
/** When only primary channel is defined with band/locus scale */
|
|
75
|
+
fitToBand: false,
|
|
76
|
+
|
|
77
|
+
squeeze: true,
|
|
78
|
+
paddingX: 0,
|
|
79
|
+
paddingY: 0,
|
|
80
|
+
flushX: true,
|
|
81
|
+
flushY: true,
|
|
82
|
+
|
|
83
|
+
/** Stretch letters so that they can be used with sequence logos etc... */
|
|
84
|
+
logoLetters: false,
|
|
85
|
+
|
|
86
|
+
viewportEdgeFadeWidthTop: 0,
|
|
87
|
+
viewportEdgeFadeWidthRight: 0,
|
|
88
|
+
viewportEdgeFadeWidthBottom: 0,
|
|
89
|
+
viewportEdgeFadeWidthLeft: 0,
|
|
90
|
+
|
|
91
|
+
viewportEdgeFadeDistanceTop: -Infinity,
|
|
92
|
+
viewportEdgeFadeDistanceRight: -Infinity,
|
|
93
|
+
viewportEdgeFadeDistanceBottom: -Infinity,
|
|
94
|
+
viewportEdgeFadeDistanceLeft: -Infinity,
|
|
95
|
+
});
|
|
97
96
|
|
|
98
97
|
this.font = this.properties.font
|
|
99
98
|
? unitView.context.fontManager.getFont(
|
|
@@ -110,6 +109,9 @@ export default class TextMark extends Mark {
|
|
|
110
109
|
]);
|
|
111
110
|
}
|
|
112
111
|
|
|
112
|
+
/**
|
|
113
|
+
* @returns {import("../spec/channel.js").Channel[]}
|
|
114
|
+
*/
|
|
113
115
|
getAttributes() {
|
|
114
116
|
return [
|
|
115
117
|
"uniqueId",
|
|
@@ -216,11 +218,15 @@ export default class TextMark extends Mark {
|
|
|
216
218
|
|
|
217
219
|
updateGraphicsData() {
|
|
218
220
|
const collector = this.unitView.getCollector();
|
|
221
|
+
if (!collector) {
|
|
222
|
+
console.debug("No collector");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
219
225
|
const data = collector.getData();
|
|
220
226
|
const encoding = this.encoding;
|
|
221
227
|
|
|
222
228
|
// Count the total number of characters to that we can pre-allocate a typed array
|
|
223
|
-
const accessor = this.encoders.text
|
|
229
|
+
const accessor = this.encoders.text; // accessor or constant value
|
|
224
230
|
let charCount = 0;
|
|
225
231
|
/** @type {function(any):any} */
|
|
226
232
|
const numberFormat =
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "in mediump vec2 vertexCoord;in lowp vec2 textureCoord;in float width;out vec2 vTexCoord;out vec4 vColor;out float vSlope;out float vEdgeFadeOpacity;struct RangeResult{float pos;float scale;};float minValue(vec4 v){return min(min(v.x,v.y),min(v.z,v.w));}float maxValue(vec4 v){return max(max(v.x,v.y),max(v.z,v.w));}/***All measures are in[0,1]*/RangeResult positionInsideRange(float a,float b,float width,float padding,int align,bool flush){float span=b-a;float paddedWidth=width+2.0*padding;if(a>1.0||b<0.0){return RangeResult(0.0,0.0);}float extra=max(0.0,span-paddedWidth);float pos;if(align==0){float centre=a+b;if(flush){float leftOver=max(0.0,paddedWidth-centre);centre+=min(leftOver,extra);float rightOver=max(0.0,paddedWidth+centre-2.0);centre-=min(rightOver,extra);}pos=centre/2.0;}else if(align<0){float edge=a;if(flush){float over=max(0.0,-edge);edge+=min(over,extra);}pos=edge+padding;}else{float edge=b;if(flush){float over=max(0.0,edge-1.0);edge-=min(over,extra);}pos=edge-padding;}float scale=clamp((span-padding)/paddedWidth,0.0,1.0);return RangeResult(pos,scale);}vec2 calculateRotatedDimensions(float width,mat2 rotationMatrix){vec2 a=abs(rotationMatrix*vec2(width/2.0,0.5));vec2 b=abs(rotationMatrix*vec2(width/2.0,-0.5));return vec2(max(a.x,b.x),max(a.y,b.y))*2.0;}ivec2 fixAlignForAngle(ivec2 align,float angleInDegrees){float a=mod(angleInDegrees+45.0,360.0);int x=align.x;int y=-align.y;if(a<90.0){return ivec2(x,y);}else if(a<180.0){return ivec2(y,-x);}else if(a<270.0){return ivec2(-x,y);}else{return ivec2(-y,x);}}void main(void){float opacity=getScaled_opacity()*uViewOpacity;vec2 size=vec2(getScaled_size());float x=getScaled_x();float y=getScaled_y();float scale=1.0;float angleInDegrees=getScaled_angle();float angle=-angleInDegrees*PI/180.0;float sinTheta=sin(angle);float cosTheta=cos(angle);mat2 rotationMatrix=mat2(cosTheta,sinTheta,-sinTheta,cosTheta);vec2 flushSize=calculateRotatedDimensions(width,rotationMatrix);\n#if defined(x2_DEFINED) || defined(y2_DEFINED)\nivec2 align=fixAlignForAngle(uAlign,angleInDegrees);\n#else\nivec2 align=uAlign;\n#endif\n#ifdef x2_DEFINED\nfloat x2=getScaled_x2();if(uLogoLetter){size.x=(x2-x)*uViewportSize.x;x+=(x2-x)/2.0;}else{float x2=getScaled_x2();RangeResult result=positionInsideRange(min(x,x2),max(x,x2),size.x*scale*flushSize.x/uViewportSize.x,uPaddingX/uViewportSize.x,align.x,uFlushX);x=result.pos;scale*=result.scale;}\n#endif\nvec2 pos=applySampleFacet(vec2(x,y));\n#ifdef y2_DEFINED\nfloat y2=getScaled_y2();vec2 pos2=applySampleFacet(vec2(x,y2));if(uLogoLetter){size.y=(pos2.y-pos.y)*uViewportSize.y;pos.y+=(pos2.y-pos.y)/2.0;}else{RangeResult result=positionInsideRange(min(pos.y,pos2.y),max(pos.y,pos2.y),size.y*scale*flushSize.y/uViewportSize.y,uPaddingY/uViewportSize.y,align.y,uFlushY);pos.y=result.pos;scale*=result.scale;}\n#endif\nif(scale<1.0){if(uSqueeze){vec2 scaleFadeExtent=vec2(3.0,6.0)/size;if(scale<scaleFadeExtent[0]){gl_Position=vec4(0.0);return;}size*=scale;opacity*=linearstep(scaleFadeExtent[0],scaleFadeExtent[1],scale);}else if(scale<1.0){gl_Position=vec4(0.0);return;}}vec2 charPos=rotationMatrix*(vertexCoord*size+uD);vec2 unitPos=pos+charPos/uViewportSize;gl_Position=unitToNdc(unitPos);vSlope=max(1.0,min(size.x,size.y)/uSdfNumerator);vColor=vec4(
|
|
1
|
+
const shader = "in mediump vec2 vertexCoord;in lowp vec2 textureCoord;in float width;out vec2 vTexCoord;out vec4 vColor;out float vSlope;out float vEdgeFadeOpacity;out float vGamma;struct RangeResult{float pos;float scale;};float minValue(vec4 v){return min(min(v.x,v.y),min(v.z,v.w));}float maxValue(vec4 v){return max(max(v.x,v.y),max(v.z,v.w));}/***All measures are in[0,1]*/RangeResult positionInsideRange(float a,float b,float width,float padding,int align,bool flush){float span=b-a;float paddedWidth=width+2.0*padding;if(a>1.0||b<0.0){return RangeResult(0.0,0.0);}float extra=max(0.0,span-paddedWidth);float pos;if(align==0){float centre=a+b;if(flush){float leftOver=max(0.0,paddedWidth-centre);centre+=min(leftOver,extra);float rightOver=max(0.0,paddedWidth+centre-2.0);centre-=min(rightOver,extra);}pos=centre/2.0;}else if(align<0){float edge=a;if(flush){float over=max(0.0,-edge);edge+=min(over,extra);}pos=edge+padding;}else{float edge=b;if(flush){float over=max(0.0,edge-1.0);edge-=min(over,extra);}pos=edge-padding;}float scale=clamp((span-padding)/paddedWidth,0.0,1.0);return RangeResult(pos,scale);}vec2 calculateRotatedDimensions(float width,mat2 rotationMatrix){vec2 a=abs(rotationMatrix*vec2(width/2.0,0.5));vec2 b=abs(rotationMatrix*vec2(width/2.0,-0.5));return vec2(max(a.x,b.x),max(a.y,b.y))*2.0;}ivec2 fixAlignForAngle(ivec2 align,float angleInDegrees){float a=mod(angleInDegrees+45.0,360.0);int x=align.x;int y=-align.y;if(a<90.0){return ivec2(x,y);}else if(a<180.0){return ivec2(y,-x);}else if(a<270.0){return ivec2(-x,y);}else{return ivec2(-y,x);}}void main(void){float opacity=getScaled_opacity()*uViewOpacity;vec2 size=vec2(getScaled_size());float x=getScaled_x();float y=getScaled_y();float scale=1.0;float angleInDegrees=getScaled_angle();float angle=-angleInDegrees*PI/180.0;float sinTheta=sin(angle);float cosTheta=cos(angle);mat2 rotationMatrix=mat2(cosTheta,sinTheta,-sinTheta,cosTheta);vec2 flushSize=calculateRotatedDimensions(width,rotationMatrix);\n#if defined(x2_DEFINED) || defined(y2_DEFINED)\nivec2 align=fixAlignForAngle(uAlign,angleInDegrees);\n#else\nivec2 align=uAlign;\n#endif\n#ifdef x2_DEFINED\nfloat x2=getScaled_x2();if(uLogoLetter){size.x=(x2-x)*uViewportSize.x;x+=(x2-x)/2.0;}else{float x2=getScaled_x2();RangeResult result=positionInsideRange(min(x,x2),max(x,x2),size.x*scale*flushSize.x/uViewportSize.x,uPaddingX/uViewportSize.x,align.x,uFlushX);x=result.pos;scale*=result.scale;}\n#endif\nvec2 pos=applySampleFacet(vec2(x,y));\n#ifdef y2_DEFINED\nfloat y2=getScaled_y2();vec2 pos2=applySampleFacet(vec2(x,y2));if(uLogoLetter){size.y=(pos2.y-pos.y)*uViewportSize.y;pos.y+=(pos2.y-pos.y)/2.0;}else{RangeResult result=positionInsideRange(min(pos.y,pos2.y),max(pos.y,pos2.y),size.y*scale*flushSize.y/uViewportSize.y,uPaddingY/uViewportSize.y,align.y,uFlushY);pos.y=result.pos;scale*=result.scale;}\n#endif\nif(scale<1.0){if(uSqueeze){vec2 scaleFadeExtent=vec2(3.0,6.0)/size;if(scale<scaleFadeExtent[0]){gl_Position=vec4(0.0);return;}size*=scale;opacity*=linearstep(scaleFadeExtent[0],scaleFadeExtent[1],scale);}else if(scale<1.0){gl_Position=vec4(0.0);return;}}vec2 charPos=rotationMatrix*(vertexCoord*size+uD);vec2 unitPos=pos+charPos/uViewportSize;gl_Position=unitToNdc(unitPos);vSlope=max(1.0,min(size.x,size.y)/uSdfNumerator);vec3 color=getScaled_color();vColor=vec4(color*opacity,opacity);vGamma=getGammaForColor(color);vTexCoord=textureCoord;if(maxValue(uViewportEdgeFadeDistance)>-pow(10.0,10.0)){vEdgeFadeOpacity=minValue(((vec4(1.0,1.0,0.0,0.0)+vec4(-1.0,-1.0,1.0,1.0)*unitPos.yxyx)*uViewportSize.yxyx-uViewportEdgeFadeDistance)/uViewportEdgeFadeWidth);}else{vEdgeFadeOpacity=1.0;}setupPicking();}";
|
|
2
2
|
export default shader;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scale.test.d.ts","sourceRoot":"","sources":["../../../src/scale/scale.test.js"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticks.test.d.ts","sourceRoot":"","sources":["../../../src/scale/ticks.test.js"],"names":[],"mappings":""}
|
|
@@ -16,6 +16,12 @@ import { validTicks } from "./ticks.js";
|
|
|
16
16
|
test("validTicks uses count correctly", function () {
|
|
17
17
|
var data = [0, 1, 2, 3, 4, 5, 6, 7];
|
|
18
18
|
|
|
19
|
+
/**
|
|
20
|
+
*
|
|
21
|
+
* @param {T} x
|
|
22
|
+
* @returns {T}
|
|
23
|
+
* @template T
|
|
24
|
+
*/
|
|
19
25
|
var identity = function (x) {
|
|
20
26
|
return x;
|
|
21
27
|
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {import("../data/flowNode.js").Datum} datum
|
|
3
|
+
* @returns {import("../types/selectionTypes.js").SinglePointSelection}
|
|
4
|
+
*/
|
|
5
|
+
export function createSinglePointSelection(datum: import("../data/flowNode.js").Datum): import("../types/selectionTypes.js").SinglePointSelection;
|
|
6
|
+
/**
|
|
7
|
+
* @param {import("../types/selectionTypes.js").Selection} selection
|
|
8
|
+
* @param {import("../data/flowNode.js").Datum} datum
|
|
9
|
+
* @param {boolean} [empty] evaluate to true if the selection is empty
|
|
10
|
+
*/
|
|
11
|
+
export function selectionTest(selection: import("../types/selectionTypes.js").Selection, datum: import("../data/flowNode.js").Datum, empty?: boolean): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* @param {{param: string, empty?: boolean}} params
|
|
14
|
+
*/
|
|
15
|
+
export function makeSelectionTestExpression(params: {
|
|
16
|
+
param: string;
|
|
17
|
+
empty?: boolean;
|
|
18
|
+
}): string;
|
|
19
|
+
/**
|
|
20
|
+
* @param {import("../types/selectionTypes.js").Selection} selection
|
|
21
|
+
* @returns {selection is import("../types/selectionTypes.js").RangeSelection}
|
|
22
|
+
*/
|
|
23
|
+
export function isRangeSelection(selection: import("../types/selectionTypes.js").Selection): selection is import("../types/selectionTypes.js").RangeSelection;
|
|
24
|
+
/**
|
|
25
|
+
* @param {import("../types/selectionTypes.js").Selection} selection
|
|
26
|
+
* @returns {selection is import("../types/selectionTypes.js").SinglePointSelection}
|
|
27
|
+
*/
|
|
28
|
+
export function isSinglePointSelection(selection: import("../types/selectionTypes.js").Selection): selection is import("../types/selectionTypes.js").SinglePointSelection;
|
|
29
|
+
/**
|
|
30
|
+
* @param {import("../types/selectionTypes.js").Selection} selection
|
|
31
|
+
* @returns {selection is import("../types/selectionTypes.js").MultiPointSelection}
|
|
32
|
+
*/
|
|
33
|
+
export function isMultiPointSelection(selection: import("../types/selectionTypes.js").Selection): selection is import("../types/selectionTypes.js").MultiPointSelection;
|
|
34
|
+
/**
|
|
35
|
+
* @param {import("../types/selectionTypes.js").Selection} selection
|
|
36
|
+
* @returns {selection is import("../types/selectionTypes.js").ProjectedSelection}
|
|
37
|
+
*/
|
|
38
|
+
export function isProjectedSelection(selection: import("../types/selectionTypes.js").Selection): selection is import("../types/selectionTypes.js").ProjectedSelection;
|
|
39
|
+
//# sourceMappingURL=selection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selection.d.ts","sourceRoot":"","sources":["../../../src/selection/selection.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,kDAHW,OAAO,qBAAqB,EAAE,KAAK,GACjC,OAAO,4BAA4B,EAAE,oBAAoB,CAQrE;AAED;;;;GAIG;AACH,yCAJW,OAAO,4BAA4B,EAAE,SAAS,SAC9C,OAAO,qBAAqB,EAAE,KAAK,UACnC,OAAO,WAkBjB;AAED;;GAEG;AACH,oDAFW;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAC,UAM1C;AAED;;;GAGG;AACH,4CAHW,OAAO,4BAA4B,EAAE,SAAS,oEAKxD;AAED;;;GAGG;AACH,kDAHW,OAAO,4BAA4B,EAAE,SAAS,0EAKxD;AAED;;;GAGG;AACH,iDAHW,OAAO,4BAA4B,EAAE,SAAS,yEAKxD;AAED;;;GAGG;AACH,gDAHW,OAAO,4BAA4B,EAAE,SAAS,wEAKxD"}
|