@deck.gl/extensions 9.0.0-beta.10 → 9.0.0-beta.11

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 (50) 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 +5 -5
  8. package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
  9. package/dist/data-filter/data-filter-extension.js +45 -38
  10. package/dist/data-filter/shader-module.d.ts +30 -0
  11. package/dist/data-filter/shader-module.d.ts.map +1 -1
  12. package/dist/data-filter/shader-module.js +40 -20
  13. package/dist/dist.dev.js +571 -535
  14. package/dist/index.cjs +517 -478
  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 +45 -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-cover.d.ts.map +1 -1
  25. package/dist/terrain/terrain-cover.js +2 -1
  26. package/dist/terrain/terrain-effect.d.ts +4 -5
  27. package/dist/terrain/terrain-effect.d.ts.map +1 -1
  28. package/dist/terrain/terrain-effect.js +6 -16
  29. package/dist/terrain/terrain-pass.d.ts +42 -0
  30. package/dist/terrain/terrain-pass.d.ts.map +1 -1
  31. package/dist/terrain/terrain-pass.js +24 -16
  32. package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
  33. package/dist/terrain/terrain-picking-pass.js +9 -8
  34. package/dist/terrain/utils.d.ts +1 -0
  35. package/dist/terrain/utils.d.ts.map +1 -1
  36. package/dist/terrain/utils.js +10 -6
  37. package/dist.min.js +63 -40
  38. package/package.json +6 -6
  39. package/src/collision-filter/collision-filter-effect.ts +23 -23
  40. package/src/collision-filter/collision-filter-pass.ts +7 -11
  41. package/src/data-filter/data-filter-extension.ts +57 -49
  42. package/src/data-filter/shader-module.ts +109 -43
  43. package/src/mask/mask-effect.ts +30 -19
  44. package/src/mask/mask-pass.ts +22 -16
  45. package/src/path-style/path-style-extension.ts +1 -0
  46. package/src/terrain/terrain-cover.ts +2 -1
  47. package/src/terrain/terrain-effect.ts +8 -19
  48. package/src/terrain/terrain-pass.ts +37 -34
  49. package/src/terrain/terrain-picking-pass.ts +19 -23
  50. package/src/terrain/utils.ts +12 -6
package/dist/index.cjs CHANGED
@@ -193,22 +193,21 @@ var import_core3 = require("@deck.gl/core");
193
193
 
194
194
  // dist/data-filter/shader-module.js
195
195
  var vs2 = `
196
- uniform DATAFILTER_TYPE filter_min;
197
- uniform DATAFILTER_TYPE filter_softMin;
198
- uniform DATAFILTER_TYPE filter_softMax;
199
- uniform DATAFILTER_TYPE filter_max;
200
196
  uniform bool filter_useSoftMargin;
201
197
  uniform bool filter_enabled;
202
198
  uniform bool filter_transformSize;
203
199
  uniform ivec4 filter_categoryBitMask;
200
+ #ifdef DATAFILTER_TYPE
201
+ uniform DATAFILTER_TYPE filter_min;
202
+ uniform DATAFILTER_TYPE filter_softMin;
203
+ uniform DATAFILTER_TYPE filter_softMax;
204
+ uniform DATAFILTER_TYPE filter_max;
204
205
  #ifdef NON_INSTANCED_MODEL
205
206
  #define DATAFILTER_ATTRIB filterValues
206
207
  #define DATAFILTER_ATTRIB_64LOW filterValues64Low
207
- #define DATACATEGORY_ATTRIB filterCategoryValues
208
208
  #else
209
209
  #define DATAFILTER_ATTRIB instanceFilterValues
210
210
  #define DATAFILTER_ATTRIB_64LOW instanceFilterValues64Low
211
- #define DATACATEGORY_ATTRIB instanceFilterCategoryValues
212
211
  #endif
213
212
  in DATAFILTER_TYPE DATAFILTER_ATTRIB;
214
213
  #ifdef DATAFILTER_DOUBLE
@@ -216,7 +215,15 @@ in DATAFILTER_TYPE DATAFILTER_ATTRIB_64LOW;
216
215
  uniform DATAFILTER_TYPE filter_min64High;
217
216
  uniform DATAFILTER_TYPE filter_max64High;
218
217
  #endif
218
+ #endif
219
+ #ifdef DATACATEGORY_TYPE
220
+ #ifdef NON_INSTANCED_MODEL
221
+ #define DATACATEGORY_ATTRIB filterCategoryValues
222
+ #else
223
+ #define DATACATEGORY_ATTRIB instanceFilterCategoryValues
224
+ #endif
219
225
  in DATACATEGORY_TYPE DATACATEGORY_ATTRIB;
226
+ #endif
220
227
  out float dataFilter_value;
221
228
  float dataFilter_reduceValue(float value) {
222
229
  return value;
@@ -230,18 +237,29 @@ return min(min(value.x, value.y), value.z);
230
237
  float dataFilter_reduceValue(vec4 value) {
231
238
  return min(min(value.x, value.y), min(value.z, value.w));
232
239
  }
233
- void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax, DATACATEGORY_TYPE category) {
234
- if (filter_enabled) {
240
+ #ifdef DATAFILTER_TYPE
241
+ void dataFilter_setValue(DATAFILTER_TYPE valueFromMin, DATAFILTER_TYPE valueFromMax) {
235
242
  if (filter_useSoftMargin) {
236
- dataFilter_value = dataFilter_reduceValue(
237
- smoothstep(filter_min, filter_softMin, valueFromMin) *
238
- (1.0 - smoothstep(filter_softMax, filter_max, valueFromMax))
243
+ DATAFILTER_TYPE leftInRange = mix(
244
+ smoothstep(filter_min, filter_softMin, valueFromMin),
245
+ step(filter_min, valueFromMin),
246
+ step(filter_softMin, filter_min)
247
+ );
248
+ DATAFILTER_TYPE rightInRange = mix(
249
+ 1.0 - smoothstep(filter_softMax, filter_max, valueFromMax),
250
+ step(valueFromMax, filter_max),
251
+ step(filter_max, filter_softMax)
239
252
  );
253
+ dataFilter_value = dataFilter_reduceValue(leftInRange * rightInRange);
240
254
  } else {
241
255
  dataFilter_value = dataFilter_reduceValue(
242
256
  step(filter_min, valueFromMin) * step(valueFromMax, filter_max)
243
257
  );
244
258
  }
259
+ }
260
+ #endif
261
+ #ifdef DATACATEGORY_ATTRIB
262
+ void dataFilter_setCategoryValue(DATACATEGORY_TYPE category) {
245
263
  #if DATACATEGORY_CHANNELS == 1
246
264
  int dataFilter_masks = filter_categoryBitMask[int(category / 32.0)];
247
265
  #elif DATACATEGORY_CHANNELS == 2
@@ -261,10 +279,8 @@ if(dataFilter_bits == 0.0) dataFilter_value = 0.0;
261
279
  #else
262
280
  if(any(equal(dataFilter_bits, DATACATEGORY_TYPE(0.0)))) dataFilter_value = 0.0;
263
281
  #endif
264
- } else {
265
- dataFilter_value = 1.0;
266
- }
267
282
  }
283
+ #endif
268
284
  `;
269
285
  var fs2 = `
270
286
  uniform bool filter_transformColor;
@@ -322,15 +338,22 @@ function getUniforms64(opts) {
322
338
  }
323
339
  var inject2 = {
324
340
  "vs:#main-start": `
