@deck.gl/extensions 9.0.0-beta.9 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/collision-filter/collision-filter-effect.d.ts +4 -2
  2. package/dist/collision-filter/collision-filter-effect.d.ts.map +1 -1
  3. package/dist/collision-filter/collision-filter-effect.js +10 -9
  4. package/dist/collision-filter/collision-filter-pass.d.ts +3 -2
  5. package/dist/collision-filter/collision-filter-pass.d.ts.map +1 -1
  6. package/dist/collision-filter/collision-filter-pass.js +5 -7
  7. package/dist/data-filter/data-filter-extension.d.ts +1 -1
  8. package/dist/data-filter/data-filter-extension.d.ts.map +1 -1
  9. package/dist/data-filter/data-filter-extension.js +1 -1
  10. package/dist/dist.dev.js +475 -479
  11. package/dist/fill-style/fill-style-extension.d.ts +2 -30
  12. package/dist/fill-style/fill-style-extension.d.ts.map +1 -1
  13. package/dist/fill-style/fill-style-extension.js +1 -3
  14. package/dist/index.cjs +427 -421
  15. package/dist/index.cjs.map +4 -4
  16. package/dist/mask/mask-effect.d.ts +5 -4
  17. package/dist/mask/mask-effect.d.ts.map +1 -1
  18. package/dist/mask/mask-effect.js +9 -11
  19. package/dist/mask/mask-pass.d.ts +4 -3
  20. package/dist/mask/mask-pass.d.ts.map +1 -1
  21. package/dist/mask/mask-pass.js +17 -9
  22. package/dist/path-style/path-style-extension.d.ts.map +1 -1
  23. package/dist/path-style/path-style-extension.js +1 -0
  24. package/dist/terrain/terrain-effect.d.ts +4 -5
  25. package/dist/terrain/terrain-effect.d.ts.map +1 -1
  26. package/dist/terrain/terrain-effect.js +6 -15
  27. package/dist/terrain/terrain-pass.d.ts +1 -0
  28. package/dist/terrain/terrain-pass.d.ts.map +1 -1
  29. package/dist/terrain/terrain-pass.js +24 -16
  30. package/dist/terrain/terrain-picking-pass.d.ts.map +1 -1
  31. package/dist/terrain/terrain-picking-pass.js +9 -8
  32. package/dist/terrain/utils.d.ts.map +1 -1
  33. package/dist/terrain/utils.js +1 -0
  34. package/dist.min.js +23 -23
  35. package/package.json +5 -5
  36. package/src/collision-filter/collision-filter-effect.ts +22 -22
  37. package/src/collision-filter/collision-filter-pass.ts +7 -11
  38. package/src/data-filter/data-filter-extension.ts +1 -1
  39. package/src/fill-style/fill-style-extension.ts +3 -4
  40. package/src/mask/mask-effect.ts +30 -19
  41. package/src/mask/mask-pass.ts +22 -16
  42. package/src/path-style/path-style-extension.ts +1 -0
  43. package/src/terrain/terrain-effect.ts +9 -18
  44. package/src/terrain/terrain-pass.ts +37 -34
  45. package/src/terrain/terrain-picking-pass.ts +19 -23
  46. package/src/terrain/utils.ts +1 -0
package/dist/index.cjs CHANGED
@@ -488,7 +488,7 @@ var DATA_TYPE_FROM_SIZE = {
488
488
  4: "vec4"
489
489
  };
490
490
  var _DataFilterExtension = class extends import_core3.LayerExtension {
491
- constructor(opts) {
491
+ constructor(opts = {}) {
492
492
  super({ ...defaultOptions, ...opts });
493
493
  }
494
494
  getShaders(extension) {
@@ -944,6 +944,7 @@ var _PathStyleExtension = class extends import_core6.LayerExtension {
944
944
  }
945
945
  prevP = p;
946
946
  }
947
+ result[geometrySize - 1] = 0;
947
948
  return result;
948
949
  }
949
950
  };
@@ -1058,9 +1059,7 @@ var defaultProps4 = {
1058
1059
  type: "image",
1059
1060
  value: null,
1060
1061
  async: true,
1061
- parameters: {
1062
- minFilter: "linear"
1063
- }
1062
+ parameters: { lodMaxClamp: 0 }
1064
1063
  },
1065
1064
  fillPatternMapping: { type: "object", value: {}, async: true },
1066
1065
  fillPatternMask: true,
@@ -1261,7 +1260,7 @@ var ClipExtension = _ClipExtension;
1261
1260
  })();
1262
1261
 
1263
1262
  // dist/collision-filter/collision-filter-extension.js
1264
- var import_core19 = require("@deck.gl/core");
1263
+ var import_core15 = require("@deck.gl/core");
1265
1264
 
1266
1265
  // dist/collision-filter/shader-module.js
1267
1266
  var import_core11 = require("@deck.gl/core");
@@ -1350,8 +1349,8 @@ var shader_module_default2 = {
1350
1349
  };
1351
1350
 
1352
1351
  // dist/collision-filter/collision-filter-effect.js
1353
- var import_core17 = require("@math.gl/core");
1354
- var import_core18 = require("@deck.gl/core");
1352
+ var import_core13 = require("@math.gl/core");
1353
+ var import_core14 = require("@deck.gl/core");
1355
1354
 
1356
1355
  // dist/collision-filter/collision-filter-pass.js
1357
1356
  var import_core12 = require("@deck.gl/core");
@@ -1359,13 +1358,11 @@ var CollisionFilterPass = class extends import_core12._LayersPass {
1359
1358
  renderCollisionMap(target, options) {
1360
1359
  const padding = 1;
1361
1360
  const clearColor = [0, 0, 0, 0];
1362
- return this.device.withParametersWebGL({
1363
- scissorTest: true,
1364
- scissor: [padding, padding, target.width - 2 * padding, target.height - 2 * padding],
1365
- blend: false,
1366
- depthTest: true,
1367
- depthRange: [0, 1]
1368
- }, () => this.render({ ...options, clearColor, target, pass: "collision" }));
1361
+ const scissorRect = [padding, padding, target.width - 2 * padding, target.height - 2 * padding];
1362
+ this.render({ ...options, clearColor, scissorRect, target, pass: "collision" });
1363
+ }
1364
+ getLayerParameters(layer, layerIndex, viewport) {
1365
+ return { ...layer.props.parameters, blend: false, depthRange: [0, 1], depthTest: true };
1369
1366
  }
1370
1367
  getModuleParameters() {
1371
1368
  return {
@@ -1379,14 +1376,317 @@ var CollisionFilterPass = class extends import_core12._LayersPass {
1379
1376
  }
1380
1377
  };
1381
1378
 
1379
+ // dist/collision-filter/collision-filter-effect.js
1380
+ var DOWNSCALE = 2;
1381
+ var CollisionFilterEffect = class {
1382
+ constructor() {
1383
+ this.id = "collision-filter-effect";
1384
+ this.props = null;
1385
+ this.useInPicking = true;
1386
+ this.order = 1;
1387
+ this.channels = {};
1388
+ this.collisionFBOs = {};
1389
+ }
1390
+ setup(context) {
1391
+ this.context = context;
1392
+ const { device } = context;
1393
+ this.dummyCollisionMap = device.createTexture({ width: 1, height: 1 });
1394
+ this.collisionFilterPass = new CollisionFilterPass(device, { id: "default-collision-filter" });
1395
+ }
1396
+ preRender({ effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats = {} }) {
1397
+ var _a;
1398
+ const { device } = this.context;
1399
+ if (isPicking) {
1400
+ return;
1401
+ }
1402
+ const collisionLayers = layers.filter(
1403
+ ({ props: { visible, collisionEnabled } }) => visible && collisionEnabled
1404
+ );
1405
+ if (collisionLayers.length === 0) {
1406
+ this.channels = {};
1407
+ return;
1408
+ }
1409
+ const effects = allEffects == null ? void 0 : allEffects.filter((e) => e.useInPicking && preRenderStats[e.id]);
1410
+ const maskEffectRendered = (_a = preRenderStats["mask-effect"]) == null ? void 0 : _a.didRender;
1411
+ const channels = this._groupByCollisionGroup(device, collisionLayers);
1412
+ const viewport = viewports[0];
1413
+ const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
1414
+ for (const collisionGroup in channels) {
1415
+ const collisionFBO = this.collisionFBOs[collisionGroup];
1416
+ const renderInfo = channels[collisionGroup];
1417
+ const [width, height] = device.canvasContext.getPixelSize();
1418
+ collisionFBO.resize({
1419
+ width: width / DOWNSCALE,
1420
+ height: height / DOWNSCALE
1421
+ });
1422
+ this._render(renderInfo, {
1423
+ effects,
1424
+ layerFilter,
1425
+ onViewportActive,
1426
+ views,
1427
+ viewport,
1428
+ viewportChanged
1429
+ });
1430
+ }
1431
+ }
1432
+ _render(renderInfo, { effects, layerFilter, onViewportActive, views, viewport, viewportChanged }) {
1433
+ const { collisionGroup } = renderInfo;
1434
+ const oldRenderInfo = this.channels[collisionGroup];
1435
+ if (!oldRenderInfo) {
1436
+ return;
1437
+ }
1438
+ 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);
1439
+ this.channels[collisionGroup] = renderInfo;
1440
+ if (needsRender) {
1441
+ this.lastViewport = viewport;
1442
+ const collisionFBO = this.collisionFBOs[collisionGroup];
1443
+ this.collisionFilterPass.renderCollisionMap(collisionFBO, {
1444
+ pass: "collision-filter",
1445
+ isPicking: true,
1446
+ layers: renderInfo.layers,
1447
+ effects,
1448
+ layerFilter,
1449
+ viewports: viewport ? [viewport] : [],
1450
+ onViewportActive,
1451
+ views,
1452
+ moduleParameters: {
1453
+ dummyCollisionMap: this.dummyCollisionMap,
1454
+ devicePixelRatio: collisionFBO.device.canvasContext.getDevicePixelRatio() / DOWNSCALE
1455
+ }
1456
+ });
1457
+ }
1458
+ }
1459
+ _groupByCollisionGroup(device, collisionLayers) {
1460
+ const channelMap = {};
1461
+ for (const layer of collisionLayers) {
1462
+ const { collisionGroup } = layer.props;
1463
+ let channelInfo = channelMap[collisionGroup];
1464
+ if (!channelInfo) {
1465
+ channelInfo = { collisionGroup, layers: [], layerBounds: [], allLayersLoaded: true };
1466
+ channelMap[collisionGroup] = channelInfo;
1467
+ }
1468
+ channelInfo.layers.push(layer);
1469
+ channelInfo.layerBounds.push(layer.getBounds());
1470
+ if (!layer.isLoaded) {
1471
+ channelInfo.allLayersLoaded = false;
1472
+ }
1473
+ }
1474
+ for (const collisionGroup of Object.keys(channelMap)) {
1475
+ if (!this.collisionFBOs[collisionGroup]) {
1476
+ this.createFBO(device, collisionGroup);
1477
+ }
1478
+ if (!this.channels[collisionGroup]) {
1479
+ this.channels[collisionGroup] = channelMap[collisionGroup];
1480
+ }
1481
+ }
1482
+ for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1483
+ if (!channelMap[collisionGroup]) {
1484
+ this.destroyFBO(collisionGroup);
1485
+ }
1486
+ }
1487
+ return channelMap;
1488
+ }
1489
+ getModuleParameters(layer) {
1490
+ const { collisionGroup } = layer.props;
1491
+ const { collisionFBOs, dummyCollisionMap } = this;
1492
+ return { collisionFBO: collisionFBOs[collisionGroup], dummyCollisionMap };
1493
+ }
1494
+ cleanup() {
1495
+ if (this.dummyCollisionMap) {
1496
+ this.dummyCollisionMap.delete();
1497
+ this.dummyCollisionMap = void 0;
1498
+ }
1499
+ this.channels = {};
1500
+ for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1501
+ this.destroyFBO(collisionGroup);
1502
+ }
1503
+ this.collisionFBOs = {};
1504
+ this.lastViewport = void 0;
1505
+ }
1506
+ createFBO(device, collisionGroup) {
1507
+ const { width, height } = device.gl.canvas;
1508
+ const collisionMap = device.createTexture({
1509
+ format: "rgba8unorm",
1510
+ width,
1511
+ height,
1512
+ sampler: {
1513
+ minFilter: "nearest",
1514
+ magFilter: "nearest",
1515
+ addressModeU: "clamp-to-edge",
1516
+ addressModeV: "clamp-to-edge"
1517
+ }
1518
+ });
1519
+ const depthStencilAttachment = device.createTexture({
1520
+ format: "depth16unorm",
1521
+ width,
1522
+ height,
1523
+ mipmaps: false,
1524
+ dataFormat: 6402,
1525
+ type: 5125
1526
+ });
1527
+ this.collisionFBOs[collisionGroup] = device.createFramebuffer({
1528
+ id: `collision-${collisionGroup}`,
1529
+ width,
1530
+ height,
1531
+ colorAttachments: [collisionMap],
1532
+ depthStencilAttachment
1533
+ });
1534
+ }
1535
+ destroyFBO(collisionGroup) {
1536
+ var _a, _b;
1537
+ const fbo = this.collisionFBOs[collisionGroup];
1538
+ (_a = fbo.colorAttachments[0]) == null ? void 0 : _a.destroy();
1539
+ (_b = fbo.depthStencilAttachment) == null ? void 0 : _b.destroy();
1540
+ fbo.destroy();
1541
+ delete this.collisionFBOs[collisionGroup];
1542
+ }
1543
+ };
1544
+
1545
+ // dist/collision-filter/collision-filter-extension.js
1546
+ var defaultProps6 = {
1547
+ getCollisionPriority: { type: "accessor", value: 0 },
1548
+ collisionEnabled: true,
1549
+ collisionGroup: { type: "string", value: "default" },
1550
+ collisionTestProps: {}
1551
+ };
1552
+ var _CollisionFilterExtension = class extends import_core15.LayerExtension {
1553
+ getShaders() {
1554
+ return { modules: [shader_module_default2] };
1555
+ }
1556
+ draw({ uniforms, context, moduleParameters }) {
1557
+ const { collisionEnabled } = this.props;
1558
+ const { collisionFBO, drawToCollisionMap } = moduleParameters;
1559
+ const enabled = collisionEnabled && Boolean(collisionFBO);
1560
+ uniforms.collision_enabled = enabled;
1561
+ if (drawToCollisionMap) {
1562
+ this.props = this.clone(this.props.collisionTestProps).props;
1563
+ }
1564
+ }
1565
+ initializeState(context, extension) {
1566
+ var _a;
1567
+ if (this.getAttributeManager() === null) {
1568
+ return;
1569
+ }
1570
+ (_a = this.context.deck) == null ? void 0 : _a._addDefaultEffect(new CollisionFilterEffect());
1571
+ const attributeManager = this.getAttributeManager();
1572
+ attributeManager.add({
1573
+ collisionPriorities: {
1574
+ size: 1,
1575
+ accessor: "getCollisionPriority",
1576
+ shaderAttributes: {
1577
+ collisionPriorities: { divisor: 0 },
1578
+ instanceCollisionPriorities: { divisor: 1 }
1579
+ }
1580
+ }
1581
+ });
1582
+ }
1583
+ getNeedsPickingBuffer() {
1584
+ return this.props.collisionEnabled;
1585
+ }
1586
+ };
1587
+ var CollisionFilterExtension = _CollisionFilterExtension;
1588
+ (() => {
1589
+ _CollisionFilterExtension.defaultProps = defaultProps6;
1590
+ })();
1591
+ (() => {
1592
+ _CollisionFilterExtension.extensionName = "CollisionFilterExtension";
1593
+ })();
1594
+
1595
+ // dist/mask/mask-extension.js
1596
+ var import_core21 = require("@deck.gl/core");
1597
+
1598
+ // dist/mask/shader-module.js
1599
+ var import_core16 = require("@deck.gl/core");
1600
+ var vs4 = `
1601
+ uniform vec4 mask_bounds;
1602
+ uniform bool mask_maskByInstance;
1603
+ vec2 mask_getCoords(vec4 position) {
1604
+ return (position.xy - mask_bounds.xy) / (mask_bounds.zw - mask_bounds.xy);
1605
+ }
1606
+ `;
1607
+ var fs3 = `
1608
+ uniform sampler2D mask_texture;
1609
+ uniform int mask_channel;
1610
+ uniform bool mask_enabled;
1611
+ uniform bool mask_inverted;
1612
+ bool mask_isInBounds(vec2 texCoords) {
1613
+ if (!mask_enabled) {
1614
+ return true;
1615
+ }
1616
+ vec4 maskColor = texture(mask_texture, texCoords);
1617
+ float maskValue = 1.0;
1618
+ if (mask_channel == 0) {
1619
+ maskValue = maskColor.r;
1620
+ } else if (mask_channel == 1) {
1621
+ maskValue = maskColor.g;
1622
+ } else if (mask_channel == 2) {
1623
+ maskValue = maskColor.b;
1624
+ } else if (mask_channel == 3) {
1625
+ maskValue = maskColor.a;
1626
+ }
1627
+ if (mask_inverted) {
1628
+ return maskValue >= 0.5;
1629
+ } else {
1630
+ return maskValue < 0.5;
1631
+ }
1632
+ }
1633
+ `;
1634
+ var inject5 = {
1635
+ "vs:#decl": `
1636
+ out vec2 mask_texCoords;
1637
+ `,
1638
+ "vs:#main-end": `
1639
+ vec4 mask_common_position;
1640
+ if (mask_maskByInstance) {
1641
+ mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1642
+ } else {
1643
+ mask_common_position = geometry.position;
1644
+ }
1645
+ mask_texCoords = mask_getCoords(mask_common_position);
1646
+ `,
1647
+ "fs:#decl": `
1648
+ in vec2 mask_texCoords;
1649
+ `,
1650
+ "fs:#main-start": `
1651
+ if (mask_enabled) {
1652
+ bool mask = mask_isInBounds(mask_texCoords);
1653
+ fragColor = texture(mask_texture, mask_texCoords);
1654
+ if (!mask) discard;
1655
+ }
1656
+ `
1657
+ };
1658
+ var getMaskUniforms = (opts) => {
1659
+ if (opts && "maskMap" in opts) {
1660
+ return {
1661
+ mask_texture: opts.maskMap
1662
+ };
1663
+ }
1664
+ return {};
1665
+ };
1666
+ var shader_module_default3 = {
1667
+ name: "mask",
1668
+ dependencies: [import_core16.project],
1669
+ vs: vs4,
1670
+ fs: fs3,
1671
+ inject: inject5,
1672
+ getUniforms: getMaskUniforms
1673
+ };
1674
+
1382
1675
  // dist/mask/mask-effect.js
1383
- var import_core15 = require("@deck.gl/core");
1384
- var import_core16 = require("@math.gl/core");
1676
+ var import_core19 = require("@deck.gl/core");
1677
+ var import_core20 = require("@math.gl/core");
1385
1678
 
1386
1679
  // dist/mask/mask-pass.js
1387
- var import_constants2 = require("@luma.gl/constants");
1388
- var import_core13 = require("@deck.gl/core");
1389
- var MaskPass = class extends import_core13._LayersPass {
1680
+ var import_core17 = require("@deck.gl/core");
1681
+ var MASK_BLENDING = {
1682
+ blendColorOperation: "subtract",
1683
+ blendColorSrcFactor: "zero",
1684
+ blendColorDstFactor: "one",
1685
+ blendAlphaOperation: "subtract",
1686
+ blendAlphaSrcFactor: "zero",
1687
+ blendAlphaDstFactor: "one"
1688
+ };
1689
+ var MaskPass = class extends import_core17._LayersPass {
1390
1690
  constructor(device, props) {
1391
1691
  super(device, props);
1392
1692
  const { mapSize = 2048 } = props;
@@ -1409,16 +1709,17 @@ var MaskPass = class extends import_core13._LayersPass {
1409
1709
  });
1410
1710
  }
1411
1711
  render(options) {
1412
- const colorMask = [false, false, false, false];
1413
- colorMask[options.channel] = true;
1712
+ const colorMask = 2 ** options.channel;
1414
1713
  const clearColor = [255, 255, 255, 255];
1415
- return this.device.withParametersWebGL({
1714
+ super.render({ ...options, clearColor, colorMask, target: this.fbo, pass: "mask" });
1715
+ }
1716
+ getLayerParameters(layer, layerIndex, viewport) {
1717
+ return {
1718
+ ...layer.props.parameters,
1416
1719
  blend: true,
1417
- blendFunc: [0, 1],
1418
- blendEquation: 32778,
1419
- colorMask,
1420
- depthTest: false
1421
- }, () => super.render({ ...options, clearColor, target: this.fbo, pass: "mask" }));
1720
+ depthTest: false,
1721
+ ...MASK_BLENDING
1722
+ };
1422
1723
  }
1423
1724
  shouldDrawLayer(layer) {
1424
1725
  return layer.props.operation.includes("mask");
@@ -1430,7 +1731,7 @@ var MaskPass = class extends import_core13._LayersPass {
1430
1731
  };
1431
1732
 
1432
1733
  // dist/utils/projection-utils.js
1433
- var import_core14 = require("@deck.gl/core");
1734
+ var import_core18 = require("@deck.gl/core");
1434
1735
  function joinLayerBounds(layers, viewport) {
1435
1736
  const bounds = [Infinity, Infinity, -Infinity, -Infinity];
1436
1737
  for (const layer of layers) {
@@ -1479,7 +1780,7 @@ function makeViewport(opts) {
1479
1780
  zoom += Math.log2(r);
1480
1781
  }
1481
1782
  }
1482
- return isGeospatial ? new import_core14.WebMercatorViewport({
1783
+ return isGeospatial ? new import_core18.WebMercatorViewport({
1483
1784
  id: viewport.id,
1484
1785
  x: border,
1485
1786
  y: border,
@@ -1489,7 +1790,7 @@ function makeViewport(opts) {
1489
1790
  latitude: centerWorld[1],
1490
1791
  zoom,
1491
1792
  orthographic: true
1492
- }) : new import_core14.OrthographicViewport({
1793
+ }) : new import_core18.OrthographicViewport({
1493
1794
  id: viewport.id,
1494
1795
  x: border,
1495
1796
  y: border,
@@ -1558,14 +1859,16 @@ var MaskEffect = class {
1558
1859
  this.channels = [];
1559
1860
  this.masks = null;
1560
1861
  }
1561
- preRender(device, { layers, layerFilter, viewports, onViewportActive, views, isPicking }) {
1862
+ setup({ device }) {
1863
+ this.dummyMaskMap = device.createTexture({
1864
+ width: 1,
1865
+ height: 1
1866
+ });
1867
+ this.maskPass = new MaskPass(device, { id: "default-mask" });
1868
+ this.maskMap = this.maskPass.maskMap;
1869
+ }
1870
+ preRender({ layers, layerFilter, viewports, onViewportActive, views, isPicking }) {
1562
1871
  let didRender = false;
1563
- if (!this.dummyMaskMap) {
1564
- this.dummyMaskMap = device.createTexture({
1565
- width: 1,
1566
- height: 1
1567
- });
1568
- }
1569
1872
  if (isPicking) {
1570
1873
  return { didRender };
1571
1874
  }
@@ -1576,15 +1879,11 @@ var MaskEffect = class {
1576
1879
  return { didRender };
1577
1880
  }
1578
1881
  this.masks = {};
1579
- if (!this.maskPass) {
1580
- this.maskPass = new MaskPass(device, { id: "default-mask" });
1581
- this.maskMap = this.maskPass.maskMap;
1582
- }
1583
1882
  const channelMap = this._sortMaskChannels(maskLayers);
1584
1883
  const viewport = viewports[0];
1585
1884
  const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport);
1586
1885
  if (viewport.resolution !== void 0) {
1587
- import_core15.log.warn("MaskExtension is not supported in GlobeView")();
1886
+ import_core19.log.warn("MaskExtension is not supported in GlobeView")();
1588
1887
  return { didRender };
1589
1888
  }
1590
1889
  for (const maskId in channelMap) {
@@ -1613,7 +1912,7 @@ var MaskEffect = class {
1613
1912
  this.lastViewport = viewport;
1614
1913
  const layerBounds = joinLayerBounds(channelInfo.layers, viewport);
1615
1914
  channelInfo.bounds = layerBounds && getRenderBounds(layerBounds, viewport);
1616
- if (maskChanged || !(0, import_core16.equals)(channelInfo.bounds, oldChannelInfo.bounds)) {
1915
+ if (maskChanged || !(0, import_core20.equals)(channelInfo.bounds, oldChannelInfo.bounds)) {
1617
1916
  const { maskPass, maskMap } = this;
1618
1917
  const maskViewport = layerBounds && makeViewport({
1619
1918
  bounds: channelInfo.bounds,
@@ -1640,366 +1939,71 @@ var MaskEffect = class {
1640
1939
  }
1641
1940
  this.masks[channelInfo.id] = {
1642
1941
  index: channelInfo.index,
1643
- bounds: channelInfo.maskBounds,
1644
- coordinateOrigin: channelInfo.coordinateOrigin,
1645
- coordinateSystem: channelInfo.coordinateSystem
1646
- };
1647
- return didRender;
1648
- }
1649
- _sortMaskChannels(maskLayers) {
1650
- const channelMap = {};
1651
- let channelCount = 0;
1652
- for (const layer of maskLayers) {
1653
- const { id } = layer.root;
1654
- let channelInfo = channelMap[id];
1655
- if (!channelInfo) {
1656
- if (++channelCount > 4) {
1657
- import_core15.log.warn("Too many mask layers. The max supported is 4")();
1658
- continue;
1659
- }
1660
- channelInfo = {
1661
- id,
1662
- index: this.channels.findIndex((c) => (c == null ? void 0 : c.id) === id),
1663
- layers: [],
1664
- layerBounds: [],
1665
- coordinateOrigin: layer.root.props.coordinateOrigin,
1666
- coordinateSystem: layer.root.props.coordinateSystem
1667
- };
1668
- channelMap[id] = channelInfo;
1669
- }
1670
- channelInfo.layers.push(layer);
1671
- channelInfo.layerBounds.push(layer.getBounds());
1672
- }
1673
- for (let i = 0; i < 4; i++) {
1674
- const channelInfo = this.channels[i];
1675
- if (!channelInfo || !(channelInfo.id in channelMap)) {
1676
- this.channels[i] = null;
1677
- }
1678
- }
1679
- for (const maskId in channelMap) {
1680
- const channelInfo = channelMap[maskId];
1681
- if (channelInfo.index < 0) {
1682
- channelInfo.index = this.channels.findIndex((c) => !c);
1683
- this.channels[channelInfo.index] = channelInfo;
1684
- }
1685
- }
1686
- return channelMap;
1687
- }
1688
- getModuleParameters() {
1689
- return {
1690
- maskMap: this.masks ? this.maskMap : this.dummyMaskMap,
1691
- maskChannels: this.masks
1692
- };
1693
- }
1694
- cleanup() {
1695
- if (this.dummyMaskMap) {
1696
- this.dummyMaskMap.delete();
1697
- this.dummyMaskMap = void 0;
1698
- }
1699
- if (this.maskPass) {
1700
- this.maskPass.delete();
1701
- this.maskPass = void 0;
1702
- this.maskMap = void 0;
1703
- }
1704
- this.lastViewport = void 0;
1705
- this.masks = null;
1706
- this.channels.length = 0;
1707
- }
1708
- };
1709
-
1710
- // dist/collision-filter/collision-filter-effect.js
1711
- var DOWNSCALE = 2;
1712
- var CollisionFilterEffect = class {
1713
- constructor() {
1714
- this.id = "collision-filter-effect";
1715
- this.props = null;
1716
- this.useInPicking = true;
1717
- this.order = 1;
1718
- this.channels = {};
1719
- this.collisionFBOs = {};
1720
- }
1721
- preRender(device, { effects: allEffects, layers, layerFilter, viewports, onViewportActive, views, isPicking, preRenderStats = {} }) {
1722
- var _a;
1723
- if (!this.dummyCollisionMap) {
1724
- this.dummyCollisionMap = device.createTexture({ width: 1, height: 1 });
1725
- }
1726
- if (isPicking) {
1727
- return;
1728
- }
1729
- const collisionLayers = layers.filter(
1730
- ({ props: { visible, collisionEnabled } }) => visible && collisionEnabled
1731
- );
1732
- if (collisionLayers.length === 0) {
1733
- this.channels = {};
1734
- return;
1735
- }
1736
- if (!this.collisionFilterPass) {
1737
- this.collisionFilterPass = new CollisionFilterPass(device, { id: "default-collision-filter" });
1738
- }
1739
- const effects = allEffects == null ? void 0 : allEffects.filter((e) => e.constructor === MaskEffect);
1740
- const maskEffectRendered = (_a = preRenderStats["mask-effect"]) == null ? void 0 : _a.didRender;
1741
- const channels = this._groupByCollisionGroup(device, collisionLayers);
1742
- const viewport = viewports[0];
1743
- const viewportChanged = !this.lastViewport || !this.lastViewport.equals(viewport) || maskEffectRendered;
1744
- for (const collisionGroup in channels) {
1745
- const collisionFBO = this.collisionFBOs[collisionGroup];
1746
- const renderInfo = channels[collisionGroup];
1747
- const [width, height] = device.canvasContext.getPixelSize();
1748
- collisionFBO.resize({
1749
- width: width / DOWNSCALE,
1750
- height: height / DOWNSCALE
1751
- });
1752
- this._render(renderInfo, {
1753
- effects,
1754
- layerFilter,
1755
- onViewportActive,
1756
- views,
1757
- viewport,
1758
- viewportChanged
1759
- });
1760
- }
1761
- }
1762
- _render(renderInfo, { effects, layerFilter, onViewportActive, views, viewport, viewportChanged }) {
1763
- const { collisionGroup } = renderInfo;
1764
- const oldRenderInfo = this.channels[collisionGroup];
1765
- if (!oldRenderInfo) {
1766
- return;
1767
- }
1768
- 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);
1769
- this.channels[collisionGroup] = renderInfo;
1770
- if (needsRender) {
1771
- this.lastViewport = viewport;
1772
- const collisionFBO = this.collisionFBOs[collisionGroup];
1773
- this.collisionFilterPass.renderCollisionMap(collisionFBO, {
1774
- pass: "collision-filter",
1775
- isPicking: true,
1776
- layers: renderInfo.layers,
1777
- effects,
1778
- layerFilter,
1779
- viewports: viewport ? [viewport] : [],
1780
- onViewportActive,
1781
- views,
1782
- moduleParameters: {
1783
- dummyCollisionMap: this.dummyCollisionMap,
1784
- devicePixelRatio: collisionFBO.device.canvasContext.getDevicePixelRatio() / DOWNSCALE
1785
- }
1786
- });
1787
- }
1942
+ bounds: channelInfo.maskBounds,
1943
+ coordinateOrigin: channelInfo.coordinateOrigin,
1944
+ coordinateSystem: channelInfo.coordinateSystem
1945
+ };
1946
+ return didRender;
1788
1947
  }
1789
- _groupByCollisionGroup(device, collisionLayers) {
1948
+ _sortMaskChannels(maskLayers) {
1790
1949
  const channelMap = {};
1791
- for (const layer of collisionLayers) {
1792
- const { collisionGroup } = layer.props;
1793
- let channelInfo = channelMap[collisionGroup];
1950
+ let channelCount = 0;
1951
+ for (const layer of maskLayers) {
1952
+ const { id } = layer.root;
1953
+ let channelInfo = channelMap[id];
1794
1954
  if (!channelInfo) {
1795
- channelInfo = { collisionGroup, layers: [], layerBounds: [], allLayersLoaded: true };
1796
- channelMap[collisionGroup] = channelInfo;
1955
+ if (++channelCount > 4) {
1956
+ import_core19.log.warn("Too many mask layers. The max supported is 4")();
1957
+ continue;
1958
+ }
1959
+ channelInfo = {
1960
+ id,
1961
+ index: this.channels.findIndex((c) => (c == null ? void 0 : c.id) === id),
1962
+ layers: [],
1963
+ layerBounds: [],
1964
+ coordinateOrigin: layer.root.props.coordinateOrigin,
1965
+ coordinateSystem: layer.root.props.coordinateSystem
1966
+ };
1967
+ channelMap[id] = channelInfo;
1797
1968
  }
1798
1969
  channelInfo.layers.push(layer);
1799
1970
  channelInfo.layerBounds.push(layer.getBounds());
1800
- if (!layer.isLoaded) {
1801
- channelInfo.allLayersLoaded = false;
1802
- }
1803
1971
  }
1804
- for (const collisionGroup of Object.keys(channelMap)) {
1805
- if (!this.collisionFBOs[collisionGroup]) {
1806
- this.createFBO(device, collisionGroup);
1807
- }
1808
- if (!this.channels[collisionGroup]) {
1809
- this.channels[collisionGroup] = channelMap[collisionGroup];
1972
+ for (let i = 0; i < 4; i++) {
1973
+ const channelInfo = this.channels[i];
1974
+ if (!channelInfo || !(channelInfo.id in channelMap)) {
1975
+ this.channels[i] = null;
1810
1976
  }
1811
1977
  }
1812
- for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1813
- if (!channelMap[collisionGroup]) {
1814
- this.destroyFBO(collisionGroup);
1978
+ for (const maskId in channelMap) {
1979
+ const channelInfo = channelMap[maskId];
1980
+ if (channelInfo.index < 0) {
1981
+ channelInfo.index = this.channels.findIndex((c) => !c);
1982
+ this.channels[channelInfo.index] = channelInfo;
1815
1983
  }
1816
1984
  }
1817
1985
  return channelMap;
1818
1986
  }
1819
- getModuleParameters(layer) {
1820
- const { collisionGroup } = layer.props;
1821
- const { collisionFBOs, dummyCollisionMap } = this;
1822
- return { collisionFBO: collisionFBOs[collisionGroup], dummyCollisionMap };
1987
+ getModuleParameters() {
1988
+ return {
1989
+ maskMap: this.masks ? this.maskMap : this.dummyMaskMap,
1990
+ maskChannels: this.masks
1991
+ };
1823
1992
  }
1824
1993
  cleanup() {
1825
- if (this.dummyCollisionMap) {
1826
- this.dummyCollisionMap.delete();
1827
- this.dummyCollisionMap = void 0;
1994
+ if (this.dummyMaskMap) {
1995
+ this.dummyMaskMap.delete();
1996
+ this.dummyMaskMap = void 0;
1828
1997
  }
1829
- this.channels = {};
1830
- for (const collisionGroup of Object.keys(this.collisionFBOs)) {
1831
- this.destroyFBO(collisionGroup);
1998
+ if (this.maskPass) {
1999
+ this.maskPass.delete();
2000
+ this.maskPass = void 0;
2001
+ this.maskMap = void 0;
1832
2002
  }
1833
- this.collisionFBOs = {};
1834
2003
  this.lastViewport = void 0;
2004
+ this.masks = null;
2005
+ this.channels.length = 0;
1835
2006
  }
1836
- createFBO(device, collisionGroup) {
1837
- const { width, height } = device.gl.canvas;
1838
- const collisionMap = device.createTexture({
1839
- format: "rgba8unorm",
1840
- width,
1841
- height,
1842
- sampler: {
1843
- minFilter: "nearest",
1844
- magFilter: "nearest",
1845
- addressModeU: "clamp-to-edge",
1846
- addressModeV: "clamp-to-edge"
1847
- }
1848
- });
1849
- const depthStencilAttachment = device.createTexture({
1850
- format: "depth16unorm",
1851
- width,
1852
- height,
1853
- mipmaps: false,
1854
- dataFormat: 6402,
1855
- type: 5125
1856
- });
1857
- this.collisionFBOs[collisionGroup] = device.createFramebuffer({
1858
- id: `collision-${collisionGroup}`,
1859
- width,
1860
- height,
1861
- colorAttachments: [collisionMap],
1862
- depthStencilAttachment
1863
- });
1864
- }
1865
- destroyFBO(collisionGroup) {
1866
- var _a, _b;
1867
- const fbo = this.collisionFBOs[collisionGroup];
1868
- (_a = fbo.colorAttachments[0]) == null ? void 0 : _a.destroy();
1869
- (_b = fbo.depthStencilAttachment) == null ? void 0 : _b.destroy();
1870
- fbo.destroy();
1871
- delete this.collisionFBOs[collisionGroup];
1872
- }
1873
- };
1874
-
1875
- // dist/collision-filter/collision-filter-extension.js
1876
- var defaultProps6 = {
1877
- getCollisionPriority: { type: "accessor", value: 0 },
1878
- collisionEnabled: true,
1879
- collisionGroup: { type: "string", value: "default" },
1880
- collisionTestProps: {}
1881
- };
1882
- var _CollisionFilterExtension = class extends import_core19.LayerExtension {
1883
- getShaders() {
1884
- return { modules: [shader_module_default2] };
1885
- }
1886
- draw({ uniforms, context, moduleParameters }) {
1887
- const { collisionEnabled } = this.props;
1888
- const { collisionFBO, drawToCollisionMap } = moduleParameters;
1889
- const enabled = collisionEnabled && Boolean(collisionFBO);
1890
- uniforms.collision_enabled = enabled;
1891
- if (drawToCollisionMap) {
1892
- this.props = this.clone(this.props.collisionTestProps).props;
1893
- }
1894
- }
1895
- initializeState(context, extension) {
1896
- var _a;
1897
- if (this.getAttributeManager() === null) {
1898
- return;
1899
- }
1900
- (_a = this.context.deck) == null ? void 0 : _a._addDefaultEffect(new CollisionFilterEffect());
1901
- const attributeManager = this.getAttributeManager();
1902
- attributeManager.add({
1903
- collisionPriorities: {
1904
- size: 1,
1905
- accessor: "getCollisionPriority",
1906
- shaderAttributes: {
1907
- collisionPriorities: { divisor: 0 },
1908
- instanceCollisionPriorities: { divisor: 1 }
1909
- }
1910
- }
1911
- });
1912
- }
1913
- getNeedsPickingBuffer() {
1914
- return this.props.collisionEnabled;
1915
- }
1916
- };
1917
- var CollisionFilterExtension = _CollisionFilterExtension;
1918
- (() => {
1919
- _CollisionFilterExtension.defaultProps = defaultProps6;
1920
- })();
1921
- (() => {
1922
- _CollisionFilterExtension.extensionName = "CollisionFilterExtension";
1923
- })();
1924
-
1925
- // dist/mask/mask-extension.js
1926
- var import_core21 = require("@deck.gl/core");
1927
-
1928
- // dist/mask/shader-module.js
1929
- var import_core20 = require("@deck.gl/core");
1930
- var vs4 = `
1931
- uniform vec4 mask_bounds;
1932
- uniform bool mask_maskByInstance;
1933
- vec2 mask_getCoords(vec4 position) {
1934
- return (position.xy - mask_bounds.xy) / (mask_bounds.zw - mask_bounds.xy);
1935
- }
1936
- `;
1937
- var fs3 = `
1938
- uniform sampler2D mask_texture;
1939
- uniform int mask_channel;
1940
- uniform bool mask_enabled;
1941
- uniform bool mask_inverted;
1942
- bool mask_isInBounds(vec2 texCoords) {
1943
- if (!mask_enabled) {
1944
- return true;
1945
- }
1946
- vec4 maskColor = texture(mask_texture, texCoords);
1947
- float maskValue = 1.0;
1948
- if (mask_channel == 0) {
1949
- maskValue = maskColor.r;
1950
- } else if (mask_channel == 1) {
1951
- maskValue = maskColor.g;
1952
- } else if (mask_channel == 2) {
1953
- maskValue = maskColor.b;
1954
- } else if (mask_channel == 3) {
1955
- maskValue = maskColor.a;
1956
- }
1957
- if (mask_inverted) {
1958
- return maskValue >= 0.5;
1959
- } else {
1960
- return maskValue < 0.5;
1961
- }
1962
- }
1963
- `;
1964
- var inject5 = {
1965
- "vs:#decl": `
1966
- out vec2 mask_texCoords;
1967
- `,
1968
- "vs:#main-end": `
1969
- vec4 mask_common_position;
1970
- if (mask_maskByInstance) {
1971
- mask_common_position = project_position(vec4(geometry.worldPosition, 1.0));
1972
- } else {
1973
- mask_common_position = geometry.position;
1974
- }
1975
- mask_texCoords = mask_getCoords(mask_common_position);
1976
- `,
1977
- "fs:#decl": `
1978
- in vec2 mask_texCoords;
1979
- `,
1980
- "fs:#main-start": `
1981
- if (mask_enabled) {
1982
- bool mask = mask_isInBounds(mask_texCoords);
1983
- fragColor = texture(mask_texture, mask_texCoords);
1984
- if (!mask) discard;
1985
- }
1986
- `
1987
- };
1988
- var getMaskUniforms = (opts) => {
1989
- if (opts && "maskMap" in opts) {
1990
- return {
1991
- mask_texture: opts.maskMap
1992
- };
1993
- }
1994
- return {};
1995
- };
1996
- var shader_module_default3 = {
1997
- name: "mask",
1998
- dependencies: [import_core20.project],
1999
- vs: vs4,
2000
- fs: fs3,
2001
- inject: inject5,
2002
- getUniforms: getMaskUniforms
2003
2007
  };
2004
2008
 
2005
2009
  // dist/mask/mask-extension.js
@@ -2179,12 +2183,13 @@ return;
2179
2183
  };
2180
2184
 
2181
2185
  // dist/terrain/utils.js
2182
- var import_constants3 = require("@luma.gl/constants");
2186
+ var import_constants2 = require("@luma.gl/constants");
2183
2187
  function createRenderTarget(device, opts) {
2184
2188
  return device.createFramebuffer({
2185
2189
  id: opts.id,
2186
2190
  colorAttachments: [
2187
2191
  device.createTexture({
2192
+ id: opts.id,
2188
2193
  ...opts.float && {
2189
2194
  format: "rgba32float",
2190
2195
  type: 5126
@@ -2361,8 +2366,15 @@ function intersect(b1, b2) {
2361
2366
  }
2362
2367
 
2363
2368
  // dist/terrain/terrain-pass.js
2364
- var import_constants4 = require("@luma.gl/constants");
2365
2369
  var import_core23 = require("@deck.gl/core");
2370
+ var TERRAIN_BLENDING = {
2371
+ blendColorOperation: "max",
2372
+ blendColorSrcFactor: "one",
2373
+ blendColorDstFactor: "one",
2374
+ blendAlphaOperation: "max",
2375
+ blendAlphaSrcFactor: "one",
2376
+ blendAlphaDstFactor: "one"
2377
+ };
2366
2378
  var TerrainPass = class extends import_core23._LayersPass {
2367
2379
  getRenderableLayers(viewport, opts) {
2368
2380
  const { layers } = opts;
@@ -2383,20 +2395,15 @@ var TerrainPass = class extends import_core23._LayersPass {
2383
2395
  return;
2384
2396
  }
2385
2397
  target.resize(viewport);
2386
- this.device.withParametersWebGL({
2387
- clearColor: [0, 0, 0, 0],
2388
- blend: true,
2389
- blendFunc: [1, 1],
2390
- blendEquation: 32776,
2391
- depthTest: false
2392
- }, () => this.render({
2398
+ this.render({
2393
2399
  ...opts,
2394
2400
  target,
2395
2401
  pass: "terrain-height-map",
2396
2402
  layers: opts.layers,
2397
2403
  viewports: [viewport],
2398
- effects: []
2399
- }));
2404
+ effects: [],
2405
+ clearColor: [0, 0, 0, 0]
2406
+ });
2400
2407
  }
2401
2408
  renderTerrainCover(terrainCover, opts) {
2402
2409
  const target = terrainCover.getRenderFramebuffer();
@@ -2406,17 +2413,23 @@ var TerrainPass = class extends import_core23._LayersPass {
2406
2413
  }
2407
2414
  const layers = terrainCover.filterLayers(opts.layers);
2408
2415
  target.resize(viewport);
2409
- this.device.withParametersWebGL({
2410
- clearColor: [0, 0, 0, 0],
2411
- depthTest: false
2412
- }, () => this.render({
2416
+ this.render({
2413
2417
  ...opts,
2414
2418
  target,
2415
2419
  pass: `terrain-cover-${terrainCover.id}`,
2416
2420
  layers,
2417
2421
  effects: [],
2418
- viewports: [viewport]
2419
- }));
2422
+ viewports: [viewport],
2423
+ clearColor: [0, 0, 0, 0]
2424
+ });
2425
+ }
2426
+ getLayerParameters(layer, layerIndex, viewport) {
2427
+ return {
2428
+ ...layer.props.parameters,
2429
+ blend: true,
2430
+ depthTest: false,
2431
+ ...layer.props.operation.includes("terrain") && TERRAIN_BLENDING
2432
+ };
2420
2433
  }
2421
2434
  };
2422
2435
 
@@ -2454,9 +2467,7 @@ var TerrainPickingPass = class extends import_core24._PickLayersPass {
2454
2467
  layers.unshift(terrainLayer);
2455
2468
  }
2456
2469
  target.resize(viewport);
2457
- this.device.withParametersWebGL({
2458
- depthTest: false
2459
- }, () => this.render({
2470
+ this.render({
2460
2471
  ...opts,
2461
2472
  pickingFBO: target,
2462
2473
  pass: `terrain-cover-picking-${terrainCover.id}`,
@@ -2466,15 +2477,17 @@ var TerrainPickingPass = class extends import_core24._PickLayersPass {
2466
2477
  cullRect: void 0,
2467
2478
  deviceRect: viewport,
2468
2479
  pickZ: false
2469
- }));
2480
+ });
2470
2481
  }
2471
2482
  getLayerParameters(layer, layerIndex, viewport) {
2483
+ let parameters2;
2472
2484
  if (this.drawParameters[layer.id]) {
2473
- return this.drawParameters[layer.id];
2485
+ parameters2 = this.drawParameters[layer.id];
2486
+ } else {
2487
+ parameters2 = super.getLayerParameters(layer, layerIndex, viewport);
2488
+ parameters2.blend = true;
2474
2489
  }
2475
- const parameters2 = super.getLayerParameters(layer, layerIndex, viewport);
2476
- parameters2.blend = true;
2477
- return parameters2;
2490
+ return { ...parameters2, depthTest: false };
2478
2491
  }
2479
2492
  };
2480
2493
 
@@ -2557,7 +2570,7 @@ var TerrainEffect = class {
2557
2570
  this.isDrapingEnabled = false;
2558
2571
  this.terrainCovers = /* @__PURE__ */ new Map();
2559
2572
  }
2560
- initialize(device) {
2573
+ setup({ device, deck }) {
2561
2574
  this.dummyHeightMap = device.createTexture({
2562
2575
  width: 1,
2563
2576
  height: 1,
@@ -2570,17 +2583,9 @@ var TerrainEffect = class {
2570
2583
  } else {
2571
2584
  import_core25.log.warn("Terrain offset mode is not supported by this browser")();
2572
2585
  }
2573
- (0, import_core25.getShaderAssembler)().addDefaultModule(terrainModule);
2586
+ deck._addDefaultShaderModule(terrainModule);
2574
2587
  }
2575
- preRender(device, opts) {
2576
- if (!this.dummyHeightMap) {
2577
- this.initialize(device);
2578
- for (const layer of opts.layers) {
2579
- if (layer.props.operation.includes("terrain")) {
2580
- layer.setChangeFlags({ extensionsChanged: true });
2581
- }
2582
- }
2583
- }
2588
+ preRender(opts) {
2584
2589
  if (opts.pickZ) {
2585
2590
  this.isDrapingEnabled = false;
2586
2591
  return;
@@ -2616,7 +2621,7 @@ var TerrainEffect = class {
2616
2621
  terrainSkipRender: terrainDrawMode === "drape" || !layer.props.operation.includes("draw")
2617
2622
  };
2618
2623
  }
2619
- cleanup() {
2624
+ cleanup({ deck }) {
2620
2625
  if (this.dummyHeightMap) {
2621
2626
  this.dummyHeightMap.delete();
2622
2627
  this.dummyHeightMap = void 0;
@@ -2629,6 +2634,7 @@ var TerrainEffect = class {
2629
2634
  terrainCover.delete();
2630
2635
  }
2631
2636
  this.terrainCovers.clear();
2637
+ deck._removeDefaultShaderModule(terrainModule);
2632
2638
  }
2633
2639
  _updateHeightMap(terrainLayers, viewport, opts) {
2634
2640
  if (!this.heightMap) {