@genome-spy/core 0.49.0 → 0.50.1
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 +2861 -2829
- package/dist/bundle/index.js +90 -89
- package/dist/schema.json +2175 -1430
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +12 -8
- package/dist/src/gl/includes/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 +38 -32
- package/dist/src/marks/link.vertex.glsl.js +1 -1
- package/dist/src/marks/mark.d.ts +19 -16
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +41 -27
- 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 +29 -24
- 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 +19 -19
- 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 +19 -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 +48 -46
- package/dist/src/marks/text.vertex.glsl.js +1 -1
- package/dist/src/spec/channel.d.ts +14 -1
- package/dist/src/spec/mark.d.ts +167 -87
- package/dist/src/spec/view.d.ts +115 -39
- package/dist/src/styles/genome-spy.css.d.ts +1 -1
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
- package/dist/src/styles/genome-spy.css.js +1 -0
- package/dist/src/styles/genome-spy.scss +1 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -1
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -1
- package/dist/src/view/axisResolution.d.ts +1 -1
- package/dist/src/view/axisResolution.d.ts.map +1 -1
- package/dist/src/view/axisResolution.js +1 -1
- package/dist/src/view/axisView.js +2 -2
- package/dist/src/view/flowBuilder.test.js +1 -1
- package/dist/src/view/gridView.js +1 -1
- package/dist/src/view/layout/flexLayout.d.ts +6 -0
- package/dist/src/view/layout/flexLayout.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.js +9 -0
- package/dist/src/view/paramMediator.d.ts +7 -0
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +23 -0
- package/dist/src/view/paramMediator.test.js +20 -0
- package/dist/src/view/scaleResolution.d.ts +1 -7
- package/dist/src/view/scaleResolution.d.ts.map +1 -1
- package/dist/src/view/scaleResolution.js +24 -39
- package/dist/src/view/unitView.d.ts +3 -5
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +22 -4
- package/dist/src/view/view.js +1 -1
- package/dist/src/view/viewUtils.d.ts +1 -5
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +0 -7
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA6CA;IACI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EA6FpD;IA1FG,uBAA0B;IAC1B,oDAAsB;IAItB,6BAA6B;IAC7B,uBADW,CAAC,MAAM,IAAI,CAAC,EAAE,CACM;IAE/B,sCAAsC;IACtC,wCAAgB;IAEhB,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,QAAU,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,qEAF0B,OAAO,CAE8B;IAE/D,2CAA2C;IAC3C,mBADW,4BAA4B,CACL;IAClC,2CAA2C;IAC3C,iBADW,4BAA4B,CACP;IAEhC,oDAAoD;IACpD,6BAAgC;IAEhC;;;OAGG;IACH,eAFU;QAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAEpF;IAE9B,uBAA+C;IAE/C;;;OAGG;IACH,oBAFU,IAAI,MAAM,EAAE,QAAU,aAAa,KAAE,IAAI,CAAC,EAAE,CAAC,CAEpB;IAEnC;;;;;;OAMG;IACH,yCAFkC,GAAG,KAAK,IAAI,GAEd;IAEhC;;;OAGG;IACH,kDAFkC,GAAG,KAAK,IAAI,GAEL;IAEzC,oFAAoF;IACpF,iBADW,OAAO,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAEzB;;;;OAIG;IACH;gBAF8B,OAAO,wBAAwB,EAAE,iBAAiB;iBAAW,MAAM;OAEnE;IAE9B;;OAEG;IACH,wBAFU,WAAW,CAEkB;IAEvC,oBAAoB;IACpB,kBADW,KAAK,CACiB;IA2CrC;;;OAGG;IACH,2CAFkB,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAaf;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAQb;IAED;;;OAGG;IACH,iCAwDC;IA4DG,uBAQC;IAGD,mCAGE;IAOF,sCAEE;IAGF,iBAA0C;IAW9C;;OAEG;IACH,gBAuBC;IAED,sCA6MC;IAED;;;OAGG;IACH,UAFa,QAAQ,OAAO,CAAC,CA6B5B;IAED,4BA8JC;IAvIe,iCAAoC;IAyIpD;;;OAGG;IACH,kBAHW,MAAM,KACN,MAAM,QAqEhB;IAED;;;;;;;OAOG;IACH,oDAHuB,QAAQ,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;IAED,sBA6CC;IAED,kBAIC;IAED,iCAOC;IAED,iCASC;IAED,qFAWC;;CACJ;;;;iCAt8BY,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB;4BAP7B,uBAAuB;qBAZ9C,qBAAqB;wBAIlB,yBAAyB;yCARR,yDAAyD;oBAYvD,oBAAoB;kBAT7C,wBAAwB;wBALlB,qBAAqB;oBATzB,uBAAuB;qBAOtB,oBAAoB"}
|
package/dist/src/genomeSpy.js
CHANGED
|
@@ -10,7 +10,6 @@ import {
|
|
|
10
10
|
checkForDuplicateScaleNames,
|
|
11
11
|
setImplicitScaleNames,
|
|
12
12
|
calculateCanvasSize,
|
|
13
|
-
calculateViewRootSize,
|
|
14
13
|
} from "./view/viewUtils.js";
|
|
15
14
|
import UnitView from "./view/unitView.js";
|
|
16
15
|
|
|
@@ -288,6 +287,9 @@ export default class GenomeSpy {
|
|
|
288
287
|
// Do some hacks to stop css animations of the loading indicators.
|
|
289
288
|
// Otherwise they fire animation frames even when their opacity is zero.
|
|
290
289
|
// TODO: Instead of this, replace the animated spinners with static images.
|
|
290
|
+
// Or even better, once more widely supported, use `allow-discrete`
|
|
291
|
+
// https://developer.mozilla.org/en-US/docs/Web/CSS/transition-behavior
|
|
292
|
+
// to enable transition of the display property.
|
|
291
293
|
if (isSomethingVisible()) {
|
|
292
294
|
this.loadingIndicatorsElement.style.display = "block";
|
|
293
295
|
} else {
|
|
@@ -316,10 +318,12 @@ export default class GenomeSpy {
|
|
|
316
318
|
this.renderAll();
|
|
317
319
|
};
|
|
318
320
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
321
|
+
if (this.viewRoot.getSize().isGrowing()) {
|
|
322
|
+
// TODO: Size should be observed only if the content is not absolutely sized
|
|
323
|
+
const resizeObserver = new ResizeObserver(resizeCallback);
|
|
324
|
+
resizeObserver.observe(this.container);
|
|
325
|
+
this._destructionCallbacks.push(() => resizeObserver.disconnect());
|
|
326
|
+
}
|
|
323
327
|
|
|
324
328
|
/** @type {() => void} */
|
|
325
329
|
let remove = null;
|
|
@@ -362,7 +366,7 @@ export default class GenomeSpy {
|
|
|
362
366
|
canvasWrapper,
|
|
363
367
|
() =>
|
|
364
368
|
this.viewRoot
|
|
365
|
-
? calculateCanvasSize(
|
|
369
|
+
? calculateCanvasSize(this.viewRoot.getSize())
|
|
366
370
|
: { width: undefined, height: undefined },
|
|
367
371
|
this.spec.background,
|
|
368
372
|
{ powerPreference: this.options.powerPreference ?? "default" }
|
|
@@ -384,7 +388,7 @@ export default class GenomeSpy {
|
|
|
384
388
|
});
|
|
385
389
|
canvasWrapper.appendChild(this.loadingIndicatorsElement);
|
|
386
390
|
|
|
387
|
-
this.tooltip = new Tooltip(
|
|
391
|
+
this.tooltip = new Tooltip(this.container);
|
|
388
392
|
|
|
389
393
|
this.loadingMessageElement
|
|
390
394
|
.querySelector(".message")
|
|
@@ -539,7 +543,7 @@ export default class GenomeSpy {
|
|
|
539
543
|
);
|
|
540
544
|
|
|
541
545
|
this.#canvasWrapper.style.flexGrow =
|
|
542
|
-
|
|
546
|
+
this.viewRoot.getSize().height.grow > 0 ? "1" : "0";
|
|
543
547
|
|
|
544
548
|
this.#initializeParameterBindings();
|
|
545
549
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "#define PI 3.141593\nuniform View{mediump vec2 uViewOffset;mediump vec2 uViewScale;mediump vec2 uViewportSize;lowp float uDevicePixelRatio;lowp float uViewOpacity;bool uPickingEnabled;};/***Maps a coordinate on the unit scale to a normalized device coordinate.*(0,0)is at the bottom left corner.*/vec4 unitToNdc(vec2 coord){return vec4((coord*uViewScale+uViewOffset)*2.0-1.0,0.0,1.0);}vec4 unitToNdc(float x,float y){return unitToNdc(vec2(x,y));}vec4 pixelsToNdc(vec2 coord){return unitToNdc(coord/uViewportSize);}vec4 pixelsToNdc(float x,float y){return pixelsToNdc(vec2(x,y));}float linearstep(float edge0,float edge1,float x){return clamp((x-edge0)/(edge1-edge0),0.0,1.0);}/***Specialized linearstep for doing antialiasing*/float distanceToRatio(float d){return clamp(d*uDevicePixelRatio+0.5,0.0,1.0);}vec4 distanceToColor(float d,vec4 fill,vec4 stroke,float halfStrokeWidth){if(halfStrokeWidth>0.0){float sd=abs(d)-halfStrokeWidth;return mix(stroke,d<=0.0 ? fill : vec4(0.0),distanceToRatio(sd));}else{return fill*distanceToRatio(-d);}}";
|
|
1
|
+
const shader = "#define PI 3.141593\nuniform View{mediump vec2 uViewOffset;mediump vec2 uViewScale;mediump vec2 uViewportSize;lowp float uDevicePixelRatio;lowp float uViewOpacity;bool uPickingEnabled;};/***Maps a coordinate on the unit scale to a normalized device coordinate.*(0,0)is at the bottom left corner.*/vec4 unitToNdc(vec2 coord){return vec4((coord*uViewScale+uViewOffset)*2.0-1.0,0.0,1.0);}vec4 unitToNdc(float x,float y){return unitToNdc(vec2(x,y));}vec4 pixelsToNdc(vec2 coord){return unitToNdc(coord/uViewportSize);}vec4 pixelsToNdc(float x,float y){return pixelsToNdc(vec2(x,y));}float linearstep(float edge0,float edge1,float x){return clamp((x-edge0)/(edge1-edge0),0.0,1.0);}/***Calculates a gamma for antialiasing opacity based on the color.*/float getGammaForColor(vec3 rgb){return mix(1.25,0.75,smoothstep(0.0,1.0,dot(rgb,vec3(0.299,0.587,0.114))));}/***Specialized linearstep for doing antialiasing*/float distanceToRatio(float d){return clamp(d*uDevicePixelRatio+0.5,0.0,1.0);}vec4 distanceToColor(float d,vec4 fill,vec4 stroke,float halfStrokeWidth){if(halfStrokeWidth>0.0){float sd=abs(d)-halfStrokeWidth;return mix(stroke,d<=0.0 ? fill : vec4(0.0),distanceToRatio(sd));}else{return fill*distanceToRatio(-d);}}";
|
|
2
2
|
export default shader;
|
package/dist/src/marks/link.d.ts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @extends {Mark<import("../spec/mark.js").LinkProps>}
|
|
3
|
+
*/
|
|
4
|
+
export default class LinkMark extends Mark<import("../spec/mark.js").LinkProps> {
|
|
5
|
+
/**
|
|
6
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
7
|
+
*/
|
|
8
|
+
constructor(unitView: import("../view/unitView.js").default);
|
|
2
9
|
/**
|
|
3
10
|
* Only available if "WebGL Draft Extensions" is enabled in chrome://flags
|
|
4
11
|
* But seems to work.
|
|
@@ -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;;GAEG;AACH;IACI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EAoC/C;IATG;;;;;OAKG;IACH,yBAEC;IAsHD;;;;;;MAKC;CA4FR;iBArQgB,WAAW"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "in vec4 vColor;in float vSize;in float vNormalLengthInPixels;out lowp vec4 fragColor;void main(void){float dpr=uDevicePixelRatio;float distance=abs(vNormalLengthInPixels);float opacity=clamp(((vSize/2.0-distance)*dpr),0.0,1.0);fragColor=vColor*opacity;if(uPickingEnabled){fragColor=vPickingColor;}}";
|
|
1
|
+
const shader = "in vec4 vColor;in float vSize;in float vNormalLengthInPixels;in float vGamma;out lowp vec4 fragColor;void main(void){float dpr=uDevicePixelRatio;float distance=abs(vNormalLengthInPixels);float opacity=clamp(((vSize/2.0-distance)*dpr),0.0,1.0);opacity=pow(opacity,vGamma);fragColor=vColor*opacity;if(uPickingEnabled){fragColor=vPickingColor;}}";
|
|
2
2
|
export default shader;
|
package/dist/src/marks/link.js
CHANGED
|
@@ -10,6 +10,9 @@ import { isChannelDefWithScale } from "../encoder/encoder.js";
|
|
|
10
10
|
const LINK_SHAPES = ["arc", "dome", "diagonal", "line"];
|
|
11
11
|
const ORIENTS = ["vertical", "horizontal"];
|
|
12
12
|
|
|
13
|
+
/**
|
|
14
|
+
* @extends {Mark<import("../spec/mark.js").LinkProps>}
|
|
15
|
+
*/
|
|
13
16
|
export default class LinkMark extends Mark {
|
|
14
17
|
/**
|
|
15
18
|
* @param {import("../view/unitView.js").default} unitView
|
|
@@ -17,30 +20,27 @@ export default class LinkMark extends Mark {
|
|
|
17
20
|
constructor(unitView) {
|
|
18
21
|
super(unitView);
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
orient: "vertical",
|
|
42
|
-
})
|
|
43
|
-
);
|
|
23
|
+
this.augmentDefaultProperties({
|
|
24
|
+
x: 0.0,
|
|
25
|
+
x2: undefined,
|
|
26
|
+
y: 0.0,
|
|
27
|
+
y2: undefined,
|
|
28
|
+
size: 1.0,
|
|
29
|
+
color: "black",
|
|
30
|
+
opacity: 1.0,
|
|
31
|
+
|
|
32
|
+
segments: 101, // Performance is affected more by the fill rate, i.e. number of pixels
|
|
33
|
+
arcHeightFactor: 1.0,
|
|
34
|
+
minArcHeight: 1.5,
|
|
35
|
+
minPickingSize: 3.0,
|
|
36
|
+
clampApex: false,
|
|
37
|
+
maxChordLength: 50000,
|
|
38
|
+
arcFadingDistance: false,
|
|
39
|
+
noFadingOnPointSelection: true,
|
|
40
|
+
|
|
41
|
+
linkShape: "arc",
|
|
42
|
+
orient: "vertical",
|
|
43
|
+
});
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
46
|
* Only available if "WebGL Draft Extensions" is enabled in chrome://flags
|
|
@@ -53,6 +53,9 @@ export default class LinkMark extends Mark {
|
|
|
53
53
|
);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
+
/**
|
|
57
|
+
* @returns {import("../spec/channel.js").Channel[]}
|
|
58
|
+
*/
|
|
56
59
|
getAttributes() {
|
|
57
60
|
return [
|
|
58
61
|
"uniqueId",
|
|
@@ -62,7 +65,6 @@ export default class LinkMark extends Mark {
|
|
|
62
65
|
"y",
|
|
63
66
|
"y2",
|
|
64
67
|
"size",
|
|
65
|
-
"height",
|
|
66
68
|
"color",
|
|
67
69
|
"opacity",
|
|
68
70
|
];
|
|
@@ -137,7 +139,7 @@ export default class LinkMark extends Mark {
|
|
|
137
139
|
this.registerMarkUniformValue(
|
|
138
140
|
"uSegmentBreaks",
|
|
139
141
|
props.segments,
|
|
140
|
-
(x) => x
|
|
142
|
+
(x) => x
|
|
141
143
|
);
|
|
142
144
|
this.registerMarkUniformValue(
|
|
143
145
|
"uNoFadingOnPointSelection",
|
|
@@ -205,6 +207,14 @@ export default class LinkMark extends Mark {
|
|
|
205
207
|
render(options) {
|
|
206
208
|
const gl = this.gl;
|
|
207
209
|
|
|
210
|
+
const getInstanceVertexCount = () => {
|
|
211
|
+
const breaks = /** @type {Float32Array} */ (
|
|
212
|
+
this.markUniformInfo.uniforms.uSegmentBreaks
|
|
213
|
+
)[0];
|
|
214
|
+
|
|
215
|
+
return (breaks + 1) * 2;
|
|
216
|
+
};
|
|
217
|
+
|
|
208
218
|
return this._baseInstanceExt
|
|
209
219
|
? this.createRenderCallback((offset, count) => {
|
|
210
220
|
// Using the following extension, which, however, is only a draft and
|
|
@@ -214,9 +224,7 @@ export default class LinkMark extends Mark {
|
|
|
214
224
|
this._baseInstanceExt.drawArraysInstancedBaseInstanceWEBGL(
|
|
215
225
|
gl.TRIANGLE_STRIP,
|
|
216
226
|
0,
|
|
217
|
-
|
|
218
|
-
this.markUniformInfo.uniforms.uSegmentBreaks
|
|
219
|
-
)[0] * 2,
|
|
227
|
+
getInstanceVertexCount(),
|
|
220
228
|
count,
|
|
221
229
|
offset
|
|
222
230
|
);
|
|
@@ -252,9 +260,7 @@ export default class LinkMark extends Mark {
|
|
|
252
260
|
gl.drawArraysInstanced(
|
|
253
261
|
gl.TRIANGLE_STRIP,
|
|
254
262
|
0,
|
|
255
|
-
|
|
256
|
-
this.markUniformInfo.uniforms.uSegmentBreaks
|
|
257
|
-
)[0] * 2,
|
|
263
|
+
getInstanceVertexCount(),
|
|
258
264
|
count
|
|
259
265
|
);
|
|
260
266
|
}, options);
|
|
@@ -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&&(!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();}";
|
|
1
|
+
const shader = "out vec4 vColor;out float vSize;out float vNormalLengthInPixels;out float vGamma;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);vGamma=getGammaForColor(color);vSize=paddedSize;setupPicking();}";
|
|
2
2
|
export default shader;
|
package/dist/src/marks/mark.d.ts
CHANGED
|
@@ -12,9 +12,11 @@ export const SAMPLE_FACET_TEXTURE: "SAMPLE_FACET_TEXTURE";
|
|
|
12
12
|
* @callback DrawFunction
|
|
13
13
|
* @param {number} offset
|
|
14
14
|
* @param {number} count
|
|
15
|
-
*
|
|
16
15
|
*/
|
|
17
|
-
|
|
16
|
+
/**
|
|
17
|
+
* @template {MarkProps} [P=MarkProps]
|
|
18
|
+
*/
|
|
19
|
+
export default class Mark<P extends import("../spec/mark.js").MarkProps = import("../spec/mark.js").MarkProps> {
|
|
18
20
|
/**
|
|
19
21
|
* @param {import("../view/unitView.js").default} unitView
|
|
20
22
|
*/
|
|
@@ -69,25 +71,28 @@ export default class Mark {
|
|
|
69
71
|
protected markUniformsAltered: boolean;
|
|
70
72
|
/** @type {RangeMap<any>} keep track of facet locations within the vertex array */
|
|
71
73
|
rangeMap: RangeMap<any>;
|
|
72
|
-
|
|
73
|
-
defaultProperties: import("../spec/mark.js").MarkProps;
|
|
74
|
+
defaultProperties: P;
|
|
74
75
|
/**
|
|
75
76
|
* A properties object that contains the configured mark properties or
|
|
76
77
|
* default values as fallback.
|
|
77
78
|
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
80
|
-
* @type {Partial<MarkProps>}
|
|
79
|
+
* @type {P}
|
|
81
80
|
* @readonly
|
|
82
81
|
*/
|
|
83
|
-
readonly properties:
|
|
82
|
+
readonly properties: P;
|
|
83
|
+
/**
|
|
84
|
+
* @param {Partial<P>} props
|
|
85
|
+
* @protected
|
|
86
|
+
*/
|
|
87
|
+
protected augmentDefaultProperties(props: Partial<P>): void;
|
|
84
88
|
get opaque(): boolean;
|
|
85
89
|
/**
|
|
86
90
|
* Returns attribute info for WebGL attributes that match visual channels.
|
|
87
91
|
*
|
|
88
|
-
* @returns {
|
|
92
|
+
* @returns {import("../spec/channel.js").Channel[]}
|
|
93
|
+
* @protected
|
|
89
94
|
*/
|
|
90
|
-
getAttributes():
|
|
95
|
+
protected getAttributes(): import("../spec/channel.js").Channel[];
|
|
91
96
|
/**
|
|
92
97
|
* @returns {Channel[]}
|
|
93
98
|
*/
|
|
@@ -107,10 +112,10 @@ export default class Mark {
|
|
|
107
112
|
* Handles dynamic properties that are not bound to uniforms but need
|
|
108
113
|
* to trigger a graphics update, i.e., rebuild the vertex buffer.
|
|
109
114
|
*
|
|
110
|
-
* @param {(keyof
|
|
115
|
+
* @param {(keyof P)[]} props
|
|
111
116
|
* @protected
|
|
112
117
|
*/
|
|
113
|
-
protected setupExprRefsNeedingGraphicsUpdate(props: (keyof
|
|
118
|
+
protected setupExprRefsNeedingGraphicsUpdate(props: (keyof P)[]): void;
|
|
114
119
|
/**
|
|
115
120
|
* Returns the encoding spec supplemented with mark's default encodings
|
|
116
121
|
*
|
|
@@ -118,7 +123,7 @@ export default class Mark {
|
|
|
118
123
|
*/
|
|
119
124
|
get encoding(): import("../spec/channel.js").Encoding;
|
|
120
125
|
getContext(): import("../types/viewContext.js").default;
|
|
121
|
-
getType():
|
|
126
|
+
getType(): "link" | "rect" | "text" | "point" | "rule";
|
|
122
127
|
initializeData(): void;
|
|
123
128
|
/**
|
|
124
129
|
* Initialize encoders that encode fields of the data (or constants) to
|
|
@@ -195,9 +200,6 @@ export default class Mark {
|
|
|
195
200
|
isReady(): import("twgl.js").ProgramInfo;
|
|
196
201
|
/**
|
|
197
202
|
* Returns true if this mark instance participates in picking.
|
|
198
|
-
*
|
|
199
|
-
* TODO: Check if tooltip is enabled,
|
|
200
|
-
* TODO: Check if selection (when it's implemented) is enabled
|
|
201
203
|
*/
|
|
202
204
|
isPickingParticipant(): boolean;
|
|
203
205
|
/**
|
|
@@ -234,6 +236,7 @@ export default class Mark {
|
|
|
234
236
|
/**
|
|
235
237
|
* @param {DrawFunction} draw A function that draws a range of vertices
|
|
236
238
|
* @param {import("./mark.js").MarkRenderingOptions} options
|
|
239
|
+
* @returns {function():void}
|
|
237
240
|
*/
|
|
238
241
|
createRenderCallback(draw: DrawFunction, options: import("./mark.js").MarkRenderingOptions): () => void;
|
|
239
242
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":";AAoDA,0DAA2D;AAC3D,0DAA2D;AAE3D
|
|
1
|
+
{"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"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"}
|
package/dist/src/marks/mark.js
CHANGED
|
@@ -64,7 +64,10 @@ export const SAMPLE_FACET_TEXTURE = "SAMPLE_FACET_TEXTURE";
|
|
|
64
64
|
* @callback DrawFunction
|
|
65
65
|
* @param {number} offset
|
|
66
66
|
* @param {number} count
|
|
67
|
-
|
|
67
|
+
*/
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* @template {MarkProps} [P=MarkProps]
|
|
68
71
|
*/
|
|
69
72
|
export default class Mark {
|
|
70
73
|
/**
|
|
@@ -146,9 +149,8 @@ export default class Mark {
|
|
|
146
149
|
/** @type {RangeMap<any>} keep track of facet locations within the vertex array */
|
|
147
150
|
this.rangeMap = new RangeMap();
|
|
148
151
|
|
|
149
|
-
// TODO: Implement https://vega.github.io/vega-lite/docs/config.html
|
|
150
|
-
/** @type {
|
|
151
|
-
this.defaultProperties = {
|
|
152
|
+
// TODO: Implement config: https://vega.github.io/vega-lite/docs/config.html
|
|
153
|
+
this.defaultProperties = /** @type {P} */ ({
|
|
152
154
|
get clip() {
|
|
153
155
|
// TODO: Cache once the scales have been resolved
|
|
154
156
|
// TODO: Only check channels that are used
|
|
@@ -169,25 +171,34 @@ export default class Mark {
|
|
|
169
171
|
* This property is intended for internal usage.
|
|
170
172
|
*/
|
|
171
173
|
minBufferSize: 0,
|
|
172
|
-
};
|
|
174
|
+
});
|
|
173
175
|
|
|
174
176
|
/**
|
|
175
177
|
* A properties object that contains the configured mark properties or
|
|
176
178
|
* default values as fallback.
|
|
177
179
|
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
* @type {Partial<MarkProps>}
|
|
180
|
+
* @type {P}
|
|
181
181
|
* @readonly
|
|
182
182
|
*/
|
|
183
183
|
this.properties = coalesceProperties(
|
|
184
184
|
typeof this.unitView.spec.mark == "object"
|
|
185
|
-
? () => /** @type {
|
|
186
|
-
: () => /** @type {
|
|
185
|
+
? () => /** @type {P} */ (this.unitView.spec.mark)
|
|
186
|
+
: () => /** @type {P} */ ({}),
|
|
187
187
|
() => this.defaultProperties
|
|
188
188
|
);
|
|
189
189
|
}
|
|
190
190
|
|
|
191
|
+
/**
|
|
192
|
+
* @param {Partial<P>} props
|
|
193
|
+
* @protected
|
|
194
|
+
*/
|
|
195
|
+
augmentDefaultProperties(props) {
|
|
196
|
+
Object.defineProperties(
|
|
197
|
+
this.defaultProperties,
|
|
198
|
+
Object.getOwnPropertyDescriptors(props)
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
191
202
|
get opaque() {
|
|
192
203
|
return false;
|
|
193
204
|
}
|
|
@@ -195,7 +206,8 @@ export default class Mark {
|
|
|
195
206
|
/**
|
|
196
207
|
* Returns attribute info for WebGL attributes that match visual channels.
|
|
197
208
|
*
|
|
198
|
-
* @returns {
|
|
209
|
+
* @returns {import("../spec/channel.js").Channel[]}
|
|
210
|
+
* @protected
|
|
199
211
|
*/
|
|
200
212
|
getAttributes() {
|
|
201
213
|
// override
|
|
@@ -251,7 +263,7 @@ export default class Mark {
|
|
|
251
263
|
* Handles dynamic properties that are not bound to uniforms but need
|
|
252
264
|
* to trigger a graphics update, i.e., rebuild the vertex buffer.
|
|
253
265
|
*
|
|
254
|
-
* @param {(keyof
|
|
266
|
+
* @param {(keyof P)[]} props
|
|
255
267
|
* @protected
|
|
256
268
|
*/
|
|
257
269
|
setupExprRefsNeedingGraphicsUpdate(props) {
|
|
@@ -951,13 +963,12 @@ export default class Mark {
|
|
|
951
963
|
|
|
952
964
|
/**
|
|
953
965
|
* Returns true if this mark instance participates in picking.
|
|
954
|
-
*
|
|
955
|
-
* TODO: Check if tooltip is enabled,
|
|
956
|
-
* TODO: Check if selection (when it's implemented) is enabled
|
|
957
966
|
*/
|
|
958
967
|
isPickingParticipant() {
|
|
959
|
-
|
|
960
|
-
|
|
968
|
+
if (
|
|
969
|
+
this.properties.tooltip === null &&
|
|
970
|
+
!this.unitView.paramMediator.hasPointSelections()
|
|
971
|
+
) {
|
|
961
972
|
// Disabled
|
|
962
973
|
return false;
|
|
963
974
|
}
|
|
@@ -1137,13 +1148,16 @@ export default class Mark {
|
|
|
1137
1148
|
/**
|
|
1138
1149
|
* @param {DrawFunction} draw A function that draws a range of vertices
|
|
1139
1150
|
* @param {import("./mark.js").MarkRenderingOptions} options
|
|
1151
|
+
* @returns {function():void}
|
|
1140
1152
|
*/
|
|
1141
1153
|
createRenderCallback(draw, options) {
|
|
1142
1154
|
if (!this.bufferInfo) {
|
|
1143
|
-
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1155
|
+
// This happens if the layout is computed before the data flow has propagated.
|
|
1156
|
+
// However, it's not a big deal, because this will be called again at the end
|
|
1157
|
+
// of the initialization process.
|
|
1158
|
+
|
|
1159
|
+
// Return no operation
|
|
1160
|
+
return () => undefined;
|
|
1147
1161
|
}
|
|
1148
1162
|
|
|
1149
1163
|
// eslint-disable-next-line consistent-this
|
|
@@ -1270,14 +1284,14 @@ export default class Mark {
|
|
|
1270
1284
|
// Because glViewport accepts only integers, we subtract the rounding
|
|
1271
1285
|
// errors from xyOffsets to guarantee that graphics in clipped
|
|
1272
1286
|
// and non-clipped viewports align correctly
|
|
1273
|
-
const roundedCoords =
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1287
|
+
const roundedCoords =
|
|
1288
|
+
/** @type {[number, number, number, number]} */ (
|
|
1289
|
+
physicalGlCoords.map((x) => Math.floor(x))
|
|
1290
|
+
);
|
|
1291
|
+
const xError = physicalGlCoords[0] - roundedCoords[0];
|
|
1292
|
+
const yError = physicalGlCoords[1] - roundedCoords[1];
|
|
1277
1293
|
|
|
1278
|
-
// @ts-ignore
|
|
1279
1294
|
gl.viewport(...roundedCoords);
|
|
1280
|
-
// @ts-ignore
|
|
1281
1295
|
gl.scissor(...roundedCoords);
|
|
1282
1296
|
gl.enable(gl.SCISSOR_TEST);
|
|
1283
1297
|
|
|
@@ -18,6 +18,31 @@ export function fixStroke(encoding: import("../spec/channel.js").Encoding, fille
|
|
|
18
18
|
* @param {boolean} filled
|
|
19
19
|
*/
|
|
20
20
|
export function fixFill(encoding: import("../spec/channel.js").Encoding, filled: boolean): void;
|
|
21
|
+
/**
|
|
22
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
23
|
+
* @returns {props is import("../spec/mark.js").PointProps}
|
|
24
|
+
*/
|
|
25
|
+
export function isPointProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").PointProps;
|
|
26
|
+
/**
|
|
27
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
28
|
+
* @returns {props is import("../spec/mark.js").RectProps}
|
|
29
|
+
*/
|
|
30
|
+
export function isRectProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").RectProps;
|
|
31
|
+
/**
|
|
32
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
33
|
+
* @returns {props is import("../spec/mark.js").RuleProps}
|
|
34
|
+
*/
|
|
35
|
+
export function isRuleProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").RuleProps;
|
|
36
|
+
/**
|
|
37
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
38
|
+
* @returns {props is import("../spec/mark.js").TextProps}
|
|
39
|
+
*/
|
|
40
|
+
export function isTextProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").TextProps;
|
|
41
|
+
/**
|
|
42
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
43
|
+
* @returns {props is import("../spec/mark.js").LinkProps}
|
|
44
|
+
*/
|
|
45
|
+
export function isLinkProps(props: import("../spec/mark.js").MarkProps): props is import("../spec/mark.js").LinkProps;
|
|
21
46
|
export type Encoding = import("../spec/channel.js").Encoding;
|
|
22
47
|
export type Channel = import("../spec/channel.js").Channel;
|
|
23
48
|
//# sourceMappingURL=markUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markUtils.d.ts","sourceRoot":"","sources":["../../../src/marks/markUtils.js"],"names":[],"mappings":"AAMA;;;;GAIG;AAEH;;;GAGG;AACH,wCAHW,QAAQ,WACR,OAAO,oBAAoB,EAAE,wBAAwB,QAoD/D;AAED;;;GAGG;AACH,oCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;AAED;;;GAGG;AACH,kCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;
|
|
1
|
+
{"version":3,"file":"markUtils.d.ts","sourceRoot":"","sources":["../../../src/marks/markUtils.js"],"names":[],"mappings":"AAMA;;;;GAIG;AAEH;;;GAGG;AACH,wCAHW,QAAQ,WACR,OAAO,oBAAoB,EAAE,wBAAwB,QAoD/D;AAED;;;GAGG;AACH,oCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;AAED;;;GAGG;AACH,kCAHW,OAAO,oBAAoB,EAAE,QAAQ,UACrC,OAAO,QAyBjB;AAED;;;GAGG;AACH,oCAHW,OAAO,iBAAiB,EAAE,SAAS,iDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;AAED;;;GAGG;AACH,mCAHW,OAAO,iBAAiB,EAAE,SAAS,gDAK7C;uBA5JY,OAAO,oBAAoB,EAAE,QAAQ;sBACrC,OAAO,oBAAoB,EAAE,OAAO"}
|
|
@@ -37,7 +37,7 @@ export function fixPositional(encoding, channel) {
|
|
|
37
37
|
if (!secondary) {
|
|
38
38
|
if (primary.type == "quantitative") {
|
|
39
39
|
// Bar plot, anchor the other end to zero
|
|
40
|
-
secondary = { datum: 0 };
|
|
40
|
+
secondary = { datum: 0, contributesToScaleDomain: false };
|
|
41
41
|
} else {
|
|
42
42
|
secondary = { ...primary };
|
|
43
43
|
|
|
@@ -123,3 +123,43 @@ export function fixFill(encoding, filled) {
|
|
|
123
123
|
}
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
129
|
+
* @returns {props is import("../spec/mark.js").PointProps}
|
|
130
|
+
*/
|
|
131
|
+
export function isPointProps(props) {
|
|
132
|
+
return props.type === "point";
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
137
|
+
* @returns {props is import("../spec/mark.js").RectProps}
|
|
138
|
+
*/
|
|
139
|
+
export function isRectProps(props) {
|
|
140
|
+
return props.type === "point";
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
145
|
+
* @returns {props is import("../spec/mark.js").RuleProps}
|
|
146
|
+
*/
|
|
147
|
+
export function isRuleProps(props) {
|
|
148
|
+
return props.type === "point";
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
153
|
+
* @returns {props is import("../spec/mark.js").TextProps}
|
|
154
|
+
*/
|
|
155
|
+
export function isTextProps(props) {
|
|
156
|
+
return props.type === "point";
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* @param {import("../spec/mark.js").MarkProps} props
|
|
161
|
+
* @returns {props is import("../spec/mark.js").LinkProps}
|
|
162
|
+
*/
|
|
163
|
+
export function isLinkProps(props) {
|
|
164
|
+
return props.type === "point";
|
|
165
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const shader = "layout(std140)uniform Mark{/***The stroke should only grow inwards,e.g,the diameter/outline is not affected by the stroke width.*Thus,a point that has a zero size has no visible stroke. This allows strokes to be used with*geometric zoom,etc.*/uniform bool uInwardStroke;uniform mediump float uScaleFactor;uniform mediump float uZoomLevel;uniform highp float uSemanticThreshold;uniform mediump float uGradientStrength;\n#pragma markUniforms\n};";
|
|
1
|
+
const shader = "layout(std140)uniform Mark{/***The stroke should only grow inwards,e.g,the diameter/outline is not affected by the stroke width.*Thus,a point that has a zero size has no visible stroke. This allows strokes to be used with*geometric zoom,etc.*/uniform bool uInwardStroke;uniform float uMinPickingSize;uniform mediump float uScaleFactor;uniform mediump float uZoomLevel;uniform highp float uSemanticThreshold;uniform mediump float uGradientStrength;\n#pragma markUniforms\n};";
|
|
2
2
|
export default shader;
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @extends {Mark<import("../spec/mark.js").PointProps>}
|
|
3
|
+
*/
|
|
4
|
+
export default class PointMark extends Mark<import("../spec/mark.js").PointProps> {
|
|
5
|
+
/**
|
|
6
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
7
|
+
*/
|
|
8
|
+
constructor(unitView: import("../view/unitView.js").default);
|
|
2
9
|
sampledSemanticScores: Float32Array;
|
|
3
10
|
getSemanticThreshold(): number;
|
|
4
11
|
#private;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/marks/point.js"],"names":[],"mappings":"AAmBA;
|
|
1
|
+
{"version":3,"file":"point.d.ts","sourceRoot":"","sources":["../../../src/marks/point.js"],"names":[],"mappings":"AAmBA;;GAEG;AACH;IAGI;;OAEG;IACH,sBAFW,OAAO,qBAAqB,EAAE,OAAO,EA6C/C;IA0EO,oCAMC;IAkET,+BAkBC;;CAgDJ;iBAhRgB,WAAW"}
|