@deck.gl/extensions 8.10.0-alpha.2 → 8.10.0-alpha.5
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/LICENSE +1 -1
- package/dist/dist.dev.js +38 -660
- package/dist/es5/brushing/brushing-extension.js +48 -54
- package/dist/es5/brushing/brushing-extension.js.map +1 -1
- package/dist/es5/clip/clip-extension.js +32 -37
- package/dist/es5/clip/clip-extension.js.map +1 -1
- package/dist/es5/collision-filter/collision-filter-effect.js +217 -225
- package/dist/es5/collision-filter/collision-filter-effect.js.map +1 -1
- package/dist/es5/collision-filter/collision-filter-extension.js +49 -56
- package/dist/es5/collision-filter/collision-filter-extension.js.map +1 -1
- package/dist/es5/collision-filter/collision-filter-pass.js +31 -34
- package/dist/es5/collision-filter/collision-filter-pass.js.map +1 -1
- package/dist/es5/data-filter/data-filter-extension.js +126 -132
- package/dist/es5/data-filter/data-filter-extension.js.map +1 -1
- package/dist/es5/fill-style/fill-style-extension.js +101 -109
- package/dist/es5/fill-style/fill-style-extension.js.map +1 -1
- package/dist/es5/fp64/fp64-extension.js +12 -16
- package/dist/es5/fp64/fp64-extension.js.map +1 -1
- package/dist/es5/mask/mask-effect.js +208 -216
- package/dist/es5/mask/mask-effect.js.map +1 -1
- package/dist/es5/mask/mask-extension.js +57 -63
- package/dist/es5/mask/mask-extension.js.map +1 -1
- package/dist/es5/mask/mask-pass.js +36 -42
- package/dist/es5/mask/mask-pass.js.map +1 -1
- package/dist/es5/path-style/path-style-extension.js +81 -89
- package/dist/es5/path-style/path-style-extension.js.map +1 -1
- package/dist/es5/terrain/height-map-builder.js +73 -80
- package/dist/es5/terrain/height-map-builder.js.map +1 -1
- package/dist/es5/terrain/terrain-cover.js +155 -162
- package/dist/es5/terrain/terrain-cover.js.map +1 -1
- package/dist/es5/terrain/terrain-effect.js +233 -242
- package/dist/es5/terrain/terrain-effect.js.map +1 -1
- package/dist/es5/terrain/terrain-extension.js +44 -51
- package/dist/es5/terrain/terrain-extension.js.map +1 -1
- package/dist/es5/terrain/terrain-pass.js +61 -65
- package/dist/es5/terrain/terrain-pass.js.map +1 -1
- package/dist/es5/terrain/terrain-picking-pass.js +56 -62
- package/dist/es5/terrain/terrain-picking-pass.js.map +1 -1
- package/dist/esm/brushing/brushing-extension.js +2 -5
- package/dist/esm/brushing/brushing-extension.js.map +1 -1
- package/dist/esm/brushing/shader-module.js +67 -4
- package/dist/esm/brushing/shader-module.js.map +1 -1
- package/dist/esm/clip/clip-extension.js +33 -14
- package/dist/esm/clip/clip-extension.js.map +1 -1
- package/dist/esm/collision-filter/collision-filter-effect.js +10 -19
- package/dist/esm/collision-filter/collision-filter-effect.js.map +1 -1
- package/dist/esm/collision-filter/collision-filter-extension.js +2 -5
- package/dist/esm/collision-filter/collision-filter-extension.js.map +1 -1
- package/dist/esm/collision-filter/shader-module.js +76 -4
- package/dist/esm/collision-filter/shader-module.js.map +1 -1
- package/dist/esm/data-filter/aggregator.js +45 -2
- package/dist/esm/data-filter/aggregator.js.map +1 -1
- package/dist/esm/data-filter/data-filter-extension.js +2 -5
- package/dist/esm/data-filter/data-filter-extension.js.map +1 -1
- package/dist/esm/data-filter/shader-module.js +86 -6
- package/dist/esm/data-filter/shader-module.js.map +1 -1
- package/dist/esm/fill-style/fill-style-extension.js +2 -5
- package/dist/esm/fill-style/fill-style-extension.js.map +1 -1
- package/dist/esm/fill-style/shaders.glsl.js +60 -5
- package/dist/esm/fill-style/shaders.glsl.js.map +1 -1
- package/dist/esm/fp64/fp64-extension.js +1 -3
- package/dist/esm/fp64/fp64-extension.js.map +1 -1
- package/dist/esm/fp64/project64.glsl.js +81 -1
- package/dist/esm/fp64/project64.glsl.js.map +1 -1
- package/dist/esm/mask/mask-effect.js +10 -20
- package/dist/esm/mask/mask-effect.js.map +1 -1
- package/dist/esm/mask/mask-extension.js +3 -6
- package/dist/esm/mask/mask-extension.js.map +1 -1
- package/dist/esm/mask/mask-pass.js +2 -6
- package/dist/esm/mask/mask-pass.js.map +1 -1
- package/dist/esm/mask/shader-module.js +61 -6
- package/dist/esm/mask/shader-module.js.map +1 -1
- package/dist/esm/path-style/path-style-extension.js +2 -5
- package/dist/esm/path-style/path-style-extension.js.map +1 -1
- package/dist/esm/path-style/shaders.glsl.js +79 -8
- package/dist/esm/path-style/shaders.glsl.js.map +1 -1
- package/dist/esm/terrain/height-map-builder.js +8 -17
- package/dist/esm/terrain/height-map-builder.js.map +1 -1
- package/dist/esm/terrain/shader-module.js +59 -7
- package/dist/esm/terrain/shader-module.js.map +1 -1
- package/dist/esm/terrain/terrain-cover.js +11 -22
- package/dist/esm/terrain/terrain-cover.js.map +1 -1
- package/dist/esm/terrain/terrain-effect.js +11 -21
- package/dist/esm/terrain/terrain-effect.js.map +1 -1
- package/dist/esm/terrain/terrain-extension.js +2 -5
- package/dist/esm/terrain/terrain-extension.js.map +1 -1
- package/dist/esm/terrain/terrain-pass.js +1 -1
- package/dist/esm/terrain/terrain-pass.js.map +1 -1
- package/dist/esm/terrain/terrain-picking-pass.js +2 -4
- package/dist/esm/terrain/terrain-picking-pass.js.map +1 -1
- package/dist.min.js +36 -35
- package/package.json +2 -2
- package/typed/brushing/brushing.d.ts +0 -39
- package/typed/brushing/brushing.d.ts.map +0 -1
- package/typed/brushing/brushing.js +0 -83
- package/typed/brushing/shader-module.js +0 -116
- package/typed/clip/clip.d.ts +0 -32
- package/typed/clip/clip.d.ts.map +0 -1
- package/typed/clip/clip.js +0 -114
- package/typed/collide/collide-effect.d.ts +0 -28
- package/typed/collide/collide-effect.d.ts.map +0 -1
- package/typed/collide/collide-pass.d.ts +0 -14
- package/typed/collide/collide-pass.d.ts.map +0 -1
- package/typed/collide/collide.d.ts +0 -41
- package/typed/collide/collide.d.ts.map +0 -1
- package/typed/collide/shader-module.d.ts +0 -4
- package/typed/collide/shader-module.d.ts.map +0 -1
- package/typed/collision-filter/collision-filter.d.ts +0 -41
- package/typed/collision-filter/collision-filter.d.ts.map +0 -1
- package/typed/common/projection-utils.d.ts +0 -27
- package/typed/common/projection-utils.d.ts.map +0 -1
- package/typed/data-filter/aggregator.js +0 -98
- package/typed/data-filter/data-filter.d.ts +0 -90
- package/typed/data-filter/data-filter.d.ts.map +0 -1
- package/typed/data-filter/data-filter.js +0 -159
- package/typed/data-filter/shader-module.js +0 -152
- package/typed/fill-style/fill-style.d.ts +0 -86
- package/typed/fill-style/fill-style.d.ts.map +0 -1
- package/typed/fill-style/fill-style.js +0 -152
- package/typed/fill-style/shaders.glsl.js +0 -95
- package/typed/fp64/fp64.d.ts +0 -8
- package/typed/fp64/fp64.d.ts.map +0 -1
- package/typed/fp64/fp64.js +0 -34
- package/typed/fp64/project64.glsl.js +0 -100
- package/typed/fp64/project64.js +0 -50
- package/typed/index.js +0 -9
- package/typed/mask/mask.d.ts +0 -30
- package/typed/mask/mask.d.ts.map +0 -1
- package/typed/mask/mask.js +0 -48
- package/typed/mask/shader-module.js +0 -73
- package/typed/mask/utils.d.ts +0 -13
- package/typed/mask/utils.d.ts.map +0 -1
- package/typed/path-style/path-style.d.ts +0 -66
- package/typed/path-style/path-style.d.ts.map +0 -1
- package/typed/path-style/path-style.js +0 -107
- package/typed/path-style/shaders.glsl.js +0 -93
- package/typed/terrain/height-map.d.ts +0 -27
- package/typed/terrain/height-map.d.ts.map +0 -1
- package/typed/terrain/shader-module-offset.d.ts +0 -4
- package/typed/terrain/shader-module-offset.d.ts.map +0 -1
- package/typed/terrain/shader-module-source.d.ts +0 -4
- package/typed/terrain/shader-module-source.d.ts.map +0 -1
- package/typed/terrain/terrain.d.ts +0 -21
- package/typed/terrain/terrain.d.ts.map +0 -1
|
@@ -9,10 +9,6 @@ exports.default = void 0;
|
|
|
9
9
|
|
|
10
10
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
11
11
|
|
|
12
|
-
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
13
|
-
|
|
14
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
15
|
-
|
|
16
12
|
var _core = require("@deck.gl/core");
|
|
17
13
|
|
|
18
14
|
var _core2 = require("@luma.gl/core");
|
|
@@ -32,256 +28,252 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len
|
|
|
32
28
|
var MaskEffect = function () {
|
|
33
29
|
function MaskEffect() {
|
|
34
30
|
(0, _classCallCheck2.default)(this, MaskEffect);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
31
|
+
this.id = 'mask-effect';
|
|
32
|
+
this.props = null;
|
|
33
|
+
this.useInPicking = true;
|
|
34
|
+
this.order = 0;
|
|
35
|
+
this.dummyMaskMap = void 0;
|
|
36
|
+
this.channels = [];
|
|
37
|
+
this.masks = null;
|
|
38
|
+
this.maskPass = void 0;
|
|
39
|
+
this.maskMap = void 0;
|
|
40
|
+
this.lastViewport = void 0;
|
|
45
41
|
}
|
|
46
42
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (isPicking) {
|
|
66
|
-
return {
|
|
67
|
-
didRender: didRender
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
var maskLayers = layers.filter(function (l) {
|
|
72
|
-
return l.props.visible && l.props.operation.includes('mask');
|
|
43
|
+
var _proto = MaskEffect.prototype;
|
|
44
|
+
|
|
45
|
+
_proto.preRender = function preRender(gl, _ref) {
|
|
46
|
+
var layers = _ref.layers,
|
|
47
|
+
layerFilter = _ref.layerFilter,
|
|
48
|
+
viewports = _ref.viewports,
|
|
49
|
+
onViewportActive = _ref.onViewportActive,
|
|
50
|
+
views = _ref.views,
|
|
51
|
+
isPicking = _ref.isPicking;
|
|
52
|
+
var didRender = false;
|
|
53
|
+
|
|
54
|
+
if (!this.dummyMaskMap) {
|
|
55
|
+
this.dummyMaskMap = new _core2.Texture2D(gl, {
|
|
56
|
+
width: 1,
|
|
57
|
+
height: 1
|
|
73
58
|
});
|
|
59
|
+
}
|
|
74
60
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
this.masks = {};
|
|
61
|
+
if (isPicking) {
|
|
62
|
+
return {
|
|
63
|
+
didRender: didRender
|
|
64
|
+
};
|
|
65
|
+
}
|
|
84
66
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
});
|
|
89
|
-
this.maskMap = this.maskPass.maskMap;
|
|
90
|
-
}
|
|
67
|
+
var maskLayers = layers.filter(function (l) {
|
|
68
|
+
return l.props.visible && l.props.operation.includes('mask');
|
|
69
|
+
});
|
|
91
70
|
|
|
92
|
-
|
|
71
|
+
if (maskLayers.length === 0) {
|
|
72
|
+
this.masks = null;
|
|
73
|
+
this.channels.length = 0;
|
|
74
|
+
return {
|
|
75
|
+
didRender: didRender
|
|
76
|
+
};
|
|
77
|
+
}
|
|
93
78
|
|
|
94
|
-
|
|
95
|
-
var viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);
|
|
79
|
+
this.masks = {};
|
|
96
80
|
|
|
97
|
-
|
|
98
|
-
|
|
81
|
+
if (!this.maskPass) {
|
|
82
|
+
this.maskPass = new _maskPass.default(gl, {
|
|
83
|
+
id: 'default-mask'
|
|
84
|
+
});
|
|
85
|
+
this.maskMap = this.maskPass.maskMap;
|
|
86
|
+
}
|
|
99
87
|
|
|
100
|
-
|
|
101
|
-
didRender: didRender
|
|
102
|
-
};
|
|
103
|
-
}
|
|
88
|
+
var channelMap = this._sortMaskChannels(maskLayers);
|
|
104
89
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
layerFilter: layerFilter,
|
|
108
|
-
onViewportActive: onViewportActive,
|
|
109
|
-
views: views,
|
|
110
|
-
viewport: viewport,
|
|
111
|
-
viewportChanged: viewportChanged
|
|
112
|
-
});
|
|
90
|
+
var viewport = viewports[0];
|
|
91
|
+
var viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);
|
|
113
92
|
|
|
114
|
-
|
|
115
|
-
|
|
93
|
+
if (viewport.resolution !== undefined) {
|
|
94
|
+
_core.log.warn('MaskExtension is not supported in GlobeView')();
|
|
116
95
|
|
|
117
96
|
return {
|
|
118
97
|
didRender: didRender
|
|
119
98
|
};
|
|
120
99
|
}
|
|
121
|
-
}, {
|
|
122
|
-
key: "_renderChannel",
|
|
123
|
-
value: function _renderChannel(channelInfo, _ref2) {
|
|
124
|
-
var layerFilter = _ref2.layerFilter,
|
|
125
|
-
onViewportActive = _ref2.onViewportActive,
|
|
126
|
-
views = _ref2.views,
|
|
127
|
-
viewport = _ref2.viewport,
|
|
128
|
-
viewportChanged = _ref2.viewportChanged;
|
|
129
|
-
var didRender = false;
|
|
130
|
-
var oldChannelInfo = this.channels[channelInfo.index];
|
|
131
|
-
|
|
132
|
-
if (!oldChannelInfo) {
|
|
133
|
-
return didRender;
|
|
134
|
-
}
|
|
135
100
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
101
|
+
for (var maskId in channelMap) {
|
|
102
|
+
var result = this._renderChannel(channelMap[maskId], {
|
|
103
|
+
layerFilter: layerFilter,
|
|
104
|
+
onViewportActive: onViewportActive,
|
|
105
|
+
views: views,
|
|
106
|
+
viewport: viewport,
|
|
107
|
+
viewportChanged: viewportChanged
|
|
140
108
|
});
|
|
141
|
-
channelInfo.bounds = oldChannelInfo.bounds;
|
|
142
|
-
channelInfo.maskBounds = oldChannelInfo.maskBounds;
|
|
143
|
-
this.channels[channelInfo.index] = channelInfo;
|
|
144
|
-
|
|
145
|
-
if (maskChanged || viewportChanged) {
|
|
146
|
-
this.lastViewport = viewport;
|
|
147
|
-
var layerBounds = (0, _projectionUtils.joinLayerBounds)(channelInfo.layers, viewport);
|
|
148
|
-
channelInfo.bounds = layerBounds && (0, _projectionUtils.getRenderBounds)(layerBounds, viewport);
|
|
149
|
-
|
|
150
|
-
if (maskChanged || !(0, _core3.equals)(channelInfo.bounds, oldChannelInfo.bounds)) {
|
|
151
|
-
var maskPass = this.maskPass,
|
|
152
|
-
maskMap = this.maskMap;
|
|
153
|
-
var maskViewport = layerBounds && (0, _projectionUtils.makeViewport)({
|
|
154
|
-
bounds: channelInfo.bounds,
|
|
155
|
-
viewport: viewport,
|
|
156
|
-
width: maskMap.width,
|
|
157
|
-
height: maskMap.height,
|
|
158
|
-
border: 1
|
|
159
|
-
});
|
|
160
|
-
channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];
|
|
161
|
-
maskPass.render({
|
|
162
|
-
pass: 'mask',
|
|
163
|
-
channel: channelInfo.index,
|
|
164
|
-
layers: channelInfo.layers,
|
|
165
|
-
layerFilter: layerFilter,
|
|
166
|
-
viewports: maskViewport ? [maskViewport] : [],
|
|
167
|
-
onViewportActive: onViewportActive,
|
|
168
|
-
views: views,
|
|
169
|
-
moduleParameters: {
|
|
170
|
-
devicePixelRatio: 1
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
didRender = true;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
109
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
110
|
+
didRender || (didRender = result);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return {
|
|
114
|
+
didRender: didRender
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
_proto._renderChannel = function _renderChannel(channelInfo, _ref2) {
|
|
119
|
+
var layerFilter = _ref2.layerFilter,
|
|
120
|
+
onViewportActive = _ref2.onViewportActive,
|
|
121
|
+
views = _ref2.views,
|
|
122
|
+
viewport = _ref2.viewport,
|
|
123
|
+
viewportChanged = _ref2.viewportChanged;
|
|
124
|
+
var didRender = false;
|
|
125
|
+
var oldChannelInfo = this.channels[channelInfo.index];
|
|
126
|
+
|
|
127
|
+
if (!oldChannelInfo) {
|
|
183
128
|
return didRender;
|
|
184
129
|
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
130
|
+
|
|
131
|
+
var maskChanged = channelInfo === oldChannelInfo || channelInfo.layers.length !== oldChannelInfo.layers.length || channelInfo.layers.some(function (layer, i) {
|
|
132
|
+
return layer !== oldChannelInfo.layers[i] || layer.props.transitions;
|
|
133
|
+
}) || channelInfo.layerBounds.some(function (b, i) {
|
|
134
|
+
return b !== oldChannelInfo.layerBounds[i];
|
|
135
|
+
});
|
|
136
|
+
channelInfo.bounds = oldChannelInfo.bounds;
|
|
137
|
+
channelInfo.maskBounds = oldChannelInfo.maskBounds;
|
|
138
|
+
this.channels[channelInfo.index] = channelInfo;
|
|
139
|
+
|
|
140
|
+
if (maskChanged || viewportChanged) {
|
|
141
|
+
this.lastViewport = viewport;
|
|
142
|
+
var layerBounds = (0, _projectionUtils.joinLayerBounds)(channelInfo.layers, viewport);
|
|
143
|
+
channelInfo.bounds = layerBounds && (0, _projectionUtils.getRenderBounds)(layerBounds, viewport);
|
|
144
|
+
|
|
145
|
+
if (maskChanged || !(0, _core3.equals)(channelInfo.bounds, oldChannelInfo.bounds)) {
|
|
146
|
+
var maskPass = this.maskPass,
|
|
147
|
+
maskMap = this.maskMap;
|
|
148
|
+
var maskViewport = layerBounds && (0, _projectionUtils.makeViewport)({
|
|
149
|
+
bounds: channelInfo.bounds,
|
|
150
|
+
viewport: viewport,
|
|
151
|
+
width: maskMap.width,
|
|
152
|
+
height: maskMap.height,
|
|
153
|
+
border: 1
|
|
154
|
+
});
|
|
155
|
+
channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];
|
|
156
|
+
maskPass.render({
|
|
157
|
+
pass: 'mask',
|
|
158
|
+
channel: channelInfo.index,
|
|
159
|
+
layers: channelInfo.layers,
|
|
160
|
+
layerFilter: layerFilter,
|
|
161
|
+
viewports: maskViewport ? [maskViewport] : [],
|
|
162
|
+
onViewportActive: onViewportActive,
|
|
163
|
+
views: views,
|
|
164
|
+
moduleParameters: {
|
|
165
|
+
devicePixelRatio: 1
|
|
220
166
|
}
|
|
167
|
+
});
|
|
168
|
+
didRender = true;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
221
171
|
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
172
|
+
this.masks[channelInfo.id] = {
|
|
173
|
+
index: channelInfo.index,
|
|
174
|
+
bounds: channelInfo.maskBounds,
|
|
175
|
+
coordinateOrigin: channelInfo.coordinateOrigin,
|
|
176
|
+
coordinateSystem: channelInfo.coordinateSystem
|
|
177
|
+
};
|
|
178
|
+
return didRender;
|
|
179
|
+
};
|
|
225
180
|
|
|
226
|
-
|
|
227
|
-
|
|
181
|
+
_proto._sortMaskChannels = function _sortMaskChannels(maskLayers) {
|
|
182
|
+
var _this = this;
|
|
228
183
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
} catch (err) {
|
|
232
|
-
_iterator.e(err);
|
|
233
|
-
} finally {
|
|
234
|
-
_iterator.f();
|
|
235
|
-
}
|
|
184
|
+
var channelMap = {};
|
|
185
|
+
var channelCount = 0;
|
|
236
186
|
|
|
237
|
-
|
|
238
|
-
|
|
187
|
+
var _iterator = _createForOfIteratorHelper(maskLayers),
|
|
188
|
+
_step;
|
|
239
189
|
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
190
|
+
try {
|
|
191
|
+
var _loop = function _loop() {
|
|
192
|
+
var layer = _step.value;
|
|
193
|
+
var id = layer.root.id;
|
|
194
|
+
var channelInfo = channelMap[id];
|
|
244
195
|
|
|
245
|
-
|
|
246
|
-
|
|
196
|
+
if (!channelInfo) {
|
|
197
|
+
if (++channelCount > 4) {
|
|
198
|
+
_core.log.warn('Too many mask layers. The max supported is 4')();
|
|
247
199
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
200
|
+
return "continue";
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
channelInfo = {
|
|
204
|
+
id: id,
|
|
205
|
+
index: _this.channels.findIndex(function (c) {
|
|
206
|
+
return (c === null || c === void 0 ? void 0 : c.id) === id;
|
|
207
|
+
}),
|
|
208
|
+
layers: [],
|
|
209
|
+
layerBounds: [],
|
|
210
|
+
coordinateOrigin: layer.root.props.coordinateOrigin,
|
|
211
|
+
coordinateSystem: layer.root.props.coordinateSystem
|
|
212
|
+
};
|
|
213
|
+
channelMap[id] = channelInfo;
|
|
253
214
|
}
|
|
254
|
-
}
|
|
255
215
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
}, {
|
|
259
|
-
key: "getModuleParameters",
|
|
260
|
-
value: function getModuleParameters() {
|
|
261
|
-
return {
|
|
262
|
-
maskMap: this.masks ? this.maskMap : this.dummyMaskMap,
|
|
263
|
-
maskChannels: this.masks
|
|
216
|
+
channelInfo.layers.push(layer);
|
|
217
|
+
channelInfo.layerBounds.push(layer.getBounds());
|
|
264
218
|
};
|
|
219
|
+
|
|
220
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
221
|
+
var _ret = _loop();
|
|
222
|
+
|
|
223
|
+
if (_ret === "continue") continue;
|
|
224
|
+
}
|
|
225
|
+
} catch (err) {
|
|
226
|
+
_iterator.e(err);
|
|
227
|
+
} finally {
|
|
228
|
+
_iterator.f();
|
|
265
229
|
}
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
this.
|
|
230
|
+
|
|
231
|
+
for (var i = 0; i < 4; i++) {
|
|
232
|
+
var channelInfo = this.channels[i];
|
|
233
|
+
|
|
234
|
+
if (!channelInfo || !(channelInfo.id in channelMap)) {
|
|
235
|
+
this.channels[i] = null;
|
|
272
236
|
}
|
|
237
|
+
}
|
|
273
238
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
239
|
+
for (var maskId in channelMap) {
|
|
240
|
+
var _channelInfo = channelMap[maskId];
|
|
241
|
+
|
|
242
|
+
if (_channelInfo.index < 0) {
|
|
243
|
+
_channelInfo.index = this.channels.findIndex(function (c) {
|
|
244
|
+
return !c;
|
|
245
|
+
});
|
|
246
|
+
this.channels[_channelInfo.index] = _channelInfo;
|
|
278
247
|
}
|
|
248
|
+
}
|
|
279
249
|
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
250
|
+
return channelMap;
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
_proto.getModuleParameters = function getModuleParameters() {
|
|
254
|
+
return {
|
|
255
|
+
maskMap: this.masks ? this.maskMap : this.dummyMaskMap,
|
|
256
|
+
maskChannels: this.masks
|
|
257
|
+
};
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
_proto.cleanup = function cleanup() {
|
|
261
|
+
if (this.dummyMaskMap) {
|
|
262
|
+
this.dummyMaskMap.delete();
|
|
263
|
+
this.dummyMaskMap = undefined;
|
|
283
264
|
}
|
|
284
|
-
|
|
265
|
+
|
|
266
|
+
if (this.maskPass) {
|
|
267
|
+
this.maskPass.delete();
|
|
268
|
+
this.maskPass = undefined;
|
|
269
|
+
this.maskMap = undefined;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
this.lastViewport = undefined;
|
|
273
|
+
this.masks = null;
|
|
274
|
+
this.channels.length = 0;
|
|
275
|
+
};
|
|
276
|
+
|
|
285
277
|
return MaskEffect;
|
|
286
278
|
}();
|
|
287
279
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/mask/mask-effect.ts"],"names":["MaskEffect","gl","layers","layerFilter","viewports","onViewportActive","views","isPicking","didRender","dummyMaskMap","Texture2D","width","height","maskLayers","filter","l","props","visible","operation","includes","length","masks","channels","maskPass","MaskPass","id","maskMap","channelMap","_sortMaskChannels","viewport","viewportChanged","lastViewport","equals","resolution","undefined","log","warn","maskId","result","_renderChannel","channelInfo","oldChannelInfo","index","maskChanged","some","layer","i","transitions","layerBounds","b","bounds","maskBounds","maskViewport","border","getBounds","render","pass","channel","moduleParameters","devicePixelRatio","coordinateOrigin","coordinateSystem","channelCount","root","findIndex","c","push","maskChannels","delete"],"mappings":"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","sourcesContent":["import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';\nimport {Texture2D} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport MaskPass from './mask-pass';\nimport {joinLayerBounds, getRenderBounds, makeViewport, Bounds} from '../utils/projection-utils';\n// import {debugFBO} from '../utils/debug';\n\ntype Mask = {\n /** The channel index */\n index: number;\n bounds: Bounds;\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\ntype Channel = {\n id: string;\n index: number;\n layers: Layer[];\n bounds: Bounds | null;\n maskBounds: Bounds;\n layerBounds: Bounds[];\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\nexport type MaskPreRenderStats = {\n didRender: boolean;\n};\n\n// Class to manage mask effect\nexport default class MaskEffect implements Effect {\n id = 'mask-effect';\n props = null;\n useInPicking = true;\n order = 0;\n\n private dummyMaskMap?: Texture2D;\n private channels: (Channel | null)[] = [];\n private masks: Record<string, Mask> | null = null;\n private maskPass?: MaskPass;\n private maskMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {layers, layerFilter, viewports, onViewportActive, views, isPicking}: PreRenderOptions\n ): MaskPreRenderStats {\n let didRender = false;\n if (!this.dummyMaskMap) {\n this.dummyMaskMap = new Texture2D(gl, {\n width: 1,\n height: 1\n });\n }\n\n if (isPicking) {\n // Do not update on picking pass\n return {didRender};\n }\n\n const maskLayers = layers.filter(l => l.props.visible && l.props.operation.includes('mask'));\n if (maskLayers.length === 0) {\n this.masks = null;\n this.channels.length = 0;\n return {didRender};\n }\n this.masks = {};\n\n if (!this.maskPass) {\n this.maskPass = new MaskPass(gl, {id: 'default-mask'});\n this.maskMap = this.maskPass.maskMap;\n }\n\n // Map layers to channels\n const channelMap = this._sortMaskChannels(maskLayers);\n // TODO - support multiple views\n const viewport = viewports[0];\n const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);\n\n if (viewport.resolution !== undefined) {\n log.warn('MaskExtension is not supported in GlobeView')();\n return {didRender};\n }\n\n for (const maskId in channelMap) {\n const result = this._renderChannel(channelMap[maskId], {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n didRender ||= result;\n }\n\n // debugFBO(this.maskMap, {opaque: true});\n return {didRender};\n }\n\n /* eslint-disable-next-line complexity */\n private _renderChannel(\n channelInfo: Channel,\n {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ): boolean {\n let didRender = false;\n const oldChannelInfo = this.channels[channelInfo.index];\n if (!oldChannelInfo) {\n return didRender;\n }\n\n const maskChanged =\n // If a channel is new\n channelInfo === oldChannelInfo ||\n // If sublayers have changed\n channelInfo.layers.length !== oldChannelInfo.layers.length ||\n channelInfo.layers.some(\n (layer, i) =>\n // Layer instance is updated\n // Layer props might have changed\n // Undetermined props could have an effect on the output geometry of a mask layer,\n // for example getRadius+updateTriggers, radiusScale, modelMatrix\n layer !== oldChannelInfo.layers[i] ||\n // Some prop is in transition\n layer.props.transitions\n ) ||\n // If a sublayer's positions have been updated, the cached bounds will change shallowly\n channelInfo.layerBounds.some((b, i) => b !== oldChannelInfo.layerBounds[i]);\n\n channelInfo.bounds = oldChannelInfo.bounds;\n channelInfo.maskBounds = oldChannelInfo.maskBounds;\n this.channels[channelInfo.index] = channelInfo;\n\n if (maskChanged || viewportChanged) {\n // Recalculate mask bounds\n this.lastViewport = viewport;\n\n const layerBounds = joinLayerBounds(channelInfo.layers, viewport);\n channelInfo.bounds = layerBounds && getRenderBounds(layerBounds, viewport);\n\n if (maskChanged || !equals(channelInfo.bounds, oldChannelInfo.bounds)) {\n // Rerender mask FBO\n const {maskPass, maskMap} = this;\n\n const maskViewport =\n layerBounds &&\n makeViewport({\n bounds: channelInfo.bounds!,\n viewport,\n width: maskMap.width,\n height: maskMap.height,\n border: 1\n });\n\n channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];\n\n // @ts-ignore (2532) This method is only called from preRender where maskPass is defined\n maskPass.render({\n pass: 'mask',\n channel: channelInfo.index,\n layers: channelInfo.layers,\n layerFilter,\n viewports: maskViewport ? [maskViewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n devicePixelRatio: 1\n }\n });\n\n didRender = true;\n }\n }\n\n // @ts-ignore (2532) This method is only called from preRender where masks is defined\n this.masks[channelInfo.id] = {\n index: channelInfo.index,\n bounds: channelInfo.maskBounds,\n coordinateOrigin: channelInfo.coordinateOrigin,\n coordinateSystem: channelInfo.coordinateSystem\n };\n\n return didRender;\n }\n\n /**\n * Find a channel to render each mask into\n * If a maskId already exists, diff and update the existing channel\n * Otherwise replace a removed mask\n * Otherwise create a new channel\n * Returns a map from mask layer id to channel info\n */\n private _sortMaskChannels(maskLayers: Layer[]): Record<string, Channel> {\n const channelMap = {};\n let channelCount = 0;\n for (const layer of maskLayers) {\n const {id} = layer.root;\n let channelInfo = channelMap[id];\n if (!channelInfo) {\n if (++channelCount > 4) {\n log.warn('Too many mask layers. The max supported is 4')();\n continue; // eslint-disable-line no-continue\n }\n channelInfo = {\n id,\n index: this.channels.findIndex(c => c?.id === id),\n layers: [],\n layerBounds: [],\n coordinateOrigin: layer.root.props.coordinateOrigin,\n coordinateSystem: layer.root.props.coordinateSystem\n };\n channelMap[id] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n }\n\n for (let i = 0; i < 4; i++) {\n const channelInfo = this.channels[i];\n if (!channelInfo || !(channelInfo.id in channelMap)) {\n // The mask id at this channel no longer exists\n this.channels[i] = null;\n }\n }\n\n for (const maskId in channelMap) {\n const channelInfo = channelMap[maskId];\n\n if (channelInfo.index < 0) {\n channelInfo.index = this.channels.findIndex(c => !c);\n this.channels[channelInfo.index] = channelInfo;\n }\n }\n return channelMap;\n }\n\n getModuleParameters(): {\n maskMap: Texture2D;\n maskChannels: Record<string, Mask> | null;\n } {\n return {\n maskMap: this.masks ? this.maskMap : this.dummyMaskMap,\n maskChannels: this.masks\n };\n }\n\n cleanup(): void {\n if (this.dummyMaskMap) {\n this.dummyMaskMap.delete();\n this.dummyMaskMap = undefined;\n }\n\n if (this.maskPass) {\n this.maskPass.delete();\n this.maskPass = undefined;\n this.maskMap = undefined;\n }\n\n this.lastViewport = undefined;\n this.masks = null;\n this.channels.length = 0;\n }\n}\n"],"file":"mask-effect.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/mask/mask-effect.ts"],"names":["MaskEffect","id","props","useInPicking","order","dummyMaskMap","channels","masks","maskPass","maskMap","lastViewport","preRender","gl","layers","layerFilter","viewports","onViewportActive","views","isPicking","didRender","Texture2D","width","height","maskLayers","filter","l","visible","operation","includes","length","MaskPass","channelMap","_sortMaskChannels","viewport","viewportChanged","equals","resolution","undefined","log","warn","maskId","result","_renderChannel","channelInfo","oldChannelInfo","index","maskChanged","some","layer","i","transitions","layerBounds","b","bounds","maskBounds","maskViewport","border","getBounds","render","pass","channel","moduleParameters","devicePixelRatio","coordinateOrigin","coordinateSystem","channelCount","root","findIndex","c","push","getModuleParameters","maskChannels","cleanup","delete"],"mappings":"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","sourcesContent":["import {Layer, Viewport, Effect, PreRenderOptions, CoordinateSystem, log} from '@deck.gl/core';\nimport {Texture2D} from '@luma.gl/core';\nimport {equals} from '@math.gl/core';\nimport MaskPass from './mask-pass';\nimport {joinLayerBounds, getRenderBounds, makeViewport, Bounds} from '../utils/projection-utils';\n// import {debugFBO} from '../utils/debug';\n\ntype Mask = {\n /** The channel index */\n index: number;\n bounds: Bounds;\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\ntype Channel = {\n id: string;\n index: number;\n layers: Layer[];\n bounds: Bounds | null;\n maskBounds: Bounds;\n layerBounds: Bounds[];\n coordinateOrigin: [number, number, number];\n coordinateSystem: CoordinateSystem;\n};\n\nexport type MaskPreRenderStats = {\n didRender: boolean;\n};\n\n// Class to manage mask effect\nexport default class MaskEffect implements Effect {\n id = 'mask-effect';\n props = null;\n useInPicking = true;\n order = 0;\n\n private dummyMaskMap?: Texture2D;\n private channels: (Channel | null)[] = [];\n private masks: Record<string, Mask> | null = null;\n private maskPass?: MaskPass;\n private maskMap?: Texture2D;\n private lastViewport?: Viewport;\n\n preRender(\n gl: WebGLRenderingContext,\n {layers, layerFilter, viewports, onViewportActive, views, isPicking}: PreRenderOptions\n ): MaskPreRenderStats {\n let didRender = false;\n if (!this.dummyMaskMap) {\n this.dummyMaskMap = new Texture2D(gl, {\n width: 1,\n height: 1\n });\n }\n\n if (isPicking) {\n // Do not update on picking pass\n return {didRender};\n }\n\n const maskLayers = layers.filter(l => l.props.visible && l.props.operation.includes('mask'));\n if (maskLayers.length === 0) {\n this.masks = null;\n this.channels.length = 0;\n return {didRender};\n }\n this.masks = {};\n\n if (!this.maskPass) {\n this.maskPass = new MaskPass(gl, {id: 'default-mask'});\n this.maskMap = this.maskPass.maskMap;\n }\n\n // Map layers to channels\n const channelMap = this._sortMaskChannels(maskLayers);\n // TODO - support multiple views\n const viewport = viewports[0];\n const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);\n\n if (viewport.resolution !== undefined) {\n log.warn('MaskExtension is not supported in GlobeView')();\n return {didRender};\n }\n\n for (const maskId in channelMap) {\n const result = this._renderChannel(channelMap[maskId], {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n });\n didRender ||= result;\n }\n\n // debugFBO(this.maskMap, {opaque: true});\n return {didRender};\n }\n\n /* eslint-disable-next-line complexity */\n private _renderChannel(\n channelInfo: Channel,\n {\n layerFilter,\n onViewportActive,\n views,\n viewport,\n viewportChanged\n }: {\n layerFilter: PreRenderOptions['layerFilter'];\n onViewportActive: PreRenderOptions['onViewportActive'];\n views: PreRenderOptions['views'];\n viewport: Viewport;\n viewportChanged: boolean;\n }\n ): boolean {\n let didRender = false;\n const oldChannelInfo = this.channels[channelInfo.index];\n if (!oldChannelInfo) {\n return didRender;\n }\n\n const maskChanged =\n // If a channel is new\n channelInfo === oldChannelInfo ||\n // If sublayers have changed\n channelInfo.layers.length !== oldChannelInfo.layers.length ||\n channelInfo.layers.some(\n (layer, i) =>\n // Layer instance is updated\n // Layer props might have changed\n // Undetermined props could have an effect on the output geometry of a mask layer,\n // for example getRadius+updateTriggers, radiusScale, modelMatrix\n layer !== oldChannelInfo.layers[i] ||\n // Some prop is in transition\n layer.props.transitions\n ) ||\n // If a sublayer's positions have been updated, the cached bounds will change shallowly\n channelInfo.layerBounds.some((b, i) => b !== oldChannelInfo.layerBounds[i]);\n\n channelInfo.bounds = oldChannelInfo.bounds;\n channelInfo.maskBounds = oldChannelInfo.maskBounds;\n this.channels[channelInfo.index] = channelInfo;\n\n if (maskChanged || viewportChanged) {\n // Recalculate mask bounds\n this.lastViewport = viewport;\n\n const layerBounds = joinLayerBounds(channelInfo.layers, viewport);\n channelInfo.bounds = layerBounds && getRenderBounds(layerBounds, viewport);\n\n if (maskChanged || !equals(channelInfo.bounds, oldChannelInfo.bounds)) {\n // Rerender mask FBO\n const {maskPass, maskMap} = this;\n\n const maskViewport =\n layerBounds &&\n makeViewport({\n bounds: channelInfo.bounds!,\n viewport,\n width: maskMap.width,\n height: maskMap.height,\n border: 1\n });\n\n channelInfo.maskBounds = maskViewport ? maskViewport.getBounds() : [0, 0, 1, 1];\n\n // @ts-ignore (2532) This method is only called from preRender where maskPass is defined\n maskPass.render({\n pass: 'mask',\n channel: channelInfo.index,\n layers: channelInfo.layers,\n layerFilter,\n viewports: maskViewport ? [maskViewport] : [],\n onViewportActive,\n views,\n moduleParameters: {\n devicePixelRatio: 1\n }\n });\n\n didRender = true;\n }\n }\n\n // @ts-ignore (2532) This method is only called from preRender where masks is defined\n this.masks[channelInfo.id] = {\n index: channelInfo.index,\n bounds: channelInfo.maskBounds,\n coordinateOrigin: channelInfo.coordinateOrigin,\n coordinateSystem: channelInfo.coordinateSystem\n };\n\n return didRender;\n }\n\n /**\n * Find a channel to render each mask into\n * If a maskId already exists, diff and update the existing channel\n * Otherwise replace a removed mask\n * Otherwise create a new channel\n * Returns a map from mask layer id to channel info\n */\n private _sortMaskChannels(maskLayers: Layer[]): Record<string, Channel> {\n const channelMap = {};\n let channelCount = 0;\n for (const layer of maskLayers) {\n const {id} = layer.root;\n let channelInfo = channelMap[id];\n if (!channelInfo) {\n if (++channelCount > 4) {\n log.warn('Too many mask layers. The max supported is 4')();\n continue; // eslint-disable-line no-continue\n }\n channelInfo = {\n id,\n index: this.channels.findIndex(c => c?.id === id),\n layers: [],\n layerBounds: [],\n coordinateOrigin: layer.root.props.coordinateOrigin,\n coordinateSystem: layer.root.props.coordinateSystem\n };\n channelMap[id] = channelInfo;\n }\n channelInfo.layers.push(layer);\n channelInfo.layerBounds.push(layer.getBounds());\n }\n\n for (let i = 0; i < 4; i++) {\n const channelInfo = this.channels[i];\n if (!channelInfo || !(channelInfo.id in channelMap)) {\n // The mask id at this channel no longer exists\n this.channels[i] = null;\n }\n }\n\n for (const maskId in channelMap) {\n const channelInfo = channelMap[maskId];\n\n if (channelInfo.index < 0) {\n channelInfo.index = this.channels.findIndex(c => !c);\n this.channels[channelInfo.index] = channelInfo;\n }\n }\n return channelMap;\n }\n\n getModuleParameters(): {\n maskMap: Texture2D;\n maskChannels: Record<string, Mask> | null;\n } {\n return {\n maskMap: this.masks ? this.maskMap : this.dummyMaskMap,\n maskChannels: this.masks\n };\n }\n\n cleanup(): void {\n if (this.dummyMaskMap) {\n this.dummyMaskMap.delete();\n this.dummyMaskMap = undefined;\n }\n\n if (this.maskPass) {\n this.maskPass.delete();\n this.maskPass = undefined;\n this.maskMap = undefined;\n }\n\n this.lastViewport = undefined;\n this.masks = null;\n this.channels.length = 0;\n }\n}\n"],"file":"mask-effect.js"}
|