@deck.gl/extensions 9.4.0-alpha.2 → 9.4.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/clip/clip-extension.d.ts +3 -0
- package/dist/clip/clip-extension.d.ts.map +1 -1
- package/dist/clip/clip-extension.js +7 -0
- package/dist/clip/clip-extension.js.map +1 -1
- package/dist/dist.dev.js +2195 -142
- package/dist/fill-style/fill-style-extension.d.ts +38 -6
- package/dist/fill-style/fill-style-extension.d.ts.map +1 -1
- package/dist/fill-style/fill-style-extension.js +88 -10
- package/dist/fill-style/fill-style-extension.js.map +1 -1
- package/dist/fill-style/procedural-pattern.d.ts +65 -0
- package/dist/fill-style/procedural-pattern.d.ts.map +1 -0
- package/dist/fill-style/procedural-pattern.js +135 -0
- package/dist/fill-style/procedural-pattern.js.map +1 -0
- package/dist/fill-style/shader-module.d.ts +13 -4
- package/dist/fill-style/shader-module.d.ts.map +1 -1
- package/dist/fill-style/shader-module.js +212 -21
- package/dist/fill-style/shader-module.js.map +1 -1
- package/dist/index.cjs +3484 -215
- package/dist/index.cjs.map +3 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/mask/shader-module.d.ts +1 -0
- package/dist/mask/shader-module.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.d.ts +49 -6
- package/dist/path-style/path-style-extension.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.js +237 -37
- package/dist/path-style/path-style-extension.js.map +1 -1
- package/dist/path-style/shaders.glsl.d.ts +30 -1
- package/dist/path-style/shaders.glsl.d.ts.map +1 -1
- package/dist/path-style/shaders.glsl.js +136 -21
- package/dist/path-style/shaders.glsl.js.map +1 -1
- package/dist/terrain/shader-module.d.ts +17 -2
- package/dist/terrain/shader-module.d.ts.map +1 -1
- package/dist/utils/debug.d.ts.map +1 -1
- package/dist.min.js +1251 -96
- package/package.json +6 -6
- package/src/clip/clip-extension.ts +15 -1
- package/src/fill-style/fill-style-extension.ts +135 -13
- package/src/fill-style/procedural-pattern.ts +203 -0
- package/src/fill-style/shader-module.ts +233 -23
- package/src/index.ts +10 -1
- package/src/path-style/path-style-extension.ts +350 -44
- package/src/path-style/shaders.glsl.ts +268 -27
|
@@ -2,11 +2,31 @@
|
|
|
2
2
|
// SPDX-License-Identifier: MIT
|
|
3
3
|
// Copyright (c) vis.gl contributors
|
|
4
4
|
import { project, fp64LowPart } from '@deck.gl/core';
|
|
5
|
+
// Common-space size of one atlas texel: the equator measures 40,000km and spans 512 common units
|
|
6
|
+
const FILL_UV_SCALE = 512 / 40000000;
|
|
7
|
+
/** Common-space size of one atlas texel, i.e. what turns the pixel size of a frame into the size
|
|
8
|
+
* of one tile in common space. */
|
|
9
|
+
function getPatternUnitScale(sizeUnits, viewport) {
|
|
10
|
+
switch (sizeUnits) {
|
|
11
|
+
case 'pixels':
|
|
12
|
+
// Following the zoom exactly would rescale the pattern on every fractional zoom change,
|
|
13
|
+
// which never lets the tiling settle. The pattern is re-anchored once per zoom level
|
|
14
|
+
// instead, and within a level stays within a factor of sqrt(2) of its nominal size.
|
|
15
|
+
return 2 ** -Math.round(viewport.zoom);
|
|
16
|
+
case 'common':
|
|
17
|
+
return 1;
|
|
18
|
+
default:
|
|
19
|
+
return FILL_UV_SCALE;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
5
22
|
const uniformBlock = /* glsl */ `\
|
|
6
23
|
layout(std140) uniform fillUniforms {
|
|
7
24
|
vec2 patternTextureSize;
|
|
25
|
+
float patternUnitScale;
|
|
8
26
|
bool patternEnabled;
|
|
9
27
|
bool patternMask;
|
|
28
|
+
bool procedural;
|
|
29
|
+
bool flipY;
|
|
10
30
|
vec2 uvCoordinateOrigin;
|
|
11
31
|
vec2 uvCoordinateOrigin64Low;
|
|
12
32
|
} fill;
|
|
@@ -15,13 +35,20 @@ layout(std140) uniform fillUniforms {
|
|
|
15
35
|
* fill pattern shader module
|
|
16
36
|
*/
|
|
17
37
|
const patternVs = /* glsl */ `
|
|
38
|
+
uniform sampler2D fill_patternTexture;
|
|
39
|
+
|
|
18
40
|
in vec4 fillPatternFrames;
|
|
19
41
|
in float fillPatternScales;
|
|
20
42
|
in vec2 fillPatternOffsets;
|
|
43
|
+
in vec4 fillPatternBackgroundColors;
|
|
21
44
|
|
|
22
45
|
out vec2 fill_uv;
|
|
23
46
|
out vec4 fill_patternBounds;
|
|
24
47
|
out vec4 fill_patternPlacement;
|
|
48
|
+
out vec4 fill_backgroundColor;
|
|
49
|
+
out float fill_patternCoordinateScale;
|
|
50
|
+
flat out vec4 fill_patternParams0;
|
|
51
|
+
flat out vec4 fill_patternParams1;
|
|
25
52
|
`;
|
|
26
53
|
const vs = `
|
|
27
54
|
${uniformBlock}
|
|
@@ -32,9 +59,136 @@ uniform sampler2D fill_patternTexture;
|
|
|
32
59
|
|
|
33
60
|
in vec4 fill_patternBounds;
|
|
34
61
|
in vec4 fill_patternPlacement;
|
|
62
|
+
in vec4 fill_backgroundColor;
|
|
35
63
|
in vec2 fill_uv;
|
|
64
|
+
in float fill_patternCoordinateScale;
|
|
65
|
+
flat in vec4 fill_patternParams0;
|
|
66
|
+
flat in vec4 fill_patternParams1;
|
|
67
|
+
|
|
68
|
+
const float FILL_PATTERN_HATCH = 1.0;
|
|
69
|
+
const float FILL_PATTERN_CROSS_HATCH = 2.0;
|
|
70
|
+
const float FILL_PATTERN_DOTS = 3.0;
|
|
71
|
+
|
|
72
|
+
float fill_getPatternCoordinate(vec2 axis, float period, float offset) {
|
|
73
|
+
float coordinateScale = max(abs(fill_patternCoordinateScale), 1.0e-20);
|
|
74
|
+
vec2 coordinateOrigin = fill.uvCoordinateOrigin;
|
|
75
|
+
vec2 coordinateOffset = fill.uvCoordinateOrigin64Low + fill_uv;
|
|
76
|
+
float yDirection = fill.flipY ? 1.0 : -1.0;
|
|
77
|
+
coordinateOrigin.y *= yDirection;
|
|
78
|
+
coordinateOffset.y *= yDirection;
|
|
79
|
+
|
|
80
|
+
// Reduce the high part before adding the local offset to retain precision in large coordinates.
|
|
81
|
+
float highPart = mod(dot(coordinateOrigin, axis) / coordinateScale, period);
|
|
82
|
+
float lowPart = dot(coordinateOffset, axis) / coordinateScale;
|
|
83
|
+
return mod(highPart + lowPart + offset * period, period);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
vec2 fill_getPatternCoords(
|
|
87
|
+
vec2 axis0,
|
|
88
|
+
vec2 axis1,
|
|
89
|
+
vec2 period,
|
|
90
|
+
vec2 offset
|
|
91
|
+
) {
|
|
92
|
+
return vec2(
|
|
93
|
+
fill_getPatternCoordinate(axis0, period.x, offset.x),
|
|
94
|
+
fill_getPatternCoordinate(axis1, period.y, offset.y)
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
float fill_getScreenSpaceAlpha(float signedDistance) {
|
|
99
|
+
float distanceDerivative = fwidth(signedDistance);
|
|
100
|
+
if (distanceDerivative == 0.0) {
|
|
101
|
+
return signedDistance <= 0.0 ? 1.0 : 0.0;
|
|
102
|
+
}
|
|
103
|
+
// Normalize the SDF to screen pixels so the coverage ramp is independent of pattern units.
|
|
104
|
+
float distanceInPixels = signedDistance / distanceDerivative;
|
|
105
|
+
return 1.0 - smoothstep(-0.5, 0.5, distanceInPixels);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
float fill_getLineAlpha(float position, float center, float period, float strokeWidth) {
|
|
109
|
+
float distanceToLine = abs(mod(position - center + period * 0.5, period) - period * 0.5);
|
|
110
|
+
return fill_getScreenSpaceAlpha(distanceToLine - strokeWidth * 0.5);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
float fill_getHatchAlpha(float angle, float strokeWidth, vec2 gaps, bool alternating) {
|
|
114
|
+
vec2 lineDirection = vec2(cos(angle), sin(angle));
|
|
115
|
+
vec2 lineNormal = vec2(-lineDirection.y, lineDirection.x);
|
|
116
|
+
float period = alternating
|
|
117
|
+
? strokeWidth * 2.0 + gaps.x + gaps.y
|
|
118
|
+
: strokeWidth + gaps.x;
|
|
119
|
+
float offset = dot(fill_patternPlacement.xy, lineNormal);
|
|
120
|
+
float position = fill_getPatternCoordinate(lineNormal, period, offset);
|
|
121
|
+
float alpha = fill_getLineAlpha(position, 0.0, period, strokeWidth);
|
|
122
|
+
if (alternating) {
|
|
123
|
+
alpha = max(
|
|
124
|
+
alpha,
|
|
125
|
+
fill_getLineAlpha(position, strokeWidth + gaps.x, period, strokeWidth)
|
|
126
|
+
);
|
|
127
|
+
}
|
|
128
|
+
return alpha;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
float fill_getDotAlpha(float angle, float skew, float radius, float gap) {
|
|
132
|
+
vec2 axis0 = vec2(cos(angle), sin(angle));
|
|
133
|
+
float axis1Angle = angle + 1.5707963267948966 - skew;
|
|
134
|
+
vec2 axis1 = vec2(cos(axis1Angle), sin(axis1Angle));
|
|
135
|
+
float determinant = axis0.x * axis1.y - axis0.y * axis1.x;
|
|
136
|
+
|
|
137
|
+
// The reciprocal basis maps common coordinates into the skewed dot lattice.
|
|
138
|
+
vec2 reciprocal0 = vec2(axis1.y, -axis1.x) / determinant;
|
|
139
|
+
vec2 reciprocal1 = vec2(-axis0.y, axis0.x) / determinant;
|
|
140
|
+
float period = radius * 2.0 + gap;
|
|
141
|
+
vec2 latticeCoords = fill_getPatternCoords(
|
|
142
|
+
reciprocal0,
|
|
143
|
+
reciprocal1,
|
|
144
|
+
vec2(period),
|
|
145
|
+
fill_patternPlacement.xy
|
|
146
|
+
);
|
|
147
|
+
vec2 cellOffset = mod(latticeCoords + period * 0.5, period) - period * 0.5;
|
|
148
|
+
float distanceToDotSquared = 1.0e20;
|
|
149
|
+
// In a skewed lattice the closest dot is not necessarily in the independently wrapped cell.
|
|
150
|
+
// Include adjacent cells to keep the repeated distance field continuous at cell boundaries.
|
|
151
|
+
for (int x = -1; x <= 1; x++) {
|
|
152
|
+
for (int y = -1; y <= 1; y++) {
|
|
153
|
+
vec2 neighborOffset = cellOffset + vec2(float(x), float(y)) * period;
|
|
154
|
+
vec2 dotOffset = axis0 * neighborOffset.x + axis1 * neighborOffset.y;
|
|
155
|
+
distanceToDotSquared = min(distanceToDotSquared, dot(dotOffset, dotOffset));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
float distanceToDot = sqrt(distanceToDotSquared);
|
|
159
|
+
return fill_getScreenSpaceAlpha(distanceToDot - radius);
|
|
160
|
+
}
|
|
36
161
|
|
|
37
|
-
|
|
162
|
+
float fill_getProceduralPatternAlpha() {
|
|
163
|
+
float patternType = fill_patternParams0.x;
|
|
164
|
+
float size = fill_patternParams0.y;
|
|
165
|
+
vec2 gaps = fill_patternParams0.zw;
|
|
166
|
+
vec2 angles = fill_patternParams1.xy;
|
|
167
|
+
float elementCount = fill_patternParams1.z;
|
|
168
|
+
|
|
169
|
+
if (patternType == FILL_PATTERN_HATCH) {
|
|
170
|
+
return fill_getHatchAlpha(angles.x, size, gaps, elementCount == 2.0);
|
|
171
|
+
}
|
|
172
|
+
if (patternType == FILL_PATTERN_CROSS_HATCH) {
|
|
173
|
+
return max(
|
|
174
|
+
fill_getHatchAlpha(angles.x, size, gaps, false),
|
|
175
|
+
fill_getHatchAlpha(angles.y, size, gaps, false)
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
if (patternType == FILL_PATTERN_DOTS) {
|
|
179
|
+
return fill_getDotAlpha(angles.x, angles.y, size, gaps.x);
|
|
180
|
+
}
|
|
181
|
+
return 1.0;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Draw the pattern over the background fill (Porter-Duff source-over)
|
|
185
|
+
vec4 fill_blendOverBackground(vec4 pattern, vec4 background) {
|
|
186
|
+
if (background.a == 0.0 || layer.opacity == 0.0) return pattern;
|
|
187
|
+
float patternAlpha = pattern.a / layer.opacity;
|
|
188
|
+
float blendedAlpha = patternAlpha + background.a * (1.0 - patternAlpha);
|
|
189
|
+
vec3 blendedRGB = mix(background.rgb, pattern.rgb, patternAlpha / blendedAlpha);
|
|
190
|
+
return vec4(blendedRGB, blendedAlpha * layer.opacity);
|
|
191
|
+
}
|
|
38
192
|
`;
|
|
39
193
|
const fs = `
|
|
40
194
|
${uniformBlock}
|
|
@@ -42,28 +196,55 @@ ${patternFs}
|
|
|
42
196
|
`;
|
|
43
197
|
const inject = {
|
|
44
198
|
'vs:DECKGL_FILTER_GL_POSITION': /* glsl */ `
|
|
45
|
-
fill_uv = geometry.position.xy;
|
|
46
|
-
`,
|
|
47
|
-
'vs:DECKGL_FILTER_COLOR': /* glsl */ `
|
|
48
199
|
if (fill.patternEnabled) {
|
|
49
|
-
fill_patternBounds = fillPatternFrames / vec4(fill.patternTextureSize, fill.patternTextureSize);
|
|
50
200
|
fill_patternPlacement.xy = fillPatternOffsets;
|
|
51
|
-
|
|
201
|
+
fill_backgroundColor = fillPatternBackgroundColors;
|
|
202
|
+
if (fill.procedural) {
|
|
203
|
+
fill_uv = geometry.position.xy;
|
|
204
|
+
fill_patternCoordinateScale = fill.patternUnitScale * fillPatternScales;
|
|
205
|
+
int texelIndex = int(fillPatternFrames.x) * 4;
|
|
206
|
+
fill_patternParams0 = vec4(
|
|
207
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex, 0), 0).rg,
|
|
208
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex + 1, 0), 0).rg
|
|
209
|
+
);
|
|
210
|
+
fill_patternParams1 = vec4(
|
|
211
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex + 2, 0), 0).rg,
|
|
212
|
+
texelFetch(fill_patternTexture, ivec2(texelIndex + 3, 0), 0).rg
|
|
213
|
+
);
|
|
214
|
+
} else {
|
|
215
|
+
fill_patternBounds = fillPatternFrames / vec4(fill.patternTextureSize, fill.patternTextureSize);
|
|
216
|
+
vec2 patternFrameCommon = fill.patternUnitScale * fillPatternScales * fillPatternFrames.zw;
|
|
217
|
+
// Reduce the coordinate origin to within one tile before adding the vertex position. The
|
|
218
|
+
// origin is large in common space, and fp32 cannot carry the sum at full precision.
|
|
219
|
+
vec2 origin = mod(fill.uvCoordinateOrigin, patternFrameCommon) + fill.uvCoordinateOrigin64Low;
|
|
220
|
+
fill_uv = (origin + geometry.position.xy) / patternFrameCommon;
|
|
221
|
+
// Pattern atlases use top-left coordinates, so reverse common-space Y in bottom-left views.
|
|
222
|
+
fill_uv.y *= fill.flipY ? 1.0 : -1.0;
|
|
223
|
+
fill_uv += fillPatternOffsets;
|
|
224
|
+
}
|
|
52
225
|
}
|
|
53
226
|
`,
|
|
54
227
|
'fs:DECKGL_FILTER_COLOR': /* glsl */ `
|
|
55
228
|
if (fill.patternEnabled) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
229
|
+
if (fill.procedural) {
|
|
230
|
+
color.a *= fill_getProceduralPatternAlpha();
|
|
231
|
+
} else {
|
|
232
|
+
vec2 patternUV = fract(fill_uv);
|
|
233
|
+
vec2 texCoords = fill_patternBounds.xy + fill_patternBounds.zw * patternUV;
|
|
59
234
|
|
|
60
|
-
|
|
235
|
+
// Tiling is emulated by wrapping the coordinate, so texCoords jumps from the end of the
|
|
236
|
+
// frame back to its start once per tile, leading to the wrong mip level being selected,
|
|
237
|
+
// which leads to artifacts at pattern edges. fill_uv is continuous across the primitive,
|
|
238
|
+
// meaning that the correct mip level is always selected
|
|
239
|
+
vec4 grad = fill_patternBounds.zwzw * vec4(dFdx(fill_uv), dFdy(fill_uv));
|
|
240
|
+
vec4 patternColor = textureGrad(fill_patternTexture, texCoords, grad.xy, grad.zw);
|
|
61
241
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
242
|
+
color.a *= patternColor.a;
|
|
243
|
+
if (!fill.patternMask) {
|
|
244
|
+
color.rgb = patternColor.rgb;
|
|
245
|
+
}
|
|
66
246
|
}
|
|
247
|
+
color = fill_blendOverBackground(color, fill_backgroundColor);
|
|
67
248
|
}
|
|
68
249
|
`
|
|
69
250
|
};
|
|
@@ -79,17 +260,24 @@ function getPatternUniforms(opts) {
|
|
|
79
260
|
uniforms.patternTextureSize = [fillPatternTexture.width, fillPatternTexture.height];
|
|
80
261
|
}
|
|
81
262
|
if ('project' in opts) {
|
|
82
|
-
const { fillPatternMask = true, fillPatternEnabled = true } = opts;
|
|
263
|
+
const { fillPatternMask = true, fillPatternEnabled = true, fillPatternSizeUnits = 'meters', fillPatternCommonFrame = null, procedural = false } = opts;
|
|
83
264
|
const projectUniforms = project.getUniforms(opts.project);
|
|
84
265
|
const { commonOrigin: coordinateOriginCommon } = projectUniforms;
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
];
|
|
89
|
-
|
|
90
|
-
|
|
266
|
+
const unitScale = getPatternUnitScale(fillPatternSizeUnits, opts.project.viewport);
|
|
267
|
+
// Improve the precision of the uv mapping by removing an integer multiple of the
|
|
268
|
+
// pattern frames. This results in the same result, without wobbling at high zooms
|
|
269
|
+
const origin = [coordinateOriginCommon[0], coordinateOriginCommon[1]];
|
|
270
|
+
if (fillPatternCommonFrame) {
|
|
271
|
+
origin[0] %= unitScale * fillPatternCommonFrame[0];
|
|
272
|
+
origin[1] %= unitScale * fillPatternCommonFrame[1];
|
|
273
|
+
}
|
|
274
|
+
uniforms.uvCoordinateOrigin = origin;
|
|
275
|
+
uniforms.uvCoordinateOrigin64Low = [fp64LowPart(origin[0]), fp64LowPart(origin[1])];
|
|
276
|
+
uniforms.patternUnitScale = unitScale;
|
|
91
277
|
uniforms.patternMask = fillPatternMask;
|
|
92
278
|
uniforms.patternEnabled = fillPatternEnabled;
|
|
279
|
+
uniforms.procedural = procedural;
|
|
280
|
+
uniforms.flipY = opts.project.viewport?.flipY ?? false;
|
|
93
281
|
}
|
|
94
282
|
return uniforms;
|
|
95
283
|
}
|
|
@@ -102,8 +290,11 @@ export const patternShaders = {
|
|
|
102
290
|
getUniforms: getPatternUniforms,
|
|
103
291
|
uniformTypes: {
|
|
104
292
|
patternTextureSize: 'vec2<f32>',
|
|
293
|
+
patternUnitScale: 'f32',
|
|
105
294
|
patternEnabled: 'i32',
|
|
106
295
|
patternMask: 'i32',
|
|
296
|
+
procedural: 'i32',
|
|
297
|
+
flipY: 'i32',
|
|
107
298
|
uvCoordinateOrigin: 'vec2<f32>',
|
|
108
299
|
uvCoordinateOrigin64Low: 'vec2<f32>'
|
|
109
300
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shader-module.js","sourceRoot":"","sources":["../../src/fill-style/shader-module.ts"],"names":[],"mappings":"AAAA,UAAU;AACV,+BAA+B;AAC/B,oCAAoC;AAGpC,OAAO,EAAC,OAAO,EAAE,WAAW,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"shader-module.js","sourceRoot":"","sources":["../../src/fill-style/shader-module.ts"],"names":[],"mappings":"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"}
|