@deck.gl/extensions 9.0.0-beta.8 → 9.0.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/collision-filter/collision-filter-effect.d.ts +4 -2
- package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-effect.js +10 -9
- package/dist/collision-filter/collision-filter-pass.d.ts +3 -2
- package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -1
- package/dist/collision-filter/collision-filter-pass.js +5 -7
- package/dist/data-filter/data-filter-extension.d.ts +1 -1
- package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
- package/dist/data-filter/data-filter-extension.js +1 -1
- package/dist/dist.dev.js +475 -479
- package/dist/fill-style/fill-style-extension.d.ts +2 -30
- package/dist/fill-style/fill-style-extension.d.ts.map +1 -1
- package/dist/fill-style/fill-style-extension.js +1 -3
- package/dist/index.cjs +427 -421
- package/dist/index.cjs.map +4 -4
- package/dist/mask/mask-effect.d.ts +5 -4
- package/dist/mask/mask-effect.d.ts.map +1 -1
- package/dist/mask/mask-effect.js +9 -11
- package/dist/mask/mask-pass.d.ts +4 -3
- package/dist/mask/mask-pass.d.ts.map +1 -1
- package/dist/mask/mask-pass.js +17 -9
- package/dist/path-style/path-style-extension.d.ts.map +1 -1
- package/dist/path-style/path-style-extension.js +1 -0
- package/dist/terrain/terrain-effect.d.ts +4 -5
- package/dist/terrain/terrain-effect.d.ts.map +1 -1
- package/dist/terrain/terrain-effect.js +6 -15
- package/dist/terrain/terrain-pass.d.ts +1 -0
- package/dist/terrain/terrain-pass.d.ts.map +1 -1
- package/dist/terrain/terrain-pass.js +24 -16
- package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
- package/dist/terrain/terrain-picking-pass.js +9 -8
- package/dist/terrain/utils.d.ts.map +1 -1
- package/dist/terrain/utils.js +1 -0
- package/dist.min.js +23 -23
- package/package.json +7 -7
- package/src/collision-filter/collision-filter-effect.ts +22 -22
- package/src/collision-filter/collision-filter-pass.ts +7 -11
- package/src/data-filter/data-filter-extension.ts +1 -1
- package/src/fill-style/fill-style-extension.ts +3 -4
- package/src/mask/mask-effect.ts +30 -19
- package/src/mask/mask-pass.ts +22 -16
- package/src/path-style/path-style-extension.ts +1 -0
- package/src/terrain/terrain-effect.ts +9 -18
- package/src/terrain/terrain-pass.ts +37 -34
- package/src/terrain/terrain-picking-pass.ts +19 -23
- package/src/terrain/utils.ts +1 -0
package/src/mask/mask-effect.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
Layer,
|
|
3
|
+
Viewport,
|
|
4
|
+
Effect,
|
|
5
|
+
EffectContext,
|
|
6
|
+
PreRenderOptions,
|
|
7
|
+
CoordinateSystem,
|
|
8
|
+
log
|
|
9
|
+
} from '@deck.gl/core';
|
|
10
|
+
import type {Texture} from '@luma.gl/core';
|
|
3
11
|
import {equals} from '@math.gl/core';
|
|
4
12
|
import MaskPass from './mask-pass';
|
|
5
13
|
import {joinLayerBounds, getRenderBounds, makeViewport, Bounds} from '../utils/projection-utils';
|
|
@@ -7,7 +15,7 @@ import {joinLayerBounds, getRenderBounds, makeViewport, Bounds} from '../utils/p
|
|
|
7
15
|
|
|
8
16
|
type Mask = {
|
|
9
17
|
/** The channel index */
|
|
10
|
-
index:
|
|
18
|
+
index: 0 | 1 | 2 | 3;
|
|
11
19
|
bounds: Bounds;
|
|
12
20
|
coordinateOrigin: [number, number, number];
|
|
13
21
|
coordinateSystem: CoordinateSystem;
|
|
@@ -15,7 +23,7 @@ type Mask = {
|
|
|
15
23
|
|
|
16
24
|
type Channel = {
|
|
17
25
|
id: string;
|
|
18
|
-
index:
|
|
26
|
+
index: 0 | 1 | 2 | 3;
|
|
19
27
|
layers: Layer[];
|
|
20
28
|
bounds: Bounds | null;
|
|
21
29
|
maskBounds: Bounds;
|
|
@@ -42,17 +50,25 @@ export default class MaskEffect implements Effect {
|
|
|
42
50
|
private maskMap?: Texture;
|
|
43
51
|
private lastViewport?: Viewport;
|
|
44
52
|
|
|
45
|
-
|
|
46
|
-
device
|
|
47
|
-
|
|
48
|
-
|
|
53
|
+
setup({device}: EffectContext) {
|
|
54
|
+
this.dummyMaskMap = device.createTexture({
|
|
55
|
+
width: 1,
|
|
56
|
+
height: 1
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
this.maskPass = new MaskPass(device, {id: 'default-mask'});
|
|
60
|
+
this.maskMap = this.maskPass.maskMap;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
preRender({
|
|
64
|
+
layers,
|
|
65
|
+
layerFilter,
|
|
66
|
+
viewports,
|
|
67
|
+
onViewportActive,
|
|
68
|
+
views,
|
|
69
|
+
isPicking
|
|
70
|
+
}: PreRenderOptions): MaskPreRenderStats {
|
|
49
71
|
let didRender = false;
|
|
50
|
-
if (!this.dummyMaskMap) {
|
|
51
|
-
this.dummyMaskMap = device.createTexture({
|
|
52
|
-
width: 1,
|
|
53
|
-
height: 1
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
72
|
|
|
57
73
|
if (isPicking) {
|
|
58
74
|
// Do not update on picking pass
|
|
@@ -67,11 +83,6 @@ export default class MaskEffect implements Effect {
|
|
|
67
83
|
}
|
|
68
84
|
this.masks = {};
|
|
69
85
|
|
|
70
|
-
if (!this.maskPass) {
|
|
71
|
-
this.maskPass = new MaskPass(device, {id: 'default-mask'});
|
|
72
|
-
this.maskMap = this.maskPass.maskMap;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
86
|
// Map layers to channels
|
|
76
87
|
const channelMap = this._sortMaskChannels(maskLayers);
|
|
77
88
|
// TODO - support multiple views
|
package/src/mask/mask-pass.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import type {Device, Framebuffer, Texture} from '@luma.gl/core';
|
|
2
|
-
import {
|
|
3
|
-
import {_LayersPass as LayersPass, LayersPassRenderOptions} from '@deck.gl/core';
|
|
1
|
+
import type {Device, Framebuffer, RenderPipelineParameters, Texture} from '@luma.gl/core';
|
|
2
|
+
import {Layer, _LayersPass as LayersPass, LayersPassRenderOptions, Viewport} from '@deck.gl/core';
|
|
4
3
|
|
|
5
4
|
type MaskPassRenderOptions = LayersPassRenderOptions & {
|
|
6
5
|
/** The channel to render into, 0:red, 1:green, 2:blue, 3:alpha */
|
|
7
|
-
channel:
|
|
6
|
+
channel: 0 | 1 | 2 | 3;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
const MASK_BLENDING: RenderPipelineParameters = {
|
|
10
|
+
blendColorOperation: 'subtract',
|
|
11
|
+
blendColorSrcFactor: 'zero',
|
|
12
|
+
blendColorDstFactor: 'one',
|
|
13
|
+
blendAlphaOperation: 'subtract',
|
|
14
|
+
blendAlphaSrcFactor: 'zero',
|
|
15
|
+
blendAlphaDstFactor: 'one'
|
|
8
16
|
};
|
|
9
17
|
|
|
10
18
|
export default class MaskPass extends LayersPass {
|
|
@@ -37,20 +45,18 @@ export default class MaskPass extends LayersPass {
|
|
|
37
45
|
}
|
|
38
46
|
|
|
39
47
|
render(options: MaskPassRenderOptions) {
|
|
40
|
-
const colorMask =
|
|
41
|
-
colorMask[options.channel] = true;
|
|
48
|
+
const colorMask = 2 ** options.channel;
|
|
42
49
|
const clearColor = [255, 255, 255, 255];
|
|
50
|
+
super.render({...options, clearColor, colorMask, target: this.fbo, pass: 'mask'});
|
|
51
|
+
}
|
|
43
52
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
},
|
|
52
|
-
() => super.render({...options, clearColor, target: this.fbo, pass: 'mask'})
|
|
53
|
-
);
|
|
53
|
+
protected getLayerParameters(layer: Layer<{}>, layerIndex: number, viewport: Viewport) {
|
|
54
|
+
return {
|
|
55
|
+
...layer.props.parameters,
|
|
56
|
+
blend: true,
|
|
57
|
+
depthTest: false,
|
|
58
|
+
...MASK_BLENDING
|
|
59
|
+
};
|
|
54
60
|
}
|
|
55
61
|
|
|
56
62
|
shouldDrawLayer(layer) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {log
|
|
1
|
+
import {Texture} from '@luma.gl/core';
|
|
2
|
+
import {log} from '@deck.gl/core';
|
|
3
3
|
|
|
4
4
|
import {terrainModule, TerrainModuleSettings} from './shader-module';
|
|
5
5
|
import {TerrainCover} from './terrain-cover';
|
|
@@ -7,7 +7,7 @@ import {TerrainPass} from './terrain-pass';
|
|
|
7
7
|
import {TerrainPickingPass, TerrainPickingPassRenderOptions} from './terrain-picking-pass';
|
|
8
8
|
import {HeightMapBuilder} from './height-map-builder';
|
|
9
9
|
|
|
10
|
-
import type {Effect, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';
|
|
10
|
+
import type {Effect, EffectContext, PreRenderOptions, Layer, Viewport} from '@deck.gl/core';
|
|
11
11
|
|
|
12
12
|
/** Class to manage terrain effect */
|
|
13
13
|
export class TerrainEffect implements Effect {
|
|
@@ -28,7 +28,7 @@ export class TerrainEffect implements Effect {
|
|
|
28
28
|
/** One texture for each primitive terrain layer, into which the draped layers render */
|
|
29
29
|
private terrainCovers: Map<string, TerrainCover> = new Map();
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
setup({device, deck}: EffectContext) {
|
|
32
32
|
this.dummyHeightMap = device.createTexture({
|
|
33
33
|
width: 1,
|
|
34
34
|
height: 1,
|
|
@@ -43,21 +43,10 @@ export class TerrainEffect implements Effect {
|
|
|
43
43
|
log.warn('Terrain offset mode is not supported by this browser')();
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
deck._addDefaultShaderModule(terrainModule);
|
|
47
47
|
}
|
|
48
48
|
|
|
49
|
-
preRender(
|
|
50
|
-
if (!this.dummyHeightMap) {
|
|
51
|
-
// First time this effect is in use, initialize resources and register the shader module
|
|
52
|
-
this.initialize(device);
|
|
53
|
-
for (const layer of opts.layers) {
|
|
54
|
-
// Force the terrain layer (and its descendents) to rebuild their models with the new shader
|
|
55
|
-
if (layer.props.operation.includes('terrain')) {
|
|
56
|
-
layer.setChangeFlags({extensionsChanged: true});
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
49
|
+
preRender(opts: PreRenderOptions): void {
|
|
61
50
|
// @ts-expect-error pickZ only defined in picking pass
|
|
62
51
|
if (opts.pickZ) {
|
|
63
52
|
// Do not update if picking attributes
|
|
@@ -106,7 +95,7 @@ export class TerrainEffect implements Effect {
|
|
|
106
95
|
};
|
|
107
96
|
}
|
|
108
97
|
|
|
109
|
-
cleanup(): void {
|
|
98
|
+
cleanup({deck}: EffectContext): void {
|
|
110
99
|
if (this.dummyHeightMap) {
|
|
111
100
|
this.dummyHeightMap.delete();
|
|
112
101
|
this.dummyHeightMap = undefined;
|
|
@@ -121,6 +110,8 @@ export class TerrainEffect implements Effect {
|
|
|
121
110
|
terrainCover.delete();
|
|
122
111
|
}
|
|
123
112
|
this.terrainCovers.clear();
|
|
113
|
+
|
|
114
|
+
deck._removeDefaultShaderModule(terrainModule);
|
|
124
115
|
}
|
|
125
116
|
|
|
126
117
|
private _updateHeightMap(terrainLayers: Layer[], viewport: Viewport, opts: PreRenderOptions) {
|
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {RenderPipelineParameters} from '@luma.gl/core';
|
|
2
2
|
import {Layer, Viewport, _LayersPass as LayersPass, LayersPassRenderOptions} from '@deck.gl/core';
|
|
3
3
|
import type {HeightMapBuilder} from './height-map-builder';
|
|
4
4
|
import type {TerrainCover} from './terrain-cover';
|
|
5
5
|
|
|
6
6
|
export type TerrainPassRenderOptions = LayersPassRenderOptions;
|
|
7
7
|
|
|
8
|
+
const TERRAIN_BLENDING: RenderPipelineParameters = {
|
|
9
|
+
blendColorOperation: 'max',
|
|
10
|
+
blendColorSrcFactor: 'one',
|
|
11
|
+
blendColorDstFactor: 'one',
|
|
12
|
+
blendAlphaOperation: 'max',
|
|
13
|
+
blendAlphaSrcFactor: 'one',
|
|
14
|
+
blendAlphaDstFactor: 'one'
|
|
15
|
+
};
|
|
16
|
+
|
|
8
17
|
/** Renders textures used by the TerrainEffect render pass */
|
|
9
18
|
export class TerrainPass extends LayersPass {
|
|
10
19
|
getRenderableLayers(viewport: Viewport, opts: TerrainPassRenderOptions): Layer[] {
|
|
@@ -32,24 +41,15 @@ export class TerrainPass extends LayersPass {
|
|
|
32
41
|
|
|
33
42
|
target.resize(viewport);
|
|
34
43
|
|
|
35
|
-
this.
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.render({
|
|
45
|
-
...opts,
|
|
46
|
-
target,
|
|
47
|
-
pass: 'terrain-height-map',
|
|
48
|
-
layers: opts.layers!,
|
|
49
|
-
viewports: [viewport],
|
|
50
|
-
effects: []
|
|
51
|
-
})
|
|
52
|
-
);
|
|
44
|
+
this.render({
|
|
45
|
+
...opts,
|
|
46
|
+
target,
|
|
47
|
+
pass: 'terrain-height-map',
|
|
48
|
+
layers: opts.layers!,
|
|
49
|
+
viewports: [viewport],
|
|
50
|
+
effects: [],
|
|
51
|
+
clearColor: [0, 0, 0, 0]
|
|
52
|
+
});
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
renderTerrainCover(terrainCover: TerrainCover, opts: Partial<TerrainPassRenderOptions>) {
|
|
@@ -64,20 +64,23 @@ export class TerrainPass extends LayersPass {
|
|
|
64
64
|
const layers = terrainCover.filterLayers(opts.layers!);
|
|
65
65
|
target.resize(viewport);
|
|
66
66
|
|
|
67
|
-
this.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
67
|
+
this.render({
|
|
68
|
+
...opts,
|
|
69
|
+
target,
|
|
70
|
+
pass: `terrain-cover-${terrainCover.id}`,
|
|
71
|
+
layers,
|
|
72
|
+
effects: [],
|
|
73
|
+
viewports: [viewport],
|
|
74
|
+
clearColor: [0, 0, 0, 0]
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
protected getLayerParameters(layer: Layer<{}>, layerIndex: number, viewport: Viewport) {
|
|
79
|
+
return {
|
|
80
|
+
...layer.props.parameters,
|
|
81
|
+
blend: true,
|
|
82
|
+
depthTest: false,
|
|
83
|
+
...(layer.props.operation.includes('terrain') && TERRAIN_BLENDING)
|
|
84
|
+
};
|
|
82
85
|
}
|
|
83
86
|
}
|
|
@@ -53,33 +53,29 @@ export class TerrainPickingPass extends PickLayersPass {
|
|
|
53
53
|
}
|
|
54
54
|
target.resize(viewport);
|
|
55
55
|
|
|
56
|
-
this.
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
// not the viewport of the terrain cover. Culling is already done by `terrainCover.filterLayers`
|
|
70
|
-
cullRect: undefined,
|
|
71
|
-
deviceRect: viewport,
|
|
72
|
-
pickZ: false
|
|
73
|
-
})
|
|
74
|
-
);
|
|
56
|
+
this.render({
|
|
57
|
+
...opts,
|
|
58
|
+
pickingFBO: target,
|
|
59
|
+
pass: `terrain-cover-picking-${terrainCover.id}`,
|
|
60
|
+
layers,
|
|
61
|
+
effects: [],
|
|
62
|
+
viewports: [viewport],
|
|
63
|
+
// Disable the default culling because TileLayer would cull sublayers based on the screen viewport,
|
|
64
|
+
// not the viewport of the terrain cover. Culling is already done by `terrainCover.filterLayers`
|
|
65
|
+
cullRect: undefined,
|
|
66
|
+
deviceRect: viewport,
|
|
67
|
+
pickZ: false
|
|
68
|
+
});
|
|
75
69
|
}
|
|
76
70
|
|
|
77
71
|
protected getLayerParameters(layer: Layer, layerIndex: number, viewport: Viewport): any {
|
|
72
|
+
let parameters: any;
|
|
78
73
|
if (this.drawParameters[layer.id]) {
|
|
79
|
-
|
|
74
|
+
parameters = this.drawParameters[layer.id];
|
|
75
|
+
} else {
|
|
76
|
+
parameters = super.getLayerParameters(layer, layerIndex, viewport);
|
|
77
|
+
parameters.blend = true;
|
|
80
78
|
}
|
|
81
|
-
|
|
82
|
-
parameters.blend = true;
|
|
83
|
-
return parameters;
|
|
79
|
+
return {...parameters, depthTest: false};
|
|
84
80
|
}
|
|
85
81
|
}
|