341
+ dataFilter_value = 1.0;
342
+ if (filter_enabled) {
343
+ #ifdef DATAFILTER_ATTRIB
325
344
  #ifdef DATAFILTER_DOUBLE
326
345
  dataFilter_setValue(
327
346
  DATAFILTER_ATTRIB - filter_min64High + DATAFILTER_ATTRIB_64LOW,
328
- DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW,
329
- DATACATEGORY_ATTRIB
347
+ DATAFILTER_ATTRIB - filter_max64High + DATAFILTER_ATTRIB_64LOW
330
348
  );
331
349
  #else
332
- dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB, DATACATEGORY_ATTRIB);
350
+ dataFilter_setValue(DATAFILTER_ATTRIB, DATAFILTER_ATTRIB);
333
351
  #endif
352
+ #endif
353
+ #ifdef DATACATEGORY_ATTRIB
354
+ dataFilter_setCategoryValue(DATACATEGORY_ATTRIB);
355
+ #endif
356
+ }
334
357
  `,
335
358
  "vs:#main-end": `
336
359
  if (dataFilter_value == 0.0) {
@@ -476,7 +499,7 @@ var defaultProps2 = {
476
499
  filterTransformColor: true
477
500
  };
478
501
  var defaultOptions = {
479
- categorySize: 1,
502
+ categorySize: 0,
480
503
  filterSize: 1,
481
504
  fp64: false,
482
505
  countItems: false
@@ -493,48 +516,55 @@ var _DataFilterExtension = class extends import_core3.LayerExtension {
493
516
  }
494
517
  getShaders(extension) {
495
518
  const { categorySize, filterSize, fp64: fp642 } = extension.opts;
496
- return {
497
- modules: [fp642 ? shaderModule64 : shaderModule],
498
- defines: {
499
- DATACATEGORY_TYPE: DATA_TYPE_FROM_SIZE[categorySize],
500
- DATACATEGORY_CHANNELS: categorySize,
501
- DATAFILTER_TYPE: DATA_TYPE_FROM_SIZE[filterSize],
502
- DATAFILTER_DOUBLE: Boolean(fp642)
503
- }
504
- };
519
+ const defines = {};
520
+ if (categorySize) {
521
+ defines.DATACATEGORY_TYPE = DATA_TYPE_FROM_SIZE[categorySize];
522
+ defines.DATACATEGORY_CHANNELS = categorySize;
523
+ }
524
+ if (filterSize) {
525
+ defines.DATAFILTER_TYPE = DATA_TYPE_FROM_SIZE[filterSize];
526
+ defines.DATAFILTER_DOUBLE = Boolean(fp642);
527
+ }
528
+ return { modules: [fp642 ? shaderModule64 : shaderModule], defines };
505
529
  }
506
530
  initializeState(context, extension) {
507
531
  const attributeManager = this.getAttributeManager();
508
532
  const { categorySize, filterSize, fp64: fp642 } = extension.opts;
509
533
  if (attributeManager) {
510
- attributeManager.add({
511
- filterValues: {
512
- size: filterSize,
513
- type: fp642 ? "float64" : "float32",
514
- accessor: "getFilterValue",
515
- shaderAttributes: {
516
- filterValues: {
517
- divisor: 0
518
- },
519
- instanceFilterValues: {
520
- divisor: 1
534
+ if (filterSize) {
535
+ attributeManager.add({
536
+ filterValues: {
537
+ size: filterSize,
538
+ type: fp642 ? "float64" : "float32",
539
+ accessor: "getFilterValue",
540
+ shaderAttributes: {
541
+ filterValues: {
542
+ divisor: 0
543
+ },
544
+ instanceFilterValues: {
545
+ divisor: 1
546
+ }
521
547
  }
522
548
  }
523
- },
524
- filterCategoryValues: {
525
- size: categorySize,
526
- accessor: "getFilterCategory",
527
- transform: categorySize === 1 ? (d) => extension._getCategoryKey.call(this, d, 0) : (d) => d.map((x, i) => extension._getCategoryKey.call(this, x, i)),
528
- shaderAttributes: {
529
- filterCategoryValues: {
530
- divisor: 0
531
- },
532
- instanceFilterCategoryValues: {
533
- divisor: 1
549
+ });
550
+ }
551
+ if (categorySize) {
552
+ attributeManager.add({
553
+ filterCategoryValues: {
554
+ size: categorySize,
555
+ accessor: "getFilterCategory",
556
+ transform: categorySize === 1 ? (d) => extension._getCategoryKey.call(this, d, 0) : (d) => d.map((x, i) => extension._getCategoryKey.call(this, x, i)),
557
+ shaderAttributes: {
558
+ filterCategoryValues: {
559
+ divisor: 0
560
+ },
561
+ instanceFilterCategoryValues: {
562
+ divisor: 1
563
+ }
534
564
  }
535
565
  }
536
- }
537
- });
566
+ });
567
+ }
538
568
  }
539
569
  const { device } = this.context;
540
570
  if (attributeManager && extension.opts.countItems) {
@@ -564,11 +594,11 @@ var _DataFilterExtension = class extends import_core3.LayerExtension {
564
594
  }
565
595
  }
566
596
  updateState({ props, oldProps, changeFlags }, extension) {
567
- var _a;
597
+ var _a, _b;
568
598
  const attributeManager = this.getAttributeManager();
569
599
  const { categorySize } = extension.opts;
570
600
  if (this.state.filterModel) {
571
- const filterNeedsUpdate = attributeManager.attributes.filterValues.needsUpdate() || ((_a = attributeManager.attributes.filterCategoryValues) == null ? void 0 : _a.needsUpdate()) || props.filterEnabled !== oldProps.filterEnabled || props.filterRange !== oldProps.filterRange || props.filterSoftRange !== oldProps.filterSoftRange || props.filterCategories !== oldProps.filterCategories;
601
+ const filterNeedsUpdate = ((_a = attributeManager.attributes.filterValues) == null ? void 0 : _a.needsUpdate()) || ((_b = attributeManager.attributes.filterCategoryValues) == null ? void 0 : _b.needsUpdate()) || props.filterEnabled !== oldProps.filterEnabled || props.filterRange !== oldProps.filterRange || props.filterSoftRange !== oldProps.filterSoftRange || props.filterCategories !== oldProps.filterCategories;
572
602
  if (filterNeedsUpdate) {
573
603
  this.setState({ filterNeedsUpdate });
574
604
  }
@@ -602,7 +632,7 @@ var _DataFilterExtension = class extends import_core3.LayerExtension {
602
632
  this.context.device.clearWebGL({ framebuffer: filterFBO, color: [0, 0, 0, 0] });
603
633
  filterModel.updateModuleSettings(params.moduleParameters);
604
634
  filterModel.setAttributes({
605
- ...filterValues.getValue(),
635
+ ...filterValues == null ? void 0 : filterValues.getValue(),
606
636
  ...filterCategoryValues == null ? void 0 : filterCategoryValues.getValue(),
607
637
  ...filterIndices == null ? void 0 : filterIndices.getValue()
608
638
  });
@@ -944,6 +974,7 @@ var _PathStyleExtension = class extends import_core6.LayerExtension {
944
974
  }
945
975
  prevP = p;
946
976
  }
977
+ result[geometrySize - 1] = 0;
947
978
  return result;
948
979
  }
949
980
  };
@@ -1259,7 +1290,7 @@ var ClipExtension = _ClipExtension;
1259
1290
  })();
1260
1291
 
1261
1292
  // dist/collision-filter/collision-filter-extension.js
1262
- var import_core19 = require("@deck.gl/core");
1293
+ var import_core15 = require("@deck.gl/core");
1263
1294
 
1264
1295
  // dist/collision-filter/shader-module.js
1265
1296
  var import_core11 = require("@deck.gl/core");
@@ -1348,8 +1379,8 @@ var shader_module_default2 = {
1348
1379
  };
1349
1380
 
1350
1381
  // dist/collision-filter/collision-filter-effect.js
1351
- var import_core17 = require("@math.gl/core");
1352
- var import_core18 = require("@deck.gl/core");
1382
+ var import_core13 = require("@math.gl/core");
1383
+ var import_core14 = require("@deck.gl/core");
1353
1384
 
1354
1385
  // dist/collision-filter/collision-filter-pass.js
1355
1386
  var import_core12 = require("@deck.gl/core");
@@ -1357,13 +1388,11 @@ var CollisionFilterPass = class extends import_core12._LayersPass {
1357
1388
  renderCollisionMap(target, options) {
1358
1389
  const padding = 1;
1359
1390
  const clearColor = [0, 0, 0, 0];
1360
- return this.device.withParametersWebGL({
1361
- scissorTest: true,
1362
- scissor: [padding, padding, target.width - 2 * padding, target.height - 2 * padding],
1363
- blend: false,
1364
- depthTest: true,
1365
- depthRange: [0, 1]
1366
- }, () => this.render({ ...options, clearColor, target, pass: "collision" }));
1391
+ const scissorRect = [padding, padding, target.width - 2 * padding, target.height - 2 * padding];
1392
+ this.render({ ...options, clearColor, scissorRect, target, pass: "collision" });
1393
+ }
1394
+ getLayerParameters(layer, layerIndex, viewport) {
1395
+ return { ...layer.props.parameters, blend: false, depthRange: [0, 1], depthTest: true };
1367
1396
  }
1368
1397
  getModuleParameters() {
1369
1398
  return {
@@ -1377,77 +1406,381 @@ var CollisionFilterPass = class extends import_core12._LayersPass {
1377
1406
  }
1378
1407
  };
1379
1408
 
1380
- // dist/mask/mask-effect.js
1381
- var import_core15 = require("@deck.gl/core");
1382
- var import_core16 = require("@math.gl/core");
1383
-
1384
- // dist/mask/mask-pass.js
1385
- var import_constants2 = require("@luma.gl/constants");
1386
- var import_core13 = require("@deck.gl/core");
1387
- var MaskPass = class extends import_core13._LayersPass {
1388
- constructor(device, props) {
1389
- super(device, props);
1390
- const { mapSize = 2048 } = props;
1391
- this.maskMap = device.createTexture({
1409
+ // dist/collision-filter/collision-filter-effect.js
1410
+ var DOWNSCALE = 2;
1411
+ var CollisionFilterEffect = class {
1412
+ constructor() {
1413
+ this.id = "collision-filter-effect";
1414
+ this.props = null;
1415
+ this.useInPicking = true;
1416
+ this.order = 1;
1417
+ this.channels = {};
1418
+ this.collisionFBOs = {};
1419
+ }
1420
+ setup(context) {
1421
+ this.context = context;
1422
+ const { device } = context;
1423
+ this.dummyCollisionMap = device.createTexture({ width: 1, height: 1 });
1424
+ this.collisionFilterPass = new CollisionFilterPass(device, { id: "default-collision-filter" });
1425
+ }
1426
+ preRender({ effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats = {} }) {
1427
+ var _a;
1428
+ const { device } = this.context;
1429
+ if (isPicking) {
1430
+ return;
1431
+ }
1432
+ const collisionLayers = layers.filter(
1433
+ ({ props: { visible, collisionEnabled } }) => visible && collisionEnabled
1434
+ );
1435
+ if (collisionLayers.length === 0) {
1436
+ this.channels = {};
1437
+ return;
1438
+ }
1439
+ const effects = allEffects == null ? void 0 : allEffects.filter((e) => e.useInPicking && preRenderStats[e.id]);
1440
+ const maskEffectRendered = (_a = preRenderStats["mask-effect"]) == null ? void 0 : _a.didRender;
1441
+ const channels = this._groupByCollisionGroup(device, collisionLayers);
1442
+ const viewport = viewports[0];
1443
+ const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
1444
+ for (const collisionGroup in channels) {
1445
+ const collisionFBO = this.collisionFBOs[collisionGroup];
1446
+ const renderInfo = channels[collisionGroup];
1447
+ const [width, height] = device.canvasContext.getPixelSize();
1448
+ collisionFBO.resize({
1449
+ width: width / DOWNSCALE,
1450
+ height: height / DOWNSCALE
1451
+ });
1452
+ this._render(renderInfo, {
1453
+ effects,
1454
+ layerFilter,
1455
+ onViewportActive,
1456
+ views,
1457
+ viewport,
1458
+ viewportChanged
1459
+ });
1460
+ }
1461
+ }
1462
+ _render(renderInfo, { effects, layerFilter, onViewportActive, views, viewport, viewportChanged }) {
1463
+ const { collisionGroup } = renderInfo;
1464
+ const oldRenderInfo = this.channels[collisionGroup];
1465
+ if (!oldRenderInfo) {
1466
+ return;
1467
+ }
1468
+ const needsRender = viewportChanged || renderInfo === oldRenderInfo || !(0, import_core14._deepEqual)(oldRenderInfo.layers, renderInfo.layers, 1) || renderInfo.layerBounds.some((b, i) => !(0, import_core13.equals)(b, oldRenderInfo.layerBounds[i])) || renderInfo.allLayersLoaded !== oldRenderInfo.allLayersLoaded || renderInfo.layers.some((layer) => layer.props.transitions);
1469
+ this.channels[collisionGroup] = renderInfo;
1470
+ if (needsRender) {
1471
+ this.lastViewport = viewport;
1472
+ const collisionFBO = this.collisionFBOs[collisionGroup];
1473
+ this.collisionFilterPass.renderCollisionMap(collisionFBO, {
1474
+ pass: "collision-filter",
1475
+ isPicking: true,
1476
+ layers: renderInfo.layers,
1477
+ effects,
1478
+ layerFilter,
1479
+ viewports: viewport ? [viewport] : [],
1480
+ onViewportActive,
1481
+ views,
1482
+ moduleParameters: {
1483
+ dummyCollisionMap: this.dummyCollisionMap,
1484
+ devicePixelRatio: collisionFBO.device.canvasContext.getDevicePixelRatio() / DOWNSCALE
1485
+ }
1486
+ });
1487
+ }
1488
+ }
1489
+ _groupByCollisionGroup(device, collisionLayers) {
1490
+ const channelMap = {};
1491
+ for (const layer of collisionLayers) {
1492
+ const { collisionGroup } = layer.props;
1493
+ let channelInfo = channelMap[collisionGroup];
1494
+ if (!channelInfo) {
1495
+ channelInfo = { collisionGroup, layers: [], layerBounds: [], allLayersLoaded: true };
1496
+ channelMap[collisionGroup] = channelInfo;
1497
+ }
1498
+ channelInfo.layers.push(layer);
1499
+ channelInfo.layerBounds.push(layer.getBounds());
1500
+ if (!layer.isLoaded) {
1501
+ channelInfo.allLayersLoaded = false;
1502
+ }
1503
+ }
1504
+ for (const collisionGroup of Object.keys(channelMap)) {
1505
+ if (!this.collisionFBOs[collisionGroup]) {
1506
+ this.createFBO(device, collisionGroup);
1507
+ }
1508
+ if (!this.channels[collisionGroup]) {
1509
+ this.channels[collisionGroup] = channelMap[collisionGroup];
1510
+ }
1511
+ }
1512
+ for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1513
+ if (!channelMap[collisionGroup]) {
1514
+ this.destroyFBO(collisionGroup);
1515
+ }
1516
+ }
1517
+ return channelMap;
1518
+ }
1519
+ getModuleParameters(layer) {
1520
+ const { collisionGroup } = layer.props;
1521
+ const { collisionFBOs, dummyCollisionMap } = this;
1522
+ return { collisionFBO: collisionFBOs[collisionGroup], dummyCollisionMap };
1523
+ }
1524
+ cleanup() {
1525
+ if (this.dummyCollisionMap) {
1526
+ this.dummyCollisionMap.delete();
1527
+ this.dummyCollisionMap = void 0;
1528
+ }
1529
+ this.channels = {};
1530
+ for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1531
+ this.destroyFBO(collisionGroup);
1532
+ }
1533
+ this.collisionFBOs = {};
1534
+ this.lastViewport = void 0;
1535
+ }
1536
+ createFBO(device, collisionGroup) {
1537
+ const { width, height } = device.gl.canvas;
1538
+ const collisionMap = device.createTexture({
1392
1539
  format: "rgba8unorm",
1393
- width: mapSize,
1394
- height: mapSize,
1540
+ width,
1541
+ height,
1395
1542
  sampler: {
1396
- minFilter: "linear",
1397
- magFilter: "linear",
1543
+ minFilter: "nearest",
1544
+ magFilter: "nearest",
1398
1545
  addressModeU: "clamp-to-edge",
1399
1546
  addressModeV: "clamp-to-edge"
1400
1547
  }
1401
1548
  });
1402
- this.fbo = device.createFramebuffer({
1403
- id: "maskmap",
1404
- width: mapSize,
1405
- height: mapSize,
1406
- colorAttachments: [this.maskMap]
1549
+ const depthStencilAttachment = device.createTexture({
1550
+ format: "depth16unorm",
1551
+ width,
1552
+ height,
1553
+ mipmaps: false,
1554
+ dataFormat: 6402,
1555
+ type: 5125
1556
+ });
1557
+ this.collisionFBOs[collisionGroup] = device.createFramebuffer({
1558
+ id: `collision-${collisionGroup}`,
1559
+ width,
1560
+ height,
1561
+ colorAttachments: [collisionMap],
1562
+ depthStencilAttachment
1407
1563
  });
1408
1564
  }
1409
- render(options) {
1410
- const colorMask = [false, false, false, false];
1411
- colorMask[options.channel] = true;
1412
- const clearColor = [255, 255, 255, 255];
1413
- return this.device.withParametersWebGL({
1414
- blend: true,
1415
- blendFunc: [0, 1],
1416
- blendEquation: 32778,
1417
- colorMask,
1418
- depthTest: false
1419
- }, () => super.render({ ...options, clearColor, target: this.fbo, pass: "mask" }));
1420
- }
1421
- shouldDrawLayer(layer) {
1422
- return layer.props.operation.includes("mask");
1423
- }
1424
- delete() {
1425
- this.fbo.delete();
1426
- this.maskMap.delete();
1565
+ destroyFBO(collisionGroup) {
1566
+ var _a, _b;
1567
+ const fbo = this.collisionFBOs[collisionGroup];
1568
+ (_a = fbo.colorAttachments[0]) == null ? void 0 : _a.destroy();
1569
+ (_b = fbo.depthStencilAttachment) == null ? void 0 : _b.destroy();
1570
+ fbo.destroy();
1571
+ delete this.collisionFBOs[collisionGroup];
1427
1572
  }
1428
1573
  };
1429
1574
 
1430
- // dist/utils/projection-utils.js
1431
- var import_core14 = require("@deck.gl/core");
1432
- function joinLayerBounds(layers, viewport) {
1433
- const bounds = [Infinity, Infinity, -Infinity, -Infinity];
1434
- for (const layer of layers) {
1435
- const layerBounds = layer.getBounds();
1436
- if (layerBounds) {
1437
- const bottomLeftCommon = layer.projectPosition(layerBounds[0], { viewport, autoOffset: false });
1438
- const topRightCommon = layer.projectPosition(layerBounds[1], { viewport, autoOffset: false });
1439
- bounds[0] = Math.min(bounds[0], bottomLeftCommon[0]);
1440
- bounds[1] = Math.min(bounds[1], bottomLeftCommon[1]);
1441
- bounds[2] = Math.max(bounds[2], topRightCommon[0]);
1442
- bounds[3] = Math.max(bounds[3], topRightCommon[1]);
1443
- }
1444
- }
1445
- if (Number.isFinite(bounds[0])) {
1446
- return bounds;
1447
- }
1448
- return null;
1449
- }
1450
- var MAX_VIEWPORT_SIZE = 2048;
1575
+ // dist/collision-filter/collision-filter-extension.js
1576
+ var defaultProps6 = {
1577
+ getCollisionPriority: { type: "accessor", value: 0 },
1578
+ collisionEnabled: true,
1579
+ collisionGroup: { type: "string", value: "default" },
1580
+ collisionTestProps: {}
1581
+ };
1582
+ var _CollisionFilterExtension = class extends import_core15.LayerExtension {
1583
+ getShaders() {
1584
+ return { modules: [shader_module_default2] };
1585
+ }
1586
+ draw({ uniforms, context, moduleParameters }) {
1587
+ const { collisionEnabled } = this.props;
1588
+ const { collisionFBO, drawToCollisionMap } = moduleParameters;
1589
+ const enabled = collisionEnabled && Boolean(collisionFBO);
1590
+ uniforms.collision_enabled = enabled;
1591
+ if (drawToCollisionMap) {
1592
+ this.props = this.clone(this.props.collisionTestProps).props;
1593
+ }
1594
+ }
1595
+ initializeState(context, extension) {
1596
+ var _a;
1597
+ if (this.getAttributeManager() === null) {
1598
+ return;
1599
+ }
1600
+ (_a = this.context.deck) == null ? void 0 : _a._addDefaultEffect(new CollisionFilterEffect());
1601
+ const attributeManager = this.getAttributeManager();
1602
+ attributeManager.add({
1603
+ collisionPriorities: {
1604
+ size: 1,
1605
+ accessor: "getCollisionPriority",
1606
+ shaderAttributes: {
1607
+ collisionPriorities: { divisor: 0 },
1608
+ instanceCollisionPriorities: { divisor: 1 }
1609
+ }
1610
+ }
1611
+ });
1612
+ }
1613
+ getNeedsPickingBuffer() {
1614
+ return this.props.collisionEnabled;
1615
+ }
1616
+ };
1617
+ var CollisionFilterExtension = _CollisionFilterExtension;
1618
+ (() => {
1619
+ _CollisionFilterExtension.defaultProps = defaultProps6;
1620
+ })();
1621
+ (() => {
1622
+ _CollisionFilterExtension.extensionName = "CollisionFilterExtension";
1623
+ })();
1624
+
1625
+ // dist/mask/mask-extension.js
1626
+ var import_core21 = require("@deck.gl/core");
1627
+
1628
+ // dist/mask/shader-module.js
1629
+ var import_core16 = require("@deck.gl/core");
1630
+ var vs4 = `
1631
+ uniform vec4 mask_bounds;
1632
+ uniform bool mask_maskByInstance;
1633
+ vec2 mask_getCoords(vec4 position) {
1634
+ return (position.xy - mask_bounds.xy) / (mask_bounds.zw - mask_bounds.xy);
1635
+ }
1636
+ `;
1637
+ var fs3 = `
1638
+ uniform sampler2D mask_texture;
1639
+ uniform int mask_channel;
1640
+ uniform bool mask_enabled;
1641
+ uniform bool mask_inverted;
1642
+ bool mask_isInBounds(vec2 texCoords) {
1643
+ if (!mask_enabled) {
1644
+ return true;
1645
+ }
1646
+ vec4 maskColor = texture(mask_texture, texCoords);
1647
+ float maskValue = 1.0;
1648
+ if (mask_channel == 0) {
1649
+ maskValue = maskColor.r;
1650
+ } else if (mask_channel == 1) {
1651
+ maskValue = maskColor.g;
1652
+ } else if (mask_channel == 2) {
1653
+ maskValue = maskColor.b;
1654
+ } else if (mask_channel == 3) {
1655
+ maskValue = maskColor.a;
1656
+ }
1657
+ if (mask_inverted) {
1658
+ return maskValue >= 0.5;
1659
+ } else {
1660
+ return maskValue < 0.5;
1661
+ }
1662
+ }
1663
+ `;
1664
+ var inject5 = {
1665
+ "vs:#decl": `
1666
+ out vec2 mask_texCoords;
1667
+ `,
1668
+ "vs:#main-end": `
1669
+ vec4 mask_common_position;
1670
+ if (mask_maskByInstance) {
1671
+ mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1672
+ } else {
1673
+ mask_common_position = geometry.position;
1674
+ }
1675
+ mask_texCoords = mask_getCoords(mask_common_position);
1676
+ `,
1677
+ "fs:#decl": `
1678
+ in vec2 mask_texCoords;
1679
+ `,
1680
+ "fs:#main-start": `
1681
+ if (mask_enabled) {
1682
+ bool mask = mask_isInBounds(mask_texCoords);
1683
+ fragColor = texture(mask_texture, mask_texCoords);
1684
+ if (!mask) discard;
1685
+ }
1686
+ `
1687
+ };
1688
+ var getMaskUniforms = (opts) => {
1689
+ if (opts && "maskMap" in opts) {
1690
+ return {
1691
+ mask_texture: opts.maskMap
1692
+ };
1693
+ }
1694
+ return {};
1695
+ };
1696
+ var shader_module_default3 = {
1697
+ name: "mask",
1698
+ dependencies: [import_core16.project],
1699
+ vs: vs4,
1700
+ fs: fs3,
1701
+ inject: inject5,
1702
+ getUniforms: getMaskUniforms
1703
+ };
1704
+
1705
+ // dist/mask/mask-effect.js
1706
+ var import_core19 = require("@deck.gl/core");
1707
+ var import_core20 = require("@math.gl/core");
1708
+
1709
+ // dist/mask/mask-pass.js
1710
+ var import_core17 = require("@deck.gl/core");
1711
+ var MASK_BLENDING = {
1712
+ blendColorOperation: "subtract",
1713
+ blendColorSrcFactor: "zero",
1714
+ blendColorDstFactor: "one",
1715
+ blendAlphaOperation: "subtract",
1716
+ blendAlphaSrcFactor: "zero",
1717
+ blendAlphaDstFactor: "one"
1718
+ };
1719
+ var MaskPass = class extends import_core17._LayersPass {
1720
+ constructor(device, props) {
1721
+ super(device, props);
1722
+ const { mapSize = 2048 } = props;
1723
+ this.maskMap = device.createTexture({
1724
+ format: "rgba8unorm",
1725
+ width: mapSize,
1726
+ height: mapSize,
1727
+ sampler: {
1728
+ minFilter: "linear",
1729
+ magFilter: "linear",
1730
+ addressModeU: "clamp-to-edge",
1731
+ addressModeV: "clamp-to-edge"
1732
+ }
1733
+ });
1734
+ this.fbo = device.createFramebuffer({
1735
+ id: "maskmap",
1736
+ width: mapSize,
1737
+ height: mapSize,
1738
+ colorAttachments: [this.maskMap]
1739
+ });
1740
+ }
1741
+ render(options) {
1742
+ const colorMask = 2 ** options.channel;
1743
+ const clearColor = [255, 255, 255, 255];
1744
+ super.render({ ...options, clearColor, colorMask, target: this.fbo, pass: "mask" });
1745
+ }
1746
+ getLayerParameters(layer, layerIndex, viewport) {
1747
+ return {
1748
+ ...layer.props.parameters,
1749
+ blend: true,
1750
+ depthTest: false,
1751
+ ...MASK_BLENDING
1752
+ };
1753
+ }
1754
+ shouldDrawLayer(layer) {
1755
+ return layer.props.operation.includes("mask");
1756
+ }
1757
+ delete() {
1758
+ this.fbo.delete();
1759
+ this.maskMap.delete();
1760
+ }
1761
+ };
1762
+
1763
+ // dist/utils/projection-utils.js
1764
+ var import_core18 = require("@deck.gl/core");
1765
+ function joinLayerBounds(layers, viewport) {
1766
+ const bounds = [Infinity, Infinity, -Infinity, -Infinity];
1767
+ for (const layer of layers) {
1768
+ const layerBounds = layer.getBounds();
1769
+ if (layerBounds) {
1770
+ const bottomLeftCommon = layer.projectPosition(layerBounds[0], { viewport, autoOffset: false });
1771
+ const topRightCommon = layer.projectPosition(layerBounds[1], { viewport, autoOffset: false });
1772
+ bounds[0] = Math.min(bounds[0], bottomLeftCommon[0]);
1773
+ bounds[1] = Math.min(bounds[1], bottomLeftCommon[1]);
1774
+ bounds[2] = Math.max(bounds[2], topRightCommon[0]);
1775
+ bounds[3] = Math.max(bounds[3], topRightCommon[1]);
1776
+ }
1777
+ }
1778
+ if (Number.isFinite(bounds[0])) {
1779
+ return bounds;
1780
+ }
1781
+ return null;
1782
+ }
1783
+ var MAX_VIEWPORT_SIZE = 2048;
1451
1784
  function makeViewport(opts) {
1452
1785
  const { bounds, viewport, border = 0 } = opts;
1453
1786
  const { isGeospatial } = viewport;
@@ -1477,7 +1810,7 @@ function makeViewport(opts) {
1477
1810
  zoom += Math.log2(r);
1478
1811
  }
1479
1812
  }
1480
- return isGeospatial ? new import_core14.WebMercatorViewport({
1813
+ return isGeospatial ? new import_core18.WebMercatorViewport({
1481
1814
  id: viewport.id,
1482
1815
  x: border,
1483
1816
  y: border,
@@ -1487,7 +1820,7 @@ function makeViewport(opts) {
1487
1820
  latitude: centerWorld[1],
1488
1821
  zoom,
1489
1822
  orthographic: true
1490
- }) : new import_core14.OrthographicViewport({
1823
+ }) : new import_core18.OrthographicViewport({
1491
1824
  id: viewport.id,
1492
1825
  x: border,
1493
1826
  y: border,
@@ -1556,14 +1889,16 @@ var MaskEffect = class {
1556
1889
  this.channels = [];
1557
1890
  this.masks = null;
1558
1891
  }
1559
- preRender(device, { layers, layerFilter, viewports, onViewportActive, views, isPicking }) {
1892
+ setup({ device }) {
1893
+ this.dummyMaskMap = device.createTexture({
1894
+ width: 1,
1895
+ height: 1
1896
+ });
1897
+ this.maskPass = new MaskPass(device, { id: "default-mask" });
1898
+ this.maskMap = this.maskPass.maskMap;
1899
+ }
1900
+ preRender({ layers, layerFilter, viewports, onViewportActive, views, isPicking }) {
1560
1901
  let didRender = false;
1561
- if (!this.dummyMaskMap) {
1562
- this.dummyMaskMap = device.createTexture({
1563
- width: 1,
1564
- height: 1
1565
- });
1566
- }
1567
1902
  if (isPicking) {
1568
1903
  return { didRender };
1569
1904
  }
@@ -1574,15 +1909,11 @@ var MaskEffect = class {
1574
1909
  return { didRender };
1575
1910
  }
1576
1911
  this.masks = {};
1577
- if (!this.maskPass) {
1578
- this.maskPass = new MaskPass(device, { id: "default-mask" });
1579
- this.maskMap = this.maskPass.maskMap;
1580
- }
1581
1912
  const channelMap = this._sortMaskChannels(maskLayers);
1582
1913
  const viewport = viewports[0];
1583
1914
  const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);
1584
1915
  if (viewport.resolution !== void 0) {
1585
- import_core15.log.warn("MaskExtension is not supported in GlobeView")();
1916
+ import_core19.log.warn("MaskExtension is not supported in GlobeView")();
1586
1917
  return { didRender };
1587
1918
  }
1588
1919
  for (const maskId in channelMap) {
@@ -1611,7 +1942,7 @@ var MaskEffect = class {
1611
1942
  this.lastViewport = viewport;
1612
1943
  const layerBounds = joinLayerBounds(channelInfo.layers, viewport);
1613
1944
  channelInfo.bounds = layerBounds && getRenderBounds(layerBounds, viewport);
1614
- if (maskChanged || !(0, import_core16.equals)(channelInfo.bounds, oldChannelInfo.bounds)) {
1945
+ if (maskChanged || !(0, import_core20.equals)(channelInfo.bounds, oldChannelInfo.bounds)) {
1615
1946
  const { maskPass, maskMap } = this;
1616
1947
  const maskViewport = layerBounds && makeViewport({
1617
1948
  bounds: channelInfo.bounds,
@@ -1652,7 +1983,7 @@ var MaskEffect = class {
1652
1983
  let channelInfo = channelMap[id];
1653
1984
  if (!channelInfo) {
1654
1985
  if (++channelCount > 4) {
1655
- import_core15.log.warn("Too many mask layers. The max supported is 4")();
1986
+ import_core19.log.warn("Too many mask layers. The max supported is 4")();
1656
1987
  continue;
1657
1988
  }
1658
1989
  channelInfo = {
@@ -1705,301 +2036,6 @@ var MaskEffect = class {
1705
2036
  }
1706
2037
  };
1707
2038
 
1708
- // dist/collision-filter/collision-filter-effect.js
1709
- var DOWNSCALE = 2;
1710
- var CollisionFilterEffect = class {
1711
- constructor() {
1712
- this.id = "collision-filter-effect";
1713
- this.props = null;
1714
- this.useInPicking = true;
1715
- this.order = 1;
1716
- this.channels = {};
1717
- this.collisionFBOs = {};
1718
- }
1719
- preRender(device, { effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats = {} }) {
1720
- var _a;
1721
- if (!this.dummyCollisionMap) {
1722
- this.dummyCollisionMap = device.createTexture({ width: 1, height: 1 });
1723
- }
1724
- if (isPicking) {
1725
- return;
1726
- }
1727
- const collisionLayers = layers.filter(
1728
- ({ props: { visible, collisionEnabled } }) => visible && collisionEnabled
1729
- );
1730
- if (collisionLayers.length === 0) {
1731
- this.channels = {};
1732
- return;
1733
- }
1734
- if (!this.collisionFilterPass) {
1735
- this.collisionFilterPass = new CollisionFilterPass(device, { id: "default-collision-filter" });
1736
- }
1737
- const effects = allEffects == null ? void 0 : allEffects.filter((e) => e.constructor === MaskEffect);
1738
- const maskEffectRendered = (_a = preRenderStats["mask-effect"]) == null ? void 0 : _a.didRender;
1739
- const channels = this._groupByCollisionGroup(device, collisionLayers);
1740
- const viewport = viewports[0];
1741
- const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
1742
- for (const collisionGroup in channels) {
1743
- const collisionFBO = this.collisionFBOs[collisionGroup];
1744
- const renderInfo = channels[collisionGroup];
1745
- const [width, height] = device.canvasContext.getPixelSize();
1746
- collisionFBO.resize({
1747
- width: width / DOWNSCALE,
1748
- height: height / DOWNSCALE
1749
- });
1750
- this._render(renderInfo, {
1751
- effects,
1752
- layerFilter,
1753
- onViewportActive,
1754
- views,
1755
- viewport,
1756
- viewportChanged
1757
- });
1758
- }
1759
- }
1760
- _render(renderInfo, { effects, layerFilter, onViewportActive, views, viewport, viewportChanged }) {
1761
- const { collisionGroup } = renderInfo;
1762
- const oldRenderInfo = this.channels[collisionGroup];
1763
- if (!oldRenderInfo) {
1764
- return;
1765
- }
1766
- const needsRender = viewportChanged || renderInfo === oldRenderInfo || !(0, import_core18._deepEqual)(oldRenderInfo.layers, renderInfo.layers, 1) || renderInfo.layerBounds.some((b, i) => !(0, import_core17.equals)(b, oldRenderInfo.layerBounds[i])) || renderInfo.allLayersLoaded !== oldRenderInfo.allLayersLoaded || renderInfo.layers.some((layer) => layer.props.transitions);
1767
- this.channels[collisionGroup] = renderInfo;
1768
- if (needsRender) {
1769
- this.lastViewport = viewport;
1770
- const collisionFBO = this.collisionFBOs[collisionGroup];
1771
- this.collisionFilterPass.renderCollisionMap(collisionFBO, {
1772
- pass: "collision-filter",
1773
- isPicking: true,
1774
- layers: renderInfo.layers,
1775
- effects,
1776
- layerFilter,
1777
- viewports: viewport ? [viewport] : [],
1778
- onViewportActive,
1779
- views,
1780
- moduleParameters: {
1781
- dummyCollisionMap: this.dummyCollisionMap,
1782
- devicePixelRatio: collisionFBO.device.canvasContext.getDevicePixelRatio() / DOWNSCALE
1783
- }
1784
- });
1785
- }
1786
- }
1787
- _groupByCollisionGroup(device, collisionLayers) {
1788
- const channelMap = {};
1789
- for (const layer of collisionLayers) {
1790
- const { collisionGroup } = layer.props;
1791
- let channelInfo = channelMap[collisionGroup];
1792
- if (!channelInfo) {
1793
- channelInfo = { collisionGroup, layers: [], layerBounds: [], allLayersLoaded: true };
1794
- channelMap[collisionGroup] = channelInfo;
1795
- }
1796
- channelInfo.layers.push(layer);
1797
- channelInfo.layerBounds.push(layer.getBounds());
1798
- if (!layer.isLoaded) {
1799
- channelInfo.allLayersLoaded = false;
1800
- }
1801
- }
1802
- for (const collisionGroup of Object.keys(channelMap)) {
1803
- if (!this.collisionFBOs[collisionGroup]) {
1804
- this.createFBO(device, collisionGroup);
1805
- }
1806
- if (!this.channels[collisionGroup]) {
1807
- this.channels[collisionGroup] = channelMap[collisionGroup];
1808
- }
1809
- }
1810
- for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1811
- if (!channelMap[collisionGroup]) {
1812
- this.destroyFBO(collisionGroup);
1813
- }
1814
- }
1815
- return channelMap;
1816
- }
1817
- getModuleParameters(layer) {
1818
- const { collisionGroup } = layer.props;
1819
- const { collisionFBOs, dummyCollisionMap } = this;
1820
- return { collisionFBO: collisionFBOs[collisionGroup], dummyCollisionMap };
1821
- }
1822
- cleanup() {
1823
- if (this.dummyCollisionMap) {
1824
- this.dummyCollisionMap.delete();
1825
- this.dummyCollisionMap = void 0;
1826
- }
1827
- this.channels = {};
1828
- for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1829
- this.destroyFBO(collisionGroup);
1830
- }
1831
- this.collisionFBOs = {};
1832
- this.lastViewport = void 0;
1833
- }
1834
- createFBO(device, collisionGroup) {
1835
- const { width, height } = device.gl.canvas;
1836
- const collisionMap = device.createTexture({
1837
- format: "rgba8unorm",
1838
- width,
1839
- height,
1840
- sampler: {
1841
- minFilter: "nearest",
1842
- magFilter: "nearest",
1843
- addressModeU: "clamp-to-edge",
1844
- addressModeV: "clamp-to-edge"
1845
- }
1846
- });
1847
- const depthStencilAttachment = device.createTexture({
1848
- format: "depth16unorm",
1849
- width,
1850
- height,
1851
- mipmaps: false,
1852
- dataFormat: 6402,
1853
- type: 5125
1854
- });
1855
- this.collisionFBOs[collisionGroup] = device.createFramebuffer({
1856
- id: `collision-${collisionGroup}`,
1857
- width,
1858
- height,
1859
- colorAttachments: [collisionMap],
1860
- depthStencilAttachment
1861
- });
1862
- }
1863
- destroyFBO(collisionGroup) {
1864
- var _a, _b;
1865
- const fbo = this.collisionFBOs[collisionGroup];
1866
- (_a = fbo.colorAttachments[0]) == null ? void 0 : _a.destroy();
1867
- (_b = fbo.depthStencilAttachment) == null ? void 0 : _b.destroy();
1868
- fbo.destroy();
1869
- delete this.collisionFBOs[collisionGroup];
1870
- }
1871
- };
1872
-
1873
- // dist/collision-filter/collision-filter-extension.js
1874
- var defaultProps6 = {
1875
- getCollisionPriority: { type: "accessor", value: 0 },
1876
- collisionEnabled: true,
1877
- collisionGroup: { type: "string", value: "default" },
1878
- collisionTestProps: {}
1879
- };
1880
- var _CollisionFilterExtension = class extends import_core19.LayerExtension {
1881
- getShaders() {
1882
- return { modules: [shader_module_default2] };
1883
- }
1884
- draw({ uniforms, context, moduleParameters }) {
1885
- const { collisionEnabled } = this.props;
1886
- const { collisionFBO, drawToCollisionMap } = moduleParameters;
1887
- const enabled = collisionEnabled && Boolean(collisionFBO);
1888
- uniforms.collision_enabled = enabled;
1889
- if (drawToCollisionMap) {
1890
- this.props = this.clone(this.props.collisionTestProps).props;
1891
- }
1892
- }
1893
- initializeState(context, extension) {
1894
- var _a;
1895
- if (this.getAttributeManager() === null) {
1896
- return;
1897
- }
1898
- (_a = this.context.deck) == null ? void 0 : _a._addDefaultEffect(new CollisionFilterEffect());
1899
- const attributeManager = this.getAttributeManager();
1900
- attributeManager.add({
1901
- collisionPriorities: {
1902
- size: 1,
1903
- accessor: "getCollisionPriority",
1904
- shaderAttributes: {
1905
- collisionPriorities: { divisor: 0 },
1906
- instanceCollisionPriorities: { divisor: 1 }
1907
- }
1908
- }
1909
- });
1910
- }
1911
- getNeedsPickingBuffer() {
1912
- return this.props.collisionEnabled;
1913
- }
1914
- };
1915
- var CollisionFilterExtension = _CollisionFilterExtension;
1916
- (() => {
1917
- _CollisionFilterExtension.defaultProps = defaultProps6;
1918
- })();
1919
- (() => {
1920
- _CollisionFilterExtension.extensionName = "CollisionFilterExtension";
1921
- })();
1922
-
1923
- // dist/mask/mask-extension.js
1924
- var import_core21 = require("@deck.gl/core");
1925
-
1926
- // dist/mask/shader-module.js
1927
- var import_core20 = require("@deck.gl/core");
1928
- var vs4 = `
1929
- uniform vec4 mask_bounds;
1930
- uniform bool mask_maskByInstance;
1931
- vec2 mask_getCoords(vec4 position) {
1932
- return (position.xy - mask_bounds.xy) / (mask_bounds.zw - mask_bounds.xy);
1933
- }
1934
- `;
1935
- var fs3 = `
1936
- uniform sampler2D mask_texture;
1937
- uniform int mask_channel;
1938
- uniform bool mask_enabled;
1939
- uniform bool mask_inverted;
1940
- bool mask_isInBounds(vec2 texCoords) {
1941
- if (!mask_enabled) {
1942
- return true;
1943
- }
1944
- vec4 maskColor = texture(mask_texture, texCoords);
1945
- float maskValue = 1.0;
1946
- if (mask_channel == 0) {
1947
- maskValue = maskColor.r;
1948
- } else if (mask_channel == 1) {
1949
- maskValue = maskColor.g;
1950
- } else if (mask_channel == 2) {
1951
- maskValue = maskColor.b;
1952
- } else if (mask_channel == 3) {
1953
- maskValue = maskColor.a;
1954
- }
1955
- if (mask_inverted) {
1956
- return maskValue >= 0.5;
1957
- } else {
1958
- return maskValue < 0.5;
1959
- }
1960
- }
1961
- `;
1962
- var inject5 = {
1963
- "vs:#decl": `
1964
- out vec2 mask_texCoords;
1965
- `,
1966
- "vs:#main-end": `
1967
- vec4 mask_common_position;
1968
- if (mask_maskByInstance) {
1969
- mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1970
- } else {
1971
- mask_common_position = geometry.position;
1972
- }
1973
- mask_texCoords = mask_getCoords(mask_common_position);
1974
- `,
1975
- "fs:#decl": `
1976
- in vec2 mask_texCoords;
1977
- `,
1978
- "fs:#main-start": `
1979
- if (mask_enabled) {
1980
- bool mask = mask_isInBounds(mask_texCoords);
1981
- fragColor = texture(mask_texture, mask_texCoords);
1982
- if (!mask) discard;
1983
- }
1984
- `
1985
- };
1986
- var getMaskUniforms = (opts) => {
1987
- if (opts && "maskMap" in opts) {
1988
- return {
1989
- mask_texture: opts.maskMap
1990
- };
1991
- }
1992
- return {};
1993
- };
1994
- var shader_module_default3 = {
1995
- name: "mask",
1996
- dependencies: [import_core20.project],
1997
- vs: vs4,
1998
- fs: fs3,
1999
- inject: inject5,
2000
- getUniforms: getMaskUniforms
2001
- };
2002
-
2003
2039
  // dist/mask/mask-extension.js
2004
2040
  var defaultProps7 = {
2005
2041
  maskId: "",
@@ -2177,22 +2213,24 @@ return;
2177
2213
  };
2178
2214
 
2179
2215
  // dist/terrain/utils.js
2180
- var import_constants3 = require("@luma.gl/constants");
2216
+ var import_constants2 = require("@luma.gl/constants");
2181
2217
  function createRenderTarget(device, opts) {
2182
2218
  return device.createFramebuffer({
2183
2219
  id: opts.id,
2184
2220
  colorAttachments: [
2185
2221
  device.createTexture({
2222
+ id: opts.id,
2186
2223
  ...opts.float && {
2187
2224
  format: "rgba32float",
2188
2225
  type: 5126
2189
2226
  },
2190
2227
  mipmaps: false,
2191
- sampler: {
2228
+ sampler: opts.interpolate === false ? {
2229
+ minFilter: "nearest",
2230
+ magFilter: "nearest"
2231
+ } : {
2192
2232
  minFilter: "linear",
2193
- magFilter: "linear",
2194
- addressModeU: "clamp-to-edge",
2195
- addressModeV: "clamp-to-edge"
2233
+ magFilter: "linear"
2196
2234
  }
2197
2235
  })
2198
2236
  ]
@@ -2312,7 +2350,8 @@ var TerrainCover = class {
2312
2350
  }
2313
2351
  if (!this.pickingFbo) {
2314
2352
  this.pickingFbo = createRenderTarget(this.targetLayer.context.device, {
2315
- id: `${this.id}-picking`
2353
+ id: `${this.id}-picking`,
2354
+ interpolate: false
2316
2355
  });
2317
2356
  }
2318
2357
  return this.pickingFbo;
@@ -2359,8 +2398,15 @@ function intersect(b1, b2) {
2359
2398
  }
2360
2399
 
2361
2400
  // dist/terrain/terrain-pass.js
2362
- var import_constants4 = require("@luma.gl/constants");
2363
2401
  var import_core23 = require("@deck.gl/core");
2402
+ var TERRAIN_BLENDING = {
2403
+ blendColorOperation: "max",
2404
+ blendColorSrcFactor: "one",
2405
+ blendColorDstFactor: "one",
2406
+ blendAlphaOperation: "max",
2407
+ blendAlphaSrcFactor: "one",
2408
+ blendAlphaDstFactor: "one"
2409
+ };
2364
2410
  var TerrainPass = class extends import_core23._LayersPass {
2365
2411
  getRenderableLayers(viewport, opts) {
2366
2412
  const { layers } = opts;
@@ -2381,20 +2427,15 @@ var TerrainPass = class extends import_core23._LayersPass {
2381
2427
  return;
2382
2428
  }
2383
2429
  target.resize(viewport);
2384
- this.device.withParametersWebGL({
2385
- clearColor: [0, 0, 0, 0],
2386
- blend: true,
2387
- blendFunc: [1, 1],
2388
- blendEquation: 32776,
2389
- depthTest: false
2390
- }, () => this.render({
2430
+ this.render({
2391
2431
  ...opts,
2392
2432
  target,
2393
2433
  pass: "terrain-height-map",
2394
2434
  layers: opts.layers,
2395
2435
  viewports: [viewport],
2396
- effects: []
2397
- }));
2436
+ effects: [],
2437
+ clearColor: [0, 0, 0, 0]
2438
+ });
2398
2439
  }
2399
2440
  renderTerrainCover(terrainCover, opts) {
2400
2441
  const target = terrainCover.getRenderFramebuffer();
@@ -2404,17 +2445,23 @@ var TerrainPass = class extends import_core23._LayersPass {
2404
2445
  }
2405
2446
  const layers = terrainCover.filterLayers(opts.layers);
2406
2447
  target.resize(viewport);
2407
- this.device.withParametersWebGL({
2408
- clearColor: [0, 0, 0, 0],
2409
- depthTest: false
2410
- }, () => this.render({
2448
+ this.render({
2411
2449
  ...opts,
2412
2450
  target,
2413
2451
  pass: `terrain-cover-${terrainCover.id}`,
2414
2452
  layers,
2415
2453
  effects: [],
2416
- viewports: [viewport]
2417
- }));
2454
+ viewports: [viewport],
2455
+ clearColor: [0, 0, 0, 0]
2456
+ });
2457
+ }
2458
+ getLayerParameters(layer, layerIndex, viewport) {
2459
+ return {
2460
+ ...layer.props.parameters,
2461
+ blend: true,
2462
+ depthTest: false,
2463
+ ...layer.props.operation.includes("terrain") && TERRAIN_BLENDING
2464
+ };
2418
2465
  }
2419
2466
  };
2420
2467
 
@@ -2452,9 +2499,7 @@ var TerrainPickingPass = class extends import_core24._PickLayersPass {
2452
2499
  layers.unshift(terrainLayer);
2453
2500
  }
2454
2501
  target.resize(viewport);
2455
- this.device.withParametersWebGL({
2456
- depthTest: false
2457
- }, () => this.render({
2502
+ this.render({
2458
2503
  ...opts,
2459
2504
  pickingFBO: target,
2460
2505
  pass: `terrain-cover-picking-${terrainCover.id}`,
@@ -2464,15 +2509,17 @@ var TerrainPickingPass = class extends import_core24._PickLayersPass {
2464
2509
  cullRect: void 0,
2465
2510
  deviceRect: viewport,
2466
2511
  pickZ: false
2467
- }));
2512
+ });
2468
2513
  }
2469
2514
  getLayerParameters(layer, layerIndex, viewport) {
2515
+ let parameters2;
2470
2516
  if (this.drawParameters[layer.id]) {
2471
- return this.drawParameters[layer.id];
2517
+ parameters2 = this.drawParameters[layer.id];
2518
+ } else {
2519
+ parameters2 = super.getLayerParameters(layer, layerIndex, viewport);
2520
+ parameters2.blend = true;
2472
2521
  }
2473
- const parameters2 = super.getLayerParameters(layer, layerIndex, viewport);
2474
- parameters2.blend = true;
2475
- return parameters2;
2522
+ return { ...parameters2, depthTest: false };
2476
2523
  }
2477
2524
  };
2478
2525
 
@@ -2555,7 +2602,7 @@ var TerrainEffect = class {
2555
2602
  this.isDrapingEnabled = false;
2556
2603
  this.terrainCovers = /* @__PURE__ */ new Map();
2557
2604
  }
2558
- initialize(device) {
2605
+ setup({ device, deck }) {
2559
2606
  this.dummyHeightMap = device.createTexture({
2560
2607
  width: 1,
2561
2608
  height: 1,
@@ -2568,17 +2615,9 @@ var TerrainEffect = class {
2568
2615
  } else {
2569
2616
  import_core25.log.warn("Terrain offset mode is not supported by this browser")();
2570
2617
  }
2571
- (0, import_core25.getShaderAssembler)().addDefaultModule(terrainModule);
2618
+ deck._addDefaultShaderModule(terrainModule);
2572
2619
  }
2573
- preRender(device, opts) {
2574
- if (!this.dummyHeightMap) {
2575
- this.initialize(device);
2576
- for (const layer of opts.layers) {
2577
- if (layer.props.operation.includes("terrain")) {
2578
- layer.setChangeFlags({ extensionsChanged: true });
2579
- }
2580
- }
2581
- }
2620
+ preRender(opts) {
2582
2621
  if (opts.pickZ) {
2583
2622
  this.isDrapingEnabled = false;
2584
2623
  return;
@@ -2614,7 +2653,7 @@ var TerrainEffect = class {
2614
2653
  terrainSkipRender: terrainDrawMode === "drape" || !layer.props.operation.includes("draw")
2615
2654
  };
2616
2655
  }
2617
- cleanup() {
2656
+ cleanup({ deck }) {
2618
2657
  if (this.dummyHeightMap) {
2619
2658
  this.dummyHeightMap.delete();
2620
2659
  this.dummyHeightMap = void 0;
@@ -2627,7 +2666,7 @@ var TerrainEffect = class {
2627
2666
  terrainCover.delete();
2628
2667
  }
2629
2668
  this.terrainCovers.clear();
2630
- (0, import_core25.getShaderAssembler)().removeDefaultModule(terrainModule);
2669
+ deck._removeDefaultShaderModule(terrainModule);
2631
2670
  }
2632
2671
  _updateHeightMap(terrainLayers, viewport, opts) {
2633
2672
  if (!this.heightMap) {