@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.
Files changed (144) hide show
  1. package/LICENSE +1 -1
  2. package/dist/dist.dev.js +38 -660
  3. package/dist/es5/brushing/brushing-extension.js +48 -54
  4. package/dist/es5/brushing/brushing-extension.js.map +1 -1
  5. package/dist/es5/clip/clip-extension.js +32 -37
  6. package/dist/es5/clip/clip-extension.js.map +1 -1
  7. package/dist/es5/collision-filter/collision-filter-effect.js +217 -225
  8. package/dist/es5/collision-filter/collision-filter-effect.js.map +1 -1
  9. package/dist/es5/collision-filter/collision-filter-extension.js +49 -56
  10. package/dist/es5/collision-filter/collision-filter-extension.js.map +1 -1
  11. package/dist/es5/collision-filter/collision-filter-pass.js +31 -34
  12. package/dist/es5/collision-filter/collision-filter-pass.js.map +1 -1
  13. package/dist/es5/data-filter/data-filter-extension.js +126 -132
  14. package/dist/es5/data-filter/data-filter-extension.js.map +1 -1
  15. package/dist/es5/fill-style/fill-style-extension.js +101 -109
  16. package/dist/es5/fill-style/fill-style-extension.js.map +1 -1
  17. package/dist/es5/fp64/fp64-extension.js +12 -16
  18. package/dist/es5/fp64/fp64-extension.js.map +1 -1
  19. package/dist/es5/mask/mask-effect.js +208 -216
  20. package/dist/es5/mask/mask-effect.js.map +1 -1
  21. package/dist/es5/mask/mask-extension.js +57 -63
  22. package/dist/es5/mask/mask-extension.js.map +1 -1
  23. package/dist/es5/mask/mask-pass.js +36 -42
  24. package/dist/es5/mask/mask-pass.js.map +1 -1
  25. package/dist/es5/path-style/path-style-extension.js +81 -89
  26. package/dist/es5/path-style/path-style-extension.js.map +1 -1
  27. package/dist/es5/terrain/height-map-builder.js +73 -80
  28. package/dist/es5/terrain/height-map-builder.js.map +1 -1
  29. package/dist/es5/terrain/terrain-cover.js +155 -162
  30. package/dist/es5/terrain/terrain-cover.js.map +1 -1
  31. package/dist/es5/terrain/terrain-effect.js +233 -242
  32. package/dist/es5/terrain/terrain-effect.js.map +1 -1
  33. package/dist/es5/terrain/terrain-extension.js +44 -51
  34. package/dist/es5/terrain/terrain-extension.js.map +1 -1
  35. package/dist/es5/terrain/terrain-pass.js +61 -65
  36. package/dist/es5/terrain/terrain-pass.js.map +1 -1
  37. package/dist/es5/terrain/terrain-picking-pass.js +56 -62
  38. package/dist/es5/terrain/terrain-picking-pass.js.map +1 -1
  39. package/dist/esm/brushing/brushing-extension.js +2 -5
  40. package/dist/esm/brushing/brushing-extension.js.map +1 -1
  41. package/dist/esm/brushing/shader-module.js +67 -4
  42. package/dist/esm/brushing/shader-module.js.map +1 -1
  43. package/dist/esm/clip/clip-extension.js +33 -14
  44. package/dist/esm/clip/clip-extension.js.map +1 -1
  45. package/dist/esm/collision-filter/collision-filter-effect.js +10 -19
  46. package/dist/esm/collision-filter/collision-filter-effect.js.map +1 -1
  47. package/dist/esm/collision-filter/collision-filter-extension.js +2 -5
  48. package/dist/esm/collision-filter/collision-filter-extension.js.map +1 -1
  49. package/dist/esm/collision-filter/shader-module.js +76 -4
  50. package/dist/esm/collision-filter/shader-module.js.map +1 -1
  51. package/dist/esm/data-filter/aggregator.js +45 -2
  52. package/dist/esm/data-filter/aggregator.js.map +1 -1
  53. package/dist/esm/data-filter/data-filter-extension.js +2 -5
  54. package/dist/esm/data-filter/data-filter-extension.js.map +1 -1
  55. package/dist/esm/data-filter/shader-module.js +86 -6
  56. package/dist/esm/data-filter/shader-module.js.map +1 -1
  57. package/dist/esm/fill-style/fill-style-extension.js +2 -5
  58. package/dist/esm/fill-style/fill-style-extension.js.map +1 -1
  59. package/dist/esm/fill-style/shaders.glsl.js +60 -5
  60. package/dist/esm/fill-style/shaders.glsl.js.map +1 -1
  61. package/dist/esm/fp64/fp64-extension.js +1 -3
  62. package/dist/esm/fp64/fp64-extension.js.map +1 -1
  63. package/dist/esm/fp64/project64.glsl.js +81 -1
  64. package/dist/esm/fp64/project64.glsl.js.map +1 -1
  65. package/dist/esm/mask/mask-effect.js +10 -20
  66. package/dist/esm/mask/mask-effect.js.map +1 -1
  67. package/dist/esm/mask/mask-extension.js +3 -6
  68. package/dist/esm/mask/mask-extension.js.map +1 -1
  69. package/dist/esm/mask/mask-pass.js +2 -6
  70. package/dist/esm/mask/mask-pass.js.map +1 -1
  71. package/dist/esm/mask/shader-module.js +61 -6
  72. package/dist/esm/mask/shader-module.js.map +1 -1
  73. package/dist/esm/path-style/path-style-extension.js +2 -5
  74. package/dist/esm/path-style/path-style-extension.js.map +1 -1
  75. package/dist/esm/path-style/shaders.glsl.js +79 -8
  76. package/dist/esm/path-style/shaders.glsl.js.map +1 -1
  77. package/dist/esm/terrain/height-map-builder.js +8 -17
  78. package/dist/esm/terrain/height-map-builder.js.map +1 -1
  79. package/dist/esm/terrain/shader-module.js +59 -7
  80. package/dist/esm/terrain/shader-module.js.map +1 -1
  81. package/dist/esm/terrain/terrain-cover.js +11 -22
  82. package/dist/esm/terrain/terrain-cover.js.map +1 -1
  83. package/dist/esm/terrain/terrain-effect.js +11 -21
  84. package/dist/esm/terrain/terrain-effect.js.map +1 -1
  85. package/dist/esm/terrain/terrain-extension.js +2 -5
  86. package/dist/esm/terrain/terrain-extension.js.map +1 -1
  87. package/dist/esm/terrain/terrain-pass.js +1 -1
  88. package/dist/esm/terrain/terrain-pass.js.map +1 -1
  89. package/dist/esm/terrain/terrain-picking-pass.js +2 -4
  90. package/dist/esm/terrain/terrain-picking-pass.js.map +1 -1
  91. package/dist.min.js +36 -35
  92. package/package.json +2 -2
  93. package/typed/brushing/brushing.d.ts +0 -39
  94. package/typed/brushing/brushing.d.ts.map +0 -1
  95. package/typed/brushing/brushing.js +0 -83
  96. package/typed/brushing/shader-module.js +0 -116
  97. package/typed/clip/clip.d.ts +0 -32
  98. package/typed/clip/clip.d.ts.map +0 -1
  99. package/typed/clip/clip.js +0 -114
  100. package/typed/collide/collide-effect.d.ts +0 -28
  101. package/typed/collide/collide-effect.d.ts.map +0 -1
  102. package/typed/collide/collide-pass.d.ts +0 -14
  103. package/typed/collide/collide-pass.d.ts.map +0 -1
  104. package/typed/collide/collide.d.ts +0 -41
  105. package/typed/collide/collide.d.ts.map +0 -1
  106. package/typed/collide/shader-module.d.ts +0 -4
  107. package/typed/collide/shader-module.d.ts.map +0 -1
  108. package/typed/collision-filter/collision-filter.d.ts +0 -41
  109. package/typed/collision-filter/collision-filter.d.ts.map +0 -1
  110. package/typed/common/projection-utils.d.ts +0 -27
  111. package/typed/common/projection-utils.d.ts.map +0 -1
  112. package/typed/data-filter/aggregator.js +0 -98
  113. package/typed/data-filter/data-filter.d.ts +0 -90
  114. package/typed/data-filter/data-filter.d.ts.map +0 -1
  115. package/typed/data-filter/data-filter.js +0 -159
  116. package/typed/data-filter/shader-module.js +0 -152
  117. package/typed/fill-style/fill-style.d.ts +0 -86
  118. package/typed/fill-style/fill-style.d.ts.map +0 -1
  119. package/typed/fill-style/fill-style.js +0 -152
  120. package/typed/fill-style/shaders.glsl.js +0 -95
  121. package/typed/fp64/fp64.d.ts +0 -8
  122. package/typed/fp64/fp64.d.ts.map +0 -1
  123. package/typed/fp64/fp64.js +0 -34
  124. package/typed/fp64/project64.glsl.js +0 -100
  125. package/typed/fp64/project64.js +0 -50
  126. package/typed/index.js +0 -9
  127. package/typed/mask/mask.d.ts +0 -30
  128. package/typed/mask/mask.d.ts.map +0 -1
  129. package/typed/mask/mask.js +0 -48
  130. package/typed/mask/shader-module.js +0 -73
  131. package/typed/mask/utils.d.ts +0 -13
  132. package/typed/mask/utils.d.ts.map +0 -1
  133. package/typed/path-style/path-style.d.ts +0 -66
  134. package/typed/path-style/path-style.d.ts.map +0 -1
  135. package/typed/path-style/path-style.js +0 -107
  136. package/typed/path-style/shaders.glsl.js +0 -93
  137. package/typed/terrain/height-map.d.ts +0 -27
  138. package/typed/terrain/height-map.d.ts.map +0 -1
  139. package/typed/terrain/shader-module-offset.d.ts +0 -4
  140. package/typed/terrain/shader-module-offset.d.ts.map +0 -1
  141. package/typed/terrain/shader-module-source.d.ts +0 -4
  142. package/typed/terrain/shader-module-source.d.ts.map +0 -1
  143. package/typed/terrain/terrain.d.ts +0 -21
  144. 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
