@genome-spy/core 0.49.0 → 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 +2617 -2593
- package/dist/bundle/index.js +91 -91
- package/dist/schema.json +1752 -1090
- 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 +18 -16
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +34 -23
- 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 +128 -82
- package/dist/src/spec/view.d.ts +2 -7
- 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/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/viewUtils.d.ts +1 -1
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -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
|
/**
|
|
@@ -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
|
}
|
|
@@ -1270,14 +1281,14 @@ export default class Mark {
|
|
|
1270
1281
|
// Because glViewport accepts only integers, we subtract the rounding
|
|
1271
1282
|
// errors from xyOffsets to guarantee that graphics in clipped
|
|
1272
1283
|
// and non-clipped viewports align correctly
|
|
1273
|
-
const roundedCoords =
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1284
|
+
const roundedCoords =
|
|
1285
|
+
/** @type {[number, number, number, number]} */ (
|
|
1286
|
+
physicalGlCoords.map((x) => Math.floor(x))
|
|
1287
|
+
);
|
|
1288
|
+
const xError = physicalGlCoords[0] - roundedCoords[0];
|
|
1289
|
+
const yError = physicalGlCoords[1] - roundedCoords[1];
|
|
1277
1290
|
|
|
1278
|
-
// @ts-ignore
|
|
1279
1291
|
gl.viewport(...roundedCoords);
|
|
1280
|
-
// @ts-ignore
|
|
1281
1292
|
gl.scissor(...roundedCoords);
|
|
1282
1293
|
gl.enable(gl.SCISSOR_TEST);
|
|
1283
1294
|
|
|
@@ -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"}
|
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",
|
|
@@ -173,6 +177,7 @@ 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() {
|
|
@@ -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"}
|