@deck.gl/extensions 9.0.0-beta.9 → 9.0.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.
Files changed (46) hide show
  1. package/dist/collision-filter/collision-filter-effect.d.ts +4 -2
  2. package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -1
  3. package/dist/collision-filter/collision-filter-effect.js +10 -9
  4. package/dist/collision-filter/collision-filter-pass.d.ts +3 -2
  5. package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -1
  6. package/dist/collision-filter/collision-filter-pass.js +5 -7
  7. package/dist/data-filter/data-filter-extension.d.ts +1 -1
  8. package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
  9. package/dist/data-filter/data-filter-extension.js +1 -1
  10. package/dist/dist.dev.js +475 -479
  11. package/dist/fill-style/fill-style-extension.d.ts +2 -30
  12. package/dist/fill-style/fill-style-extension.d.ts.map +1 -1
  13. package/dist/fill-style/fill-style-extension.js +1 -3
  14. package/dist/index.cjs +427 -421
  15. package/dist/index.cjs.map +4 -4
  16. package/dist/mask/mask-effect.d.ts +5 -4
  17. package/dist/mask/mask-effect.d.ts.map +1 -1
  18. package/dist/mask/mask-effect.js +9 -11
  19. package/dist/mask/mask-pass.d.ts +4 -3
  20. package/dist/mask/mask-pass.d.ts.map +1 -1
  21. package/dist/mask/mask-pass.js +17 -9
  22. package/dist/path-style/path-style-extension.d.ts.map +1 -1
  23. package/dist/path-style/path-style-extension.js +1 -0
  24. package/dist/terrain/terrain-effect.d.ts +4 -5
  25. package/dist/terrain/terrain-effect.d.ts.map +1 -1
  26. package/dist/terrain/terrain-effect.js +6 -15
  27. package/dist/terrain/terrain-pass.d.ts +1 -0
  28. package/dist/terrain/terrain-pass.d.ts.map +1 -1
  29. package/dist/terrain/terrain-pass.js +24 -16
  30. package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
  31. package/dist/terrain/terrain-picking-pass.js +9 -8
  32. package/dist/terrain/utils.d.ts.map +1 -1
  33. package/dist/terrain/utils.js +1 -0
  34. package/dist.min.js +23 -23
  35. package/package.json +5 -5
  36. package/src/collision-filter/collision-filter-effect.ts +22 -22
  37. package/src/collision-filter/collision-filter-pass.ts +7 -11
  38. package/src/data-filter/data-filter-extension.ts +1 -1
  39. package/src/fill-style/fill-style-extension.ts +3 -4
  40. package/src/mask/mask-effect.ts +30 -19
  41. package/src/mask/mask-pass.ts +22 -16
  42. package/src/path-style/path-style-extension.ts +1 -0
  43. package/src/terrain/terrain-effect.ts +9 -18
  44. package/src/terrain/terrain-pass.ts +37 -34
  45. package/src/terrain/terrain-picking-pass.ts +19 -23
  46. package/src/terrain/utils.ts +1 -0
@@ -1,5 +1,13 @@
1
- import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';
2
- import type {Device, Texture} from '@luma.gl/core';
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: number;
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: number;
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
- preRender(
46
- device: Device,
47
- {layers, layerFilter, viewports, onViewportActive, views, isPicking}: PreRenderOptions
48
- ): MaskPreRenderStats {
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
@@ -1,10 +1,18 @@
1
- import type {Device, Framebuffer, Texture} from '@luma.gl/core';
2
- import {GL} from '@luma.gl/constants';
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: number;
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 = [false, false, false, false];
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
- return this.device.withParametersWebGL(
45
- {
46
- blend: true,
47
- blendFunc: [GL.ZERO, GL.ONE],
48
- blendEquation: GL.FUNC_SUBTRACT,
49
- colorMask,
50
- depthTest: false
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) {
@@ -177,6 +177,7 @@ export default class PathStyleExtension extends LayerExtension<PathStyleExtensio
177
177
 
178
178
  prevP = p;
179
179
  }
180
+ result[geometrySize - 1] = 0;
180
181
  return result;
181
182
  }
182
183
  }
@@ -1,5 +1,5 @@
1
- import {Device, Texture} from '@luma.gl/core';
2
- import {log, getShaderAssembler} from '@deck.gl/core';
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
- initialize(device: Device) {
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
- getShaderAssembler().addDefaultModule(terrainModule);
46
+ deck._addDefaultShaderModule(terrainModule);
47
47
  }
48
48
 
49
- preRender(device: Device, opts: PreRenderOptions): void {
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 {GL} from '@luma.gl/constants';
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.device.withParametersWebGL(
36
- {
37
- clearColor: [0, 0, 0, 0],
38
- blend: true,
39
- blendFunc: [GL.ONE, GL.ONE],
40
- blendEquation: GL.MAX,
41
- depthTest: false
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.device.withParametersWebGL(
68
- {
69
- clearColor: [0, 0, 0, 0],
70
- depthTest: false
71
- },
72
- () =>
73
- this.render({
74
- ...opts,
75
- target,
76
- pass: `terrain-cover-${terrainCover.id}`,
77
- layers,
78
- effects: [],
79
- viewports: [viewport]
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.device.withParametersWebGL(
57
- {
58
- depthTest: false
59
- },
60
- () =>
61
- this.render({
62
- ...opts,
63
- pickingFBO: target,
64
- pass: `terrain-cover-picking-${terrainCover.id}`,
65
- layers,
66
- effects: [],
67
- viewports: [viewport],
68
- // Disable the default culling because TileLayer would cull sublayers based on the screen viewport,
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
- return this.drawParameters[layer.id];
74
+ parameters = this.drawParameters[layer.id];
75
+ } else {
76
+ parameters = super.getLayerParameters(layer, layerIndex, viewport);
77
+ parameters.blend = true;
80
78
  }
81
- const parameters = super.getLayerParameters(layer, layerIndex, viewport);
82
- parameters.blend = true;
83
- return parameters;
79
+ return {...parameters, depthTest: false};
84
80
  }
85
81
  }
@@ -12,6 +12,7 @@ export function createRenderTarget(
12
12
  id: opts.id,
13
13
  colorAttachments: [
14
14
  device.createTexture({
15
+ id: opts.id,
15
16
  ...(opts.float && {
16
17
  format: 'rgba32float',
17
18
  type: GL.FLOAT