- (0, _defineProperty2.default)(this, "id", 'mask-effect');
36
- (0, _defineProperty2.default)(this, "props", null);
37
- (0, _defineProperty2.default)(this, "useInPicking", true);
38
- (0, _defineProperty2.default)(this, "order", 0);
39
- (0, _defineProperty2.default)(this, "dummyMaskMap", void 0);
40
- (0, _defineProperty2.default)(this, "channels", []);
41
- (0, _defineProperty2.default)(this, "masks", null);
42
- (0, _defineProperty2.default)(this, "maskPass", void 0);
43
- (0, _defineProperty2.default)(this, "maskMap", void 0);
44
- (0, _defineProperty2.default)(this, "lastViewport", void 0);
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
- (0, _createClass2.default)(MaskEffect, [{
48
- key: "preRender",
49
- value: function preRender(gl, _ref) {
50
- var layers = _ref.layers,
51
- layerFilter = _ref.layerFilter,
52
- viewports = _ref.viewports,
53
- onViewportActive = _ref.onViewportActive,
54
- views = _ref.views,
55
- isPicking = _ref.isPicking;
56
- var didRender = false;
57
-
58
- if (!this.dummyMaskMap) {
59
- this.dummyMaskMap = new _core2.Texture2D(gl, {
60
- width: 1,
61
- height: 1
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
- if (maskLayers.length === 0) {
76
- this.masks = null;
77
- this.channels.length = 0;
78
- return {
79
- didRender: didRender
80
- };
81
- }
82
-
83
- this.masks = {};
61
+ if (isPicking) {
62
+ return {
63
+ didRender: didRender
64
+ };
65
+ }
84
66
 
85
- if (!this.maskPass) {
86
- this.maskPass = new _maskPass.default(gl, {
87
- id: 'default-mask'
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
- var channelMap = this._sortMaskChannels(maskLayers);
71
+ if (maskLayers.length === 0) {
72
+ this.masks = null;
73
+ this.channels.length = 0;
74
+ return {
75
+ didRender: didRender
76
+ };
77
+ }
93
78
 
94
- var viewport = viewports[0];
95
- var viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);
79
+ this.masks = {};
96
80
 
97
- if (viewport.resolution !== undefined) {
98
- _core.log.warn('MaskExtension is not supported in GlobeView')();
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
- return {
101
- didRender: didRender
102
- };
103
- }
88
+ var channelMap = this._sortMaskChannels(maskLayers);
104
89
 
105
- for (var maskId in channelMap) {
106
- var result = this._renderChannel(channelMap[maskId], {
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
- didRender || (didRender = result);
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
- var maskChanged = channelInfo === oldChannelInfo || channelInfo.layers.length !== oldChannelInfo.layers.length || channelInfo.layers.some(function (layer, i) {
137
- return layer !== oldChannelInfo.layers[i] || layer.props.transitions;
138
- }) || channelInfo.layerBounds.some(function (b, i) {
139
- return b !== oldChannelInfo.layerBounds[i];
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
- this.masks[channelInfo.id] = {
178
- index: channelInfo.index,
179
- bounds: channelInfo.maskBounds,
180
- coordinateOrigin: channelInfo.coordinateOrigin,
181
- coordinateSystem: channelInfo.coordinateSystem
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
- key: "_sortMaskChannels",
187
- value: function _sortMaskChannels(maskLayers) {
188
- var _this = this;
189
-
190
- var channelMap = {};
191
- var channelCount = 0;
192
-
193
- var _iterator = _createForOfIteratorHelper(maskLayers),
194
- _step;
195
-
196
- try {
197
- var _loop = function _loop() {
198
- var layer = _step.value;
199
- var id = layer.root.id;
200
- var channelInfo = channelMap[id];
201
-
202
- if (!channelInfo) {
203
- if (++channelCount > 4) {
204
- _core.log.warn('Too many mask layers. The max supported is 4')();
205
-
206
- return "continue";
207
- }
208
-
209
- channelInfo = {
210
- id: id,
211
- index: _this.channels.findIndex(function (c) {
212
- return (c === null || c === void 0 ? void 0 : c.id) === id;
213
- }),
214
- layers: [],
215
- layerBounds: [],
216
- coordinateOrigin: layer.root.props.coordinateOrigin,
217
- coordinateSystem: layer.root.props.coordinateSystem
218
- };
219
- channelMap[id] = channelInfo;
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
- channelInfo.layers.push(layer);
223
- channelInfo.layerBounds.push(layer.getBounds());
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
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
227
- var _ret = _loop();
181
+ _proto._sortMaskChannels = function _sortMaskChannels(maskLayers) {
182
+ var _this = this;
228
183
 
229
- if (_ret === "continue") continue;
230
- }
231
- } catch (err) {
232
- _iterator.e(err);
233
- } finally {
234
- _iterator.f();
235
- }
184
+ var channelMap = {};
185
+ var channelCount = 0;
236
186
 
237
- for (var i = 0; i < 4; i++) {
238
- var channelInfo = this.channels[i];
187
+ var _iterator = _createForOfIteratorHelper(maskLayers),
188
+ _step;
239
189
 
240
- if (!channelInfo || !(channelInfo.id in channelMap)) {
241
- this.channels[i] = null;
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
- for (var maskId in channelMap) {
246
- var _channelInfo = channelMap[maskId];
196
+ if (!channelInfo) {
197
+ if (++channelCount > 4) {
198
+ _core.log.warn('Too many mask layers. The max supported is 4')();
247
199
 
248
- if (_channelInfo.index < 0) {
249
- _channelInfo.index = this.channels.findIndex(function (c) {
250
- return !c;
251
- });
252
- this.channels[_channelInfo.index] = _channelInfo;
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
- return channelMap;
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
- key: "cleanup",
268
- value: function cleanup() {
269
- if (this.dummyMaskMap) {
270
- this.dummyMaskMap.delete();
271
- this.dummyMaskMap = undefined;
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
- if (this.maskPass) {
275
- this.maskPass.delete();
276
- this.maskPass = undefined;
277
- this.maskMap = undefined;
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
- this.lastViewport = undefined;
281
- this.masks = null;
282
- this.channels.length = 0;
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"}