leaflet-city-mapper 0.0.7 → 0.0.8

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 (65) hide show
  1. package/README.md +2 -2
  2. package/cucumber.mjs +1 -3
  3. package/dist/leaflet-city-mapper-src.js +403 -201
  4. package/dist/leaflet-city-mapper-src.js.map +4 -4
  5. package/dist/leaflet-city-mapper-worker-src.js +69 -59
  6. package/dist/leaflet-city-mapper-worker-src.js.map +3 -3
  7. package/dist/leaflet-city-mapper-worker.js +1 -1
  8. package/dist/leaflet-city-mapper-worker.js.map +4 -4
  9. package/dist/leaflet-city-mapper.js +5 -5
  10. package/dist/leaflet-city-mapper.js.map +4 -4
  11. package/libs/leaflet-lens.js +44 -27
  12. package/libs/leaflet.js +4 -4
  13. package/libs/openlayers-bindings.js +2 -1
  14. package/libs/openlayers-bindings.min.js +1 -1
  15. package/libs/openlayers-bindings.min.js.map +3 -3
  16. package/package.json +2 -2
  17. package/src/camera/mapCamera.js +7 -7
  18. package/src/camera/mapTryAnimatedPan.js +4 -4
  19. package/src/camera/updateMapCamera.js +8 -6
  20. package/src/controls/cameraControls.js +27 -22
  21. package/src/core/cameraCircleBounds.js +2 -1
  22. package/src/core/closestCameraLayerPoint.js +2 -1
  23. package/src/core/constructLayer.js +9 -0
  24. package/src/core/extendLeafletClass.js +5 -0
  25. package/src/core/extendTerrainPixelBounds.js +31 -0
  26. package/src/core/gridlayerGetTiledPixelBounds.js +2 -27
  27. package/src/core/layerAddInitHook.js +7 -0
  28. package/src/core/layerCallInitHooks.js +13 -13
  29. package/src/core/layerMergeOptions.js +7 -0
  30. package/src/core/projectNativePath.js +23 -0
  31. package/src/geometry/circleGeometry.js +4 -3
  32. package/src/globals/layerControlAddItem.js +3 -0
  33. package/src/globals/leafletLayer.js +3 -0
  34. package/src/globals/workerCogSource.js +1 -1
  35. package/src/gpu/initializeRendererResources.js +10 -12
  36. package/src/index.js +26 -11
  37. package/src/layer-controls/layerControlInputId.js +11 -0
  38. package/src/layer-controls/placeEntry.js +2 -0
  39. package/src/materials/createProgram.js +7 -6
  40. package/src/native/gridTerrainElevation.js +7 -11
  41. package/src/native/nativeTerrainElevation.js +16 -0
  42. package/src/native/prepareGridTerrainRequests.js +16 -0
  43. package/src/native/retainGridTerrain.js +10 -0
  44. package/src/native/syncGridLayer.js +12 -59
  45. package/src/native/syncGridTile.js +18 -0
  46. package/src/native/syncTerrainGridTile.js +28 -0
  47. package/src/rendering/drawGeometry.js +11 -11
  48. package/src/rendering/resizeRenderer.js +16 -15
  49. package/src/scene/initializerFor.js +2 -1
  50. package/src/scene/layerInitialize.js +1 -1
  51. package/src/shadows/drawShadowMeshes.js +6 -5
  52. package/src/sources/pumpSourceAreas.js +1 -1
  53. package/src/sunlight/initSunlight.js +19 -8
  54. package/src/textures/nativeTextureFor.js +2 -3
  55. package/src/textures/uploadCanvasTexture.js +11 -2
  56. package/src/vector-tiles/createVectorLabel.js +22 -0
  57. package/src/vector-tiles/prepareVectorLabel.js +17 -35
  58. package/src/vector-tiles/updateVectorLabelStyle.js +8 -0
  59. package/src/vector-tiles/vectorLabelCells.js +2 -5
  60. package/src/vector-tiles/vectorLabelIcon.js +1 -1
  61. package/src/vector-tiles/vectorLabelText.js +10 -0
  62. package/src/walk/initWalk.js +19 -6
  63. package/src/weakmaps/pathProjectionByMap.js +1 -0
  64. package/src/workers/cogWorker.js +4 -5
  65. package/src/globals/layerCallInitHooks.js +0 -1
@@ -1269,6 +1269,19 @@
1269
1269
  }
1270
1270
  });
1271
1271
 
1272
+ // src/core/extendLeafletClass.js
1273
+ function extendLeafletClass(parent) {
1274
+ return L.version.startsWith("2.") ? parent : parent.extend(
1275
+ /* alloc */
1276
+ {}
1277
+ );
1278
+ }
1279
+ var init_extendLeafletClass = __esm({
1280
+ "src/core/extendLeafletClass.js"() {
1281
+ init_L();
1282
+ }
1283
+ });
1284
+
1272
1285
  // src/controls/cameraControls.js
1273
1286
  var cameraControls_exports = {};
1274
1287
  __export(cameraControls_exports, {
@@ -1309,6 +1322,7 @@
1309
1322
  }
1310
1323
  map.once("unload", cleanupCameraTouch, map);
1311
1324
  }
1325
+ var CompassHandler, ContainerResizeHandler, PitchDragHandler, ShiftRotateHandler, TouchModeHandler, RotateControl;
1312
1326
  var init_cameraControls = __esm({
1313
1327
  "src/controls/cameraControls.js"() {
1314
1328
  init_cameraTouchStateByMap();
@@ -1345,31 +1359,44 @@
1345
1359
  init_cleanupCameraTouch();
1346
1360
  init_endAllCameraTouches();
1347
1361
  init_addCameraHandler();
1348
- Compass.value = L.Handler.extend({
1349
- addHooks: compassAddHooks,
1350
- removeHooks: compassRemoveHooks
1351
- });
1352
- ContainerResize.value = L.Handler.extend({
1362
+ init_extendLeafletClass();
1363
+ CompassHandler = class extends extendLeafletClass(L.Handler) {
1364
+ };
1365
+ Object.assign(CompassHandler.prototype, { addHooks: compassAddHooks, removeHooks: compassRemoveHooks });
1366
+ Compass.value = CompassHandler;
1367
+ ContainerResizeHandler = class extends extendLeafletClass(L.Handler) {
1368
+ };
1369
+ Object.assign(ContainerResizeHandler.prototype, {
1353
1370
  addHooks: containerResizeAddHooks,
1354
1371
  removeHooks: containerResizeRemoveHooks
1355
1372
  });
1356
- PitchDrag.value = L.Handler.extend({
1357
- addHooks: pitchDragAddHooks,
1358
- removeHooks: pitchDragRemoveHooks
1359
- });
1360
- ShiftRotate.value = L.Handler.extend({
1373
+ ContainerResize.value = ContainerResizeHandler;
1374
+ PitchDragHandler = class extends extendLeafletClass(L.Handler) {
1375
+ };
1376
+ Object.assign(PitchDragHandler.prototype, { addHooks: pitchDragAddHooks, removeHooks: pitchDragRemoveHooks });
1377
+ PitchDrag.value = PitchDragHandler;
1378
+ ShiftRotateHandler = class extends extendLeafletClass(L.Handler) {
1379
+ };
1380
+ Object.assign(ShiftRotateHandler.prototype, {
1361
1381
  addHooks: shiftRotateAddHooks,
1362
1382
  removeHooks: shiftRotateRemoveHooks
1363
1383
  });
1364
- TouchMode.value = L.Handler.extend({
1384
+ ShiftRotate.value = ShiftRotateHandler;
1385
+ TouchModeHandler = class extends extendLeafletClass(L.Handler) {
1386
+ };
1387
+ Object.assign(TouchModeHandler.prototype, {
1365
1388
  addHooks: notifyCameraTouchChange,
1366
1389
  removeHooks: notifyCameraTouchChange
1367
1390
  });
1368
- L.Control.Rotate = L.Control.extend({
1369
- options: { position: "topleft", closeOnZeroBearing: true, visualizePitch: true },
1370
- onAdd: rotateOnAdd,
1371
- onRemove: rotateOnRemove
1372
- });
1391
+ TouchMode.value = TouchModeHandler;
1392
+ RotateControl = class extends extendLeafletClass(L.Control) {
1393
+ static defaultOptions = { position: "topleft", closeOnZeroBearing: true, visualizePitch: true };
1394
+ };
1395
+ Object.assign(RotateControl.prototype, { onAdd: rotateOnAdd, onRemove: rotateOnRemove });
1396
+ if (L.version.startsWith("1.")) {
1397
+ RotateControl.prototype.options = Object.assign(Object.create(L.Control.prototype.options), RotateControl.defaultOptions);
1398
+ }
1399
+ L.Control.Rotate = RotateControl;
1373
1400
  if (L.control) L.control.rotate = rotateControl;
1374
1401
  }
1375
1402
  });
@@ -1380,9 +1407,6 @@
1380
1407
  // src/globals/layerProto.js
1381
1408
  var layerProto = { value: void 0 };
1382
1409
 
1383
- // src/globals/layerCallInitHooks.js
1384
- var layerCallInitHooks = { value: void 0 };
1385
-
1386
1410
  // src/globals/removeLayer.js
1387
1411
  var removeLayer = { value: void 0 };
1388
1412
 
@@ -1628,17 +1652,18 @@
1628
1652
 
1629
1653
  // src/rendering/resizeRenderer.js
1630
1654
  function resizeRenderer(layer, size) {
1655
+ const renderer = rendererByLayer.get(layer);
1631
1656
  if (!sizeByLayer.get(layer) || !sizeByLayer.get(layer).equals(size)) {
1632
- rendererByLayer.get(layer).width = size.x;
1633
- rendererByLayer.get(layer).height = size.y;
1634
- rendererByLayer.get(layer).canvas.width = Math.round(size.x * rendererByLayer.get(layer).dpr);
1635
- rendererByLayer.get(layer).canvas.height = Math.round(size.y * rendererByLayer.get(layer).dpr);
1636
- rendererByLayer.get(layer).canvas.style.width = `${size.x}px`;
1637
- rendererByLayer.get(layer).canvas.style.height = `${size.y}px`;
1638
- if (rendererByLayer.get(layer).depthTexture) destroyTexture(layer, rendererByLayer.get(layer).depthTexture);
1639
- rendererByLayer.get(layer).colorTexture?.destroy();
1640
- rendererByLayer.get(layer).colorTexture = rendererByLayer.get(layer).device.createTexture((colorTexture.size[0] = rendererByLayer.get(layer).canvas.width, colorTexture.size[1] = rendererByLayer.get(layer).canvas.height, colorTexture.format = rendererByLayer.get(layer).format, colorTexture.usage = GPUTextureUsage.RENDER_ATTACHMENT, colorTexture));
1641
- rendererByLayer.get(layer).depthTexture = rendererByLayer.get(layer).device.createTexture((depthTexture.size[0] = rendererByLayer.get(layer).canvas.width, depthTexture.size[1] = rendererByLayer.get(layer).canvas.height, depthTexture.usage = GPUTextureUsage.RENDER_ATTACHMENT, depthTexture));
1657
+ renderer.width = size.x;
1658
+ renderer.height = size.y;
1659
+ renderer.canvas.width = Math.round(size.x * renderer.dpr);
1660
+ renderer.canvas.height = Math.round(size.y * renderer.dpr);
1661
+ renderer.canvas.style.width = `${size.x}px`;
1662
+ renderer.canvas.style.height = `${size.y}px`;
1663
+ if (renderer.depthTexture) destroyTexture(layer, renderer.depthTexture);
1664
+ renderer.colorTexture?.destroy();
1665
+ renderer.colorTexture = renderer.device.createTexture((colorTexture.size[0] = renderer.canvas.width, colorTexture.size[1] = renderer.canvas.height, colorTexture.format = renderer.format, colorTexture.usage = GPUTextureUsage.RENDER_ATTACHMENT, colorTexture));
1666
+ renderer.depthTexture = renderer.device.createTexture((depthTexture.size[0] = renderer.canvas.width, depthTexture.size[1] = renderer.canvas.height, depthTexture.usage = GPUTextureUsage.RENDER_ATTACHMENT, depthTexture));
1642
1667
  sizeByLayer.set(layer, size);
1643
1668
  }
1644
1669
  }
@@ -1730,6 +1755,21 @@
1730
1755
  return bridgeElevation(point, bridgesByLayer.get(layer)) ?? terrainElevation(point, terrainTilesByLayer.get(layer));
1731
1756
  }
1732
1757
 
1758
+ // src/native/nativeTerrainElevation.js
1759
+ function nativeTerrainElevation(state, point, x, y, z) {
1760
+ let layer, native, request, elevation;
1761
+ const key = `${x}:${y}:${z}`;
1762
+ for (layer of Object.values(state.map._layers)) {
1763
+ native = nativeGPUByLayer.get(layer);
1764
+ if (native?.disposed || native?.terrainStream !== state) continue;
1765
+ request = native.terrainRequests?.get(key);
1766
+ if (!request?.tiles || layer._tiles[key] !== request.tile) continue;
1767
+ elevation = terrainElevation(point, request.tiles);
1768
+ if (Number.isFinite(elevation)) return elevation;
1769
+ }
1770
+ return null;
1771
+ }
1772
+
1733
1773
  // src/native/gridTerrainElevation.js
1734
1774
  function gridTerrainElevation(state, location2) {
1735
1775
  let z = Math.max(0, Math.min(24, Math.round(state.map.getZoom())));
@@ -1737,20 +1777,16 @@
1737
1777
  /* alloc */
1738
1778
  /* @__PURE__ */ new Map()
1739
1779
  );
1740
- let point, limit, x, y, dx, dy, tx, ty, entry, elevation, layer, native, request;
1780
+ let point, limit, x, y, index, dx, dy, tx, ty, entry, elevation;
1741
1781
  for (; z >= 0; z--) {
1742
1782
  point = state.map.project(location2, z), limit = 2 ** z;
1743
1783
  x = Math.floor(point.x / 256), y = Math.floor(point.y / 256);
1744
- for (layer of Object.values(state.map._layers)) {
1745
- native = nativeGPUByLayer.get(layer);
1746
- if (native?.disposed || native?.terrainStream !== state) continue;
1747
- request = native.terrainRequests?.get(`${x}:${y}:${z}`);
1748
- if (!request?.tiles || layer._tiles[`${x}:${y}:${z}`] !== request.tile) continue;
1749
- elevation = terrainElevation(point, request.tiles);
1750
- if (Number.isFinite(elevation)) return elevation;
1751
- }
1784
+ elevation = nativeTerrainElevation(state, point, x, y, z);
1785
+ if (Number.isFinite(elevation)) return elevation;
1752
1786
  tiles.clear();
1753
- for (dy = -1; dy <= 1; dy++) for (dx = -1; dx <= 1; dx++) {
1787
+ for (index = 0; index < 9; index++) {
1788
+ dx = index % 3 - 1;
1789
+ dy = Math.floor(index / 3) - 1;
1754
1790
  tx = ((x + dx) % limit + limit) % limit;
1755
1791
  ty = Math.max(0, Math.min(limit - 1, y + dy));
1756
1792
  entry = state.terrainCache.get(`${z}/${tx}/${ty}`);
@@ -1870,17 +1906,19 @@
1870
1906
  const targetZ = (size.y / 2 - origin.y) / pixelsPerMeter;
1871
1907
  const pitch = mapGetPitch(map) * radians;
1872
1908
  const bearing = mapGetBearing(map) * radians;
1909
+ const sinPitch = Math.sin(pitch), cosPitch = Math.cos(pitch);
1910
+ const sinBearing = Math.sin(bearing), cosBearing = Math.cos(bearing);
1873
1911
  const camera = cameraByLayer.get(layer);
1874
1912
  camera.fov = cameraFov;
1875
1913
  camera.aspect = size.x / size.y;
1876
1914
  camera.near = Math.max(0.1, distance / 1e4);
1877
1915
  camera.far = Math.max(1e4, distance * 10);
1878
- camera.position[0] = targetX + Math.sin(bearing) * Math.sin(pitch) * distance;
1879
- camera.position[1] = targetY + Math.cos(pitch) * distance;
1880
- camera.position[2] = targetZ + Math.cos(bearing) * Math.sin(pitch) * distance;
1881
- camera.up[0] = -Math.sin(bearing) * Math.cos(pitch);
1882
- camera.up[1] = Math.sin(pitch);
1883
- camera.up[2] = -Math.cos(bearing) * Math.cos(pitch);
1916
+ camera.position[0] = targetX + sinBearing * sinPitch * distance;
1917
+ camera.position[1] = targetY + cosPitch * distance;
1918
+ camera.position[2] = targetZ + cosBearing * sinPitch * distance;
1919
+ camera.up[0] = -sinBearing * cosPitch;
1920
+ camera.up[1] = sinPitch;
1921
+ camera.up[2] = -cosBearing * cosPitch;
1884
1922
  camera.target[0] = targetX;
1885
1923
  camera.target[1] = targetY;
1886
1924
  camera.target[2] = targetZ;
@@ -3310,7 +3348,7 @@
3310
3348
 
3311
3349
  // src/rendering/drawGeometry.js
3312
3350
  function drawGeometry(layer, mesh, pass, cullMode, frontFace) {
3313
- const { geometry } = mesh;
3351
+ const { geometry } = mesh, { attributes, drawRange } = geometry;
3314
3352
  const renderer = rendererByLayer.get(layer);
3315
3353
  const { device } = renderer;
3316
3354
  const pipeline = drawPipeline(renderer, mesh, cullMode, frontFace);
@@ -3318,26 +3356,26 @@
3318
3356
  prepareMeshTextures(renderer, mesh);
3319
3357
  pass.setPipeline(pipeline);
3320
3358
  pass.setBindGroup(0, mesh.bindGroup, (meshOffsets[0] = offset, meshOffsets));
3321
- pass.setVertexBuffer(0, geometry.attributes.position.buffer);
3322
- pass.setVertexBuffer(1, geometry.attributes.normal.buffer);
3323
- if (geometry.attributes.color) pass.setVertexBuffer(2, geometry.attributes.color.buffer);
3324
- if (geometry.attributes.uv) pass.setVertexBuffer(3, geometry.attributes.uv.buffer);
3325
- const instances = geometry.attributes.instanceOffset;
3359
+ pass.setVertexBuffer(0, attributes.position.buffer);
3360
+ pass.setVertexBuffer(1, attributes.normal.buffer);
3361
+ if (attributes.color) pass.setVertexBuffer(2, attributes.color.buffer);
3362
+ if (attributes.uv) pass.setVertexBuffer(3, attributes.uv.buffer);
3363
+ const instances = attributes.instanceOffset;
3326
3364
  if (instances) pass.setVertexBuffer(4, instances.buffer);
3327
3365
  let name, attribute;
3328
- for (name in geometry.attributes) {
3329
- attribute = geometry.attributes[name];
3366
+ for (name in attributes) {
3367
+ attribute = attributes[name];
3330
3368
  if (!attribute.needsUpdate) continue;
3331
3369
  device.queue.writeBuffer(attribute.buffer, 0, attribute.data);
3332
3370
  attribute.needsUpdate = false;
3333
3371
  if (name === "position" || name === "instanceOffset") geometry.bounds = null;
3334
3372
  }
3335
- const index = geometry.attributes.index;
3373
+ const index = attributes.index;
3336
3374
  if (index) {
3337
3375
  pass.setIndexBuffer(index.buffer, index.indexFormat);
3338
- pass.drawIndexed(geometry.drawRange.count, instances?.count ?? 1, geometry.drawRange.start, 0, 0);
3376
+ pass.drawIndexed(drawRange.count, instances?.count ?? 1, drawRange.start, 0, 0);
3339
3377
  } else {
3340
- pass.draw(geometry.drawRange.count, instances?.count ?? 1, geometry.drawRange.start, 0);
3378
+ pass.draw(drawRange.count, instances?.count ?? 1, drawRange.start, 0);
3341
3379
  }
3342
3380
  }
3343
3381
 
@@ -3734,9 +3772,10 @@
3734
3772
  let pipeline = sun.pipeline;
3735
3773
  pass.setPipeline(pipeline);
3736
3774
  pass.setBindGroup(1, sun.depthBindGroup);
3737
- let mesh, instances, nextPipeline, offset, attribute, index, range;
3775
+ let mesh, attributes, instances, nextPipeline, offset, attribute, index, range;
3738
3776
  for (mesh of meshes) {
3739
- instances = mesh.geometry.attributes.instanceOffset;
3777
+ attributes = mesh.geometry.attributes;
3778
+ instances = attributes.instanceOffset;
3740
3779
  nextPipeline = instances ? sun.instancePipeline : sun.pipeline;
3741
3780
  if (nextPipeline !== pipeline) {
3742
3781
  pipeline = nextPipeline;
@@ -3751,16 +3790,16 @@
3751
3790
  shadowBindGroup.layout = null;
3752
3791
  shadowBindGroup.entries[0].resource.buffer = null;
3753
3792
  }
3754
- for (attribute of Object.values(mesh.geometry.attributes)) {
3793
+ for (attribute of Object.values(attributes)) {
3755
3794
  if (attribute.needsUpdate) {
3756
3795
  device.queue.writeBuffer(attribute.buffer, 0, attribute.data);
3757
3796
  attribute.needsUpdate = false;
3758
3797
  }
3759
3798
  }
3760
3799
  pass.setBindGroup(0, mesh._shadowBindGroup, (shadowOffsets[0] = offset, shadowOffsets));
3761
- pass.setVertexBuffer(0, mesh.geometry.attributes.position.buffer);
3800
+ pass.setVertexBuffer(0, attributes.position.buffer);
3762
3801
  if (instances) pass.setVertexBuffer(1, instances.buffer);
3763
- index = mesh.geometry.attributes.index, range = mesh.geometry.drawRange;
3802
+ index = attributes.index, range = mesh.geometry.drawRange;
3764
3803
  if (index) {
3765
3804
  pass.setIndexBuffer(index.buffer, index.indexFormat);
3766
3805
  pass.drawIndexed(range.count, instances?.count ?? 1, range.start, 0, 0);
@@ -3948,7 +3987,26 @@
3948
3987
  return nativeGPUByLayer.get(state.source) === state && state.map.hasLayer(state.source);
3949
3988
  }
3950
3989
 
3951
- // src/native/syncGridLayer.js
3990
+ // src/native/prepareGridTerrainRequests.js
3991
+ function prepareGridTerrainRequests(state) {
3992
+ const stream = streamTerrainByMap.get(state.map);
3993
+ if (state.terrainStream !== stream) {
3994
+ state.terrainStream = stream;
3995
+ state.terrainRequests = stream ? (
3996
+ /* alloc */
3997
+ /* @__PURE__ */ new Map()
3998
+ ) : null;
3999
+ }
4000
+ if (state.terrainRequests) {
4001
+ let key;
4002
+ for (key of state.terrainRequests.keys()) {
4003
+ if (!state.source._tiles[key]) state.terrainRequests.delete(key);
4004
+ }
4005
+ }
4006
+ return stream;
4007
+ }
4008
+
4009
+ // src/native/syncGridTile.js
3952
4010
  init_L();
3953
4011
 
3954
4012
  // src/globals/coreWhite.js
@@ -3997,9 +4055,21 @@
3997
4055
 
3998
4056
  // src/textures/uploadCanvasTexture.js
3999
4057
  async function uploadCanvasTexture(state, key, texture, image, device, width, height) {
4000
- let bitmap;
4058
+ let bitmap, source = image;
4001
4059
  try {
4002
- bitmap = await createImageBitmap(image);
4060
+ if (image instanceof HTMLImageElement) {
4061
+ const canvas = document.createElement("canvas");
4062
+ canvas.width = width;
4063
+ canvas.height = height;
4064
+ const context = canvas.getContext("2d");
4065
+ if (!context) throw (
4066
+ /* alloc */
4067
+ new Error("Unable to rasterize SVG image")
4068
+ );
4069
+ context.drawImage(image, 0, 0, width, height);
4070
+ source = canvas;
4071
+ }
4072
+ bitmap = await createImageBitmap(source);
4003
4073
  if (!current(state) || state.textures.get(key) !== texture) return;
4004
4074
  device.queue.copyExternalImageToTexture(
4005
4075
  /* alloc */
@@ -4056,8 +4126,7 @@
4056
4126
  const url = image.currentSrc || image.src;
4057
4127
  if (!texture || texture.image !== image || texture.url !== url) {
4058
4128
  if (texture) {
4059
- const mesh = meshes.get(key);
4060
- if (mesh) disposeMesh(layer, mesh);
4129
+ disposeMesh(layer, meshes.get(key));
4061
4130
  meshes.delete(key);
4062
4131
  destroyTexture(layer, texture.texture);
4063
4132
  textures.delete(key);
@@ -4086,7 +4155,7 @@
4086
4155
  sampler: device.createSampler(coreSampler)
4087
4156
  };
4088
4157
  textures.set(key, texture);
4089
- if (image instanceof HTMLCanvasElement) {
4158
+ if (image instanceof HTMLCanvasElement || url.startsWith("data:image/svg+xml")) {
4090
4159
  texture.pending = true;
4091
4160
  uploadCanvasTexture(state, key, texture, image, device, width, height);
4092
4161
  } else {
@@ -4805,14 +4874,15 @@
4805
4874
 
4806
4875
  // src/materials/createProgram.js
4807
4876
  function createProgram(layer, material = defaultMaterial) {
4877
+ const renderer = rendererByLayer.get(layer), { device } = renderer;
4808
4878
  const shaders = materialShaders(
4809
4879
  material,
4810
4880
  !!layer.options.nightSparkle,
4811
4881
  material.terrain ? elevationWGSL : ""
4812
4882
  );
4813
- const vertex = rendererByLayer.get(layer).device.createShaderModule((vertexShader.code = shaders.vertex, vertexShader));
4883
+ const vertex = device.createShaderModule((vertexShader.code = shaders.vertex, vertexShader));
4814
4884
  vertexShader.code = null;
4815
- const fragment = rendererByLayer.get(layer).device.createShaderModule((fragmentShader.code = shaders.fragment, fragmentShader));
4885
+ const fragment = device.createShaderModule((fragmentShader.code = shaders.fragment, fragmentShader));
4816
4886
  fragmentShader.code = null;
4817
4887
  reportCompilation(
4818
4888
  layer,
@@ -4832,15 +4902,15 @@
4832
4902
  ]
4833
4903
  );
4834
4904
  if (material.instanced) vertexBuffers.push(instanceLayout);
4835
- const bindGroupLayout = createProgramLayout(rendererByLayer.get(layer).device, shaders);
4836
- const pipelineLayout2 = rendererByLayer.get(layer).device.createPipelineLayout((pipelineLayout.bindGroupLayouts[0] = bindGroupLayout, pipelineLayout.bindGroupLayouts[1] = rendererByLayer.get(layer).sunlight.layout, pipelineLayout));
4905
+ const bindGroupLayout = createProgramLayout(device, shaders);
4906
+ const pipelineLayout2 = device.createPipelineLayout((pipelineLayout.bindGroupLayouts[0] = bindGroupLayout, pipelineLayout.bindGroupLayouts[1] = renderer.sunlight.layout, pipelineLayout));
4837
4907
  pipelineLayout.bindGroupLayouts[0] = null;
4838
4908
  pipelineLayout.bindGroupLayouts[1] = null;
4839
4909
  const uniforms = createProgramUniforms(material);
4840
4910
  return (
4841
4911
  /* alloc */
4842
4912
  {
4843
- device: rendererByLayer.get(layer).device,
4913
+ device,
4844
4914
  vertex,
4845
4915
  fragment,
4846
4916
  bindings: shaders.bindings,
@@ -5066,6 +5136,28 @@
5066
5136
  return positions;
5067
5137
  }
5068
5138
 
5139
+ // src/native/syncGridTile.js
5140
+ function syncGridTile(state, key, tile, opacity) {
5141
+ const retained = state.textures.get(key), mesh = state.meshes.get(key);
5142
+ if (mesh && !mesh._terrainRequest && retained?.image === tile.el && retained.url === (tile.el.currentSrc || tile.el.src)) {
5143
+ retained.used = true;
5144
+ styleNativeMesh(state, mesh, coreWhite, opacity);
5145
+ return mesh;
5146
+ }
5147
+ const [nw, se] = state.source._tileCoordsToNwSe(tile.coords);
5148
+ return quadNativeMesh(
5149
+ state,
5150
+ key,
5151
+ tile.el,
5152
+ boundsQuad(
5153
+ state,
5154
+ /* alloc */
5155
+ new L.LatLngBounds(nw, se)
5156
+ ),
5157
+ opacity
5158
+ );
5159
+ }
5160
+
5069
5161
  // src/native/getGridTerrainTile.js
5070
5162
  async function getGridTerrainTile(state, z, x, y) {
5071
5163
  const limit = 2 ** z;
@@ -5210,74 +5302,62 @@
5210
5302
  return mesh;
5211
5303
  }
5212
5304
 
5213
- // src/native/syncGridLayer.js
5214
- function syncGridLayer(state) {
5215
- const { source, textures, meshes } = state;
5216
- const stream = streamTerrainByMap.get(state.map);
5217
- if (state.terrainStream !== stream) {
5218
- state.terrainStream = stream;
5219
- state.terrainRequests = stream ? (
5220
- /* alloc */
5221
- /* @__PURE__ */ new Map()
5222
- ) : null;
5305
+ // src/native/syncTerrainGridTile.js
5306
+ function syncTerrainGridTile(state, key, tile, opacity) {
5307
+ const retained = state.textures.get(key), mesh = state.meshes.get(key);
5308
+ let request = state.terrainRequests.get(key);
5309
+ if (!request || request.tile !== tile) {
5310
+ request = /* alloc */
5311
+ { tile, stream: state.terrainStream };
5312
+ state.terrainRequests.set(key, request);
5313
+ loadGridTerrain(state, key, tile, request);
5223
5314
  }
5224
- let key, tile, opacity, retained, mesh, nw, se, request, pending = false;
5225
- if (state.terrainRequests) {
5226
- for (key of state.terrainRequests.keys()) {
5227
- if (!source._tiles[key]) state.terrainRequests.delete(key);
5315
+ if (!request.tiles) {
5316
+ if (mesh && retained?.image === tile.el) {
5317
+ retained.used = true;
5318
+ styleNativeMesh(state, mesh, coreWhite, opacity);
5228
5319
  }
5320
+ return null;
5321
+ }
5322
+ if (mesh && mesh._terrainRequest === request && retained?.image === tile.el && retained.url === (tile.el.currentSrc || tile.el.src)) {
5323
+ retained.used = true;
5324
+ styleNativeMesh(state, mesh, coreWhite, opacity);
5325
+ return mesh;
5229
5326
  }
5327
+ return terrainGridMesh(state, key, tile, request, opacity);
5328
+ }
5329
+
5330
+ // src/native/retainGridTerrain.js
5331
+ function retainGridTerrain(state) {
5332
+ let key, mesh, retained;
5333
+ for ([key, mesh] of state.meshes) {
5334
+ if (state.source._tiles[key] || !mesh._terrainRequest) continue;
5335
+ retained = state.textures.get(key);
5336
+ if (!retained) continue;
5337
+ retained.used = true;
5338
+ mesh._nativeUsed = true;
5339
+ }
5340
+ }
5341
+
5342
+ // src/native/syncGridLayer.js
5343
+ function syncGridLayer(state) {
5344
+ const { source } = state;
5345
+ const stream = prepareGridTerrainRequests(state);
5346
+ let key, tile, opacity, mesh, pending = false;
5230
5347
  for (key in source._tiles) {
5231
5348
  if (!Object.hasOwn(source._tiles, key)) continue;
5232
5349
  tile = source._tiles[key];
5233
5350
  if (!tile.loaded || tile.el instanceof HTMLImageElement && !tile.el.naturalWidth) {
5234
- if (stream) pending = true;
5351
+ pending = Boolean(stream);
5235
5352
  continue;
5236
5353
  }
5237
5354
  opacity = (source.options.opacity ?? 1) * (tile._gpuOpacity ?? 1);
5238
- retained = textures.get(key);
5239
- mesh = meshes.get(key);
5240
- if (state.terrainRequests) {
5241
- request = state.terrainRequests.get(key);
5242
- if (!request || request.tile !== tile) {
5243
- request = /* alloc */
5244
- { tile, stream };
5245
- state.terrainRequests.set(key, request);
5246
- loadGridTerrain(state, key, tile, request);
5247
- }
5248
- if (!request.tiles) {
5249
- pending = true;
5250
- if (mesh && retained?.image === tile.el) {
5251
- retained.used = true;
5252
- styleNativeMesh(state, mesh, coreWhite, opacity);
5253
- }
5254
- continue;
5255
- }
5256
- if (mesh && mesh._terrainRequest === request && retained?.image === tile.el && retained.url === (tile.el.currentSrc || tile.el.src)) {
5257
- retained.used = true;
5258
- styleNativeMesh(state, mesh, coreWhite, opacity);
5259
- } else mesh = terrainGridMesh(state, key, tile, request, opacity);
5260
- } else if (mesh && !mesh._terrainRequest && retained?.image === tile.el && retained.url === (tile.el.currentSrc || tile.el.src)) {
5261
- retained.used = true;
5262
- styleNativeMesh(state, mesh, coreWhite, opacity);
5263
- } else {
5264
- [nw, se] = source._tileCoordsToNwSe(tile.coords);
5265
- mesh = quadNativeMesh(state, key, tile.el, boundsQuad(
5266
- state,
5267
- /* alloc */
5268
- new L.LatLngBounds(nw, se)
5269
- ), opacity);
5270
- }
5355
+ mesh = state.terrainRequests ? syncTerrainGridTile(state, key, tile, opacity) : syncGridTile(state, key, tile, opacity);
5356
+ if (state.terrainRequests && !state.terrainRequests.get(key).tiles) pending = true;
5271
5357
  if (mesh) mesh.renderOrder += tile.coords.z / 100;
5272
5358
  }
5273
5359
  if (stream && (pending || !Object.keys(source._tiles).length)) {
5274
- for ([key, mesh] of meshes) {
5275
- if (source._tiles[key] || !mesh._terrainRequest) continue;
5276
- retained = textures.get(key);
5277
- if (!retained) continue;
5278
- retained.used = true;
5279
- mesh._nativeUsed = true;
5280
- }
5360
+ retainGridTerrain(state);
5281
5361
  }
5282
5362
  }
5283
5363
 
@@ -6050,18 +6130,45 @@
6050
6130
  );
6051
6131
  }
6052
6132
 
6133
+ // src/core/projectNativePath.js
6134
+ init_L();
6135
+
6136
+ // src/weakmaps/pathProjectionByMap.js
6137
+ var pathProjectionByMap = /* @__PURE__ */ new WeakMap();
6138
+
6139
+ // src/core/projectNativePath.js
6140
+ function projectNativePath(source) {
6141
+ if (!L.version.startsWith("2.")) return source._project();
6142
+ const map = source._map, renderer = source._renderer;
6143
+ let projection = pathProjectionByMap.get(map);
6144
+ if (!projection) {
6145
+ projection = Object.create(L.Renderer.prototype);
6146
+ projection._map = map;
6147
+ pathProjectionByMap.set(map, projection);
6148
+ }
6149
+ projection._pathZoom = map.getZoom();
6150
+ projection._pathOrigin = map.getPixelOrigin();
6151
+ source._renderer = projection;
6152
+ try {
6153
+ source._project();
6154
+ } finally {
6155
+ if (renderer) source._renderer = renderer;
6156
+ else delete source._renderer;
6157
+ }
6158
+ }
6159
+
6053
6160
  // src/geometry/circleGeometry.js
6054
6161
  function circleGeometry(source, context) {
6055
6162
  const { map, point, fill, stroke, options, dash, width } = context;
6056
6163
  const center = map.project(source.getLatLng());
6057
6164
  let radius = source.getRadius(), radiusY = radius, index, i;
6058
6165
  if (source instanceof L.Circle) {
6059
- source._project();
6166
+ projectNativePath(source);
6060
6167
  const projected = source._point.add(map.getPixelOrigin());
6061
6168
  center.x = projected.x;
6062
6169
  center.y = projected.y;
6063
- radius = source._radius;
6064
- radiusY = source._radiusY || radius;
6170
+ radius = source._pxRadius ?? source._radius;
6171
+ radiusY = source._pxRadiusY ?? source._radiusY ?? radius;
6065
6172
  }
6066
6173
  if (options.fill) disk(point, center, radius, fill, radiusY);
6067
6174
  const count = Math.max(12, Math.min(128, Math.ceil(Math.PI * Math.sqrt(Math.max(radius, radiusY)))));
@@ -7533,7 +7640,7 @@
7533
7640
  function mapTryAnimatedPan(center, options) {
7534
7641
  const offset = this._getCenterOffset(center)._trunc();
7535
7642
  if (options?.animate !== true && !this.getSize().contains(offset)) return false;
7536
- mapMethods.value.panBy.call(this, offset, options);
7643
+ (mapMethods.value._panBy || mapMethods.value.panBy).call(this, offset, options);
7537
7644
  return true;
7538
7645
  }
7539
7646
 
@@ -7884,23 +7991,14 @@
7884
7991
  init_L();
7885
7992
  init_mapGetBearing();
7886
7993
  init_mapGetPitch();
7994
+
7995
+ // src/core/extendTerrainPixelBounds.js
7887
7996
  init_radians();
7888
- function gridlayerGetTiledPixelBounds(center) {
7889
- const map = this._map, stream = streamTerrainByMap.get(map);
7890
- if (!stream && !mapGetBearing(map) && !mapGetPitch(map)) return tiledBounds.value.call(this, center);
7891
- const bounds = map.getBounds();
7892
- const result = (
7893
- /* alloc */
7894
- new L.Bounds(
7895
- map.project(bounds.getNorthWest(), this._tileZoom),
7896
- map.project(bounds.getSouthEast(), this._tileZoom)
7897
- )
7898
- );
7899
- const shared = renderers.get(map), origin = shared && sceneOriginByLayer.get(shared);
7900
- if (!stream || !origin) return result;
7997
+ function extendTerrainPixelBounds(layer, result, stream, origin) {
7998
+ const map = layer._map;
7901
7999
  let minimum = Infinity, maximum = -Infinity, key, entry;
7902
8000
  for ([key, entry] of stream.terrainCache) {
7903
- if (!key.startsWith(`${this._tileZoom}/`) || !entry.range) continue;
8001
+ if (!key.startsWith(`${layer._tileZoom}/`) || !entry.range) continue;
7904
8002
  minimum = Math.min(minimum, entry.range[0]);
7905
8003
  maximum = Math.max(maximum, entry.range[1]);
7906
8004
  }
@@ -7914,12 +8012,29 @@
7914
8012
  for (j = 0; j < 2; j++) {
7915
8013
  point = j ? footprint.max : footprint.min;
7916
8014
  raw = mapMethods.value.containerPointToLayerPoint.call(map, animationPoint(map, point, true));
7917
- result.extend(map.project(map.layerPointToLatLng(raw), this._tileZoom));
8015
+ result.extend(map.project(map.layerPointToLatLng(raw), layer._tileZoom));
7918
8016
  }
7919
8017
  }
7920
8018
  return result;
7921
8019
  }
7922
8020
 
8021
+ // src/core/gridlayerGetTiledPixelBounds.js
8022
+ function gridlayerGetTiledPixelBounds(center) {
8023
+ const map = this._map, stream = streamTerrainByMap.get(map);
8024
+ if (!stream && !mapGetBearing(map) && !mapGetPitch(map)) return tiledBounds.value.call(this, center);
8025
+ const bounds = map.getBounds();
8026
+ const result = (
8027
+ /* alloc */
8028
+ new L.Bounds(
8029
+ map.project(bounds.getNorthWest(), this._tileZoom),
8030
+ map.project(bounds.getSouthEast(), this._tileZoom)
8031
+ )
8032
+ );
8033
+ const shared = renderers.get(map), origin = shared && sceneOriginByLayer.get(shared);
8034
+ if (!stream || !origin) return result;
8035
+ return extendTerrainPixelBounds(this, result, stream, origin);
8036
+ }
8037
+
7923
8038
  // src/camera/mapCamera.js
7924
8039
  mapMethods.value = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Map.prototype));
7925
8040
  L.Map.mergeOptions({
@@ -7935,7 +8050,7 @@
7935
8050
  touchPitch: false,
7936
8051
  compassBearing: false
7937
8052
  });
7938
- L.Map.include({
8053
+ Object.assign(L.Map.prototype, {
7939
8054
  layerPointToContainerPoint: mapLayerPointToContainerPoint,
7940
8055
  containerPointToLayerPoint: mapContainerPointToLayerPoint,
7941
8056
  _getCenterLayerPoint: mapGetCenterLayerPoint,
@@ -7952,7 +8067,7 @@
7952
8067
  L.Map.addInitHook(initializeCameraMap);
7953
8068
  markerMethods.value = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Marker.prototype));
7954
8069
  L.Marker.mergeOptions({ rotation: 0, rotateWithView: false, keepUpright: false, scale: 1 });
7955
- L.Marker.include({
8070
+ Object.assign(L.Marker.prototype, {
7956
8071
  setIcon: markerSetIcon,
7957
8072
  getEvents: markerGetEvents,
7958
8073
  _setPos: markerSetPos,
@@ -7960,26 +8075,26 @@
7960
8075
  _initInteraction: markerInitInteraction
7961
8076
  });
7962
8077
  popupEvents.value = L.Popup.prototype.getEvents;
7963
- L.Popup.include({
8078
+ Object.assign(L.Popup.prototype, {
7964
8079
  getEvents: popupGetEvents
7965
8080
  });
7966
8081
  tooltipEvents.value = L.Tooltip.prototype.getEvents;
7967
- L.Tooltip.include({
8082
+ Object.assign(L.Tooltip.prototype, {
7968
8083
  getEvents: tooltipGetEvents
7969
8084
  });
7970
8085
  popupPosition.value = L.Popup.prototype._updatePosition;
7971
8086
  popupPan.value = L.Popup.prototype._adjustPan;
7972
- L.Popup.include({
8087
+ Object.assign(L.Popup.prototype, {
7973
8088
  _adjustPan: popupAdjustPan,
7974
8089
  _updatePosition: popupUpdatePosition
7975
8090
  });
7976
8091
  tooltipPosition.value = L.Tooltip.prototype._setPosition;
7977
- L.Tooltip.include({
8092
+ Object.assign(L.Tooltip.prototype, {
7978
8093
  _setPosition: tooltipSetPosition
7979
8094
  });
7980
8095
  tiledBounds.value = L.GridLayer.prototype._getTiledPixelBounds;
7981
8096
  gridEvents.value = L.GridLayer.prototype.getEvents;
7982
- L.GridLayer.include({
8097
+ Object.assign(L.GridLayer.prototype, {
7983
8098
  getEvents: gridlayerGetEvents,
7984
8099
  _getTiledPixelBounds: gridlayerGetTiledPixelBounds
7985
8100
  });
@@ -8405,6 +8520,21 @@
8405
8520
  } else label.after(element);
8406
8521
  }
8407
8522
 
8523
+ // src/layer-controls/layerControlInputId.js
8524
+ init_L();
8525
+
8526
+ // src/globals/layerControlAddItem.js
8527
+ init_L();
8528
+ var layerControlAddItem = L?.LayersControl?.prototype._addItem;
8529
+
8530
+ // src/layer-controls/layerControlInputId.js
8531
+ if (layerControlAddItem && !L.Control.Layers) L.LayersControl.prototype._addItem = addLayerControlInputId;
8532
+ function addLayerControlInputId(entry) {
8533
+ const label = layerControlAddItem.call(this, entry);
8534
+ label.querySelector(".leaflet-control-layers-selector").layerId = L.Util.stamp(entry.layer);
8535
+ return label;
8536
+ }
8537
+
8408
8538
  // src/layer-controls/placeEntry.js
8409
8539
  function placeEntry(map, layer, element) {
8410
8540
  let input, entry;
@@ -8553,14 +8683,24 @@
8553
8683
  }
8554
8684
 
8555
8685
  // src/sunlight/initSunlight.js
8556
- L.Control.Time = L.Control.extend({
8557
- options: { position: "bottomright" },
8558
- initialize,
8559
- onAdd,
8560
- onRemove: onRemoveSun,
8561
- addTo,
8562
- remove
8563
- });
8686
+ init_extendLeafletClass();
8687
+ var TimeControl = class extends extendLeafletClass(L.Control) {
8688
+ static initHooks = true;
8689
+ static defaultOptions = { position: "bottomright" };
8690
+ constructor(options) {
8691
+ super(options);
8692
+ if (L.version.startsWith("2.")) {
8693
+ initialize.call(this, options);
8694
+ this.callInitHooks();
8695
+ }
8696
+ }
8697
+ };
8698
+ Object.assign(TimeControl.prototype, { onAdd, onRemove: onRemoveSun, addTo, remove });
8699
+ if (L.version.startsWith("1.")) {
8700
+ TimeControl.prototype.options = Object.assign(Object.create(L.Control.prototype.options), TimeControl.defaultOptions);
8701
+ TimeControl.prototype.initialize = initialize;
8702
+ }
8703
+ L.Control.Time = TimeControl;
8564
8704
 
8565
8705
  // src/walk/initWalk.js
8566
8706
  init_L();
@@ -9685,7 +9825,7 @@
9685
9825
  // src/sources/pumpSourceAreas.js
9686
9826
  function pump(layer, map = layer._map) {
9687
9827
  const shared = map && renderers.get(map);
9688
- if (!shared) return;
9828
+ if (!shared || !layersByLayer.has(shared)) return;
9689
9829
  const layers = (
9690
9830
  /* alloc */
9691
9831
  []
@@ -10121,6 +10261,7 @@
10121
10261
 
10122
10262
  // src/gpu/initializeRendererResources.js
10123
10263
  function initializeRendererResources(layer, device) {
10264
+ const renderer = rendererByLayer.get(layer);
10124
10265
  const layout = device.createBindGroupLayout(
10125
10266
  /* alloc */
10126
10267
  {
@@ -10151,26 +10292,23 @@
10151
10292
  )
10152
10293
  }
10153
10294
  );
10154
- const buffer = rendererByLayer.get(layer).device.createBuffer(
10295
+ const buffer = device.createBuffer(
10155
10296
  /* alloc */
10156
10297
  { size: 80, usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST }
10157
10298
  );
10158
- const sampler = rendererByLayer.get(layer).device.createSampler(
10299
+ const sampler = device.createSampler(
10159
10300
  /* alloc */
10160
10301
  { compare: "less-equal", minFilter: "linear", magFilter: "linear" }
10161
10302
  );
10162
- const lights = rendererByLayer.get(layer).device.createBuffer(
10303
+ const lights = device.createBuffer(
10163
10304
  /* alloc */
10164
10305
  { size: 32, usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST }
10165
10306
  );
10166
- rendererByLayer.get(layer).sunlight = /* alloc */
10307
+ renderer.sunlight = /* alloc */
10167
10308
  { layout, buffer, sampler, lights, size: 0 };
10168
- rendererByLayer.get(layer).device.queue.writeBuffer(buffer, 0, sceneSunlightUniforms);
10309
+ device.queue.writeBuffer(buffer, 0, sceneSunlightUniforms);
10169
10310
  resizeSunlight(layer, 1);
10170
- const emptyImage = document.createElement("canvas");
10171
- emptyImage.width = 1;
10172
- emptyImage.height = 1;
10173
- rendererByLayer.get(layer).roofFallbackTexture = /* alloc */
10311
+ renderer.roofFallbackTexture = /* alloc */
10174
10312
  {
10175
10313
  device,
10176
10314
  texture: device.createTexture(
@@ -10191,7 +10329,7 @@
10191
10329
  addressModeV: "clamp-to-edge"
10192
10330
  }
10193
10331
  ),
10194
- image: emptyImage,
10332
+ image: null,
10195
10333
  format: "rgba8unorm",
10196
10334
  srgb: false,
10197
10335
  uploaded: null
@@ -11945,12 +12083,24 @@
11945
12083
  }
11946
12084
 
11947
12085
  // src/walk/initWalk.js
11948
- L.Control.Walk = L.Control.extend({
11949
- options: { position: "bottomright", speed: 70, distance: 20 },
11950
- initialize: initialize2,
11951
- onAdd: onAdd2,
11952
- onRemove
11953
- });
12086
+ init_extendLeafletClass();
12087
+ var WalkControl = class extends extendLeafletClass(L.Control) {
12088
+ static initHooks = true;
12089
+ static defaultOptions = { position: "bottomright", speed: 70, distance: 20 };
12090
+ constructor(options) {
12091
+ super(options);
12092
+ if (L.version.startsWith("2.")) {
12093
+ initialize2.call(this, options);
12094
+ this.callInitHooks();
12095
+ }
12096
+ }
12097
+ };
12098
+ Object.assign(WalkControl.prototype, { onAdd: onAdd2, onRemove });
12099
+ if (L.version.startsWith("1.")) {
12100
+ WalkControl.prototype.options = Object.assign(Object.create(L.Control.prototype.options), WalkControl.defaultOptions);
12101
+ WalkControl.prototype.initialize = initialize2;
12102
+ }
12103
+ L.Control.Walk = WalkControl;
11954
12104
 
11955
12105
  // src/weakmaps/eventMapByLayer.js
11956
12106
  var eventMapByLayer = /* @__PURE__ */ new WeakMap();
@@ -14420,16 +14570,21 @@
14420
14570
  return candidates.sort(compareVectorLabelPriority);
14421
14571
  }
14422
14572
 
14573
+ // src/vector-tiles/updateVectorLabelStyle.js
14574
+ function updateVectorLabelStyle(label, zoom) {
14575
+ label.size = evaluateStyle(label.entry.layout?.["text-size"] ?? 12, label.properties, zoom);
14576
+ label.color = evaluateStyle(label.entry.paint?.["text-color"] ?? "#000", label.properties, zoom);
14577
+ label.halo = evaluateStyle(label.entry.paint?.["text-halo-color"] ?? "#fff", label.properties, zoom);
14578
+ label.haloWidth = evaluateStyle(label.entry.paint?.["text-halo-width"] ?? 0, label.properties, zoom);
14579
+ }
14580
+
14423
14581
  // src/vector-tiles/vectorLabelCells.js
14424
14582
  function vectorLabelCells(layer, label, size) {
14425
14583
  const map = layer._map, zoom = vectorStyleZoom(layer);
14426
14584
  if (!visibleStyle(label.entry, label.properties, zoom)) return null;
14427
- label.size = evaluateStyle(label.entry.layout?.["text-size"] ?? 12, label.properties, zoom);
14585
+ updateVectorLabelStyle(label, zoom);
14428
14586
  if (!(label.size > 0)) return null;
14429
14587
  if (label.icon && !vectorTileOptionsByLayer.get(layer).spriteSheet?.index[label.icon]) return null;
14430
- label.color = evaluateStyle(label.entry.paint?.["text-color"] ?? "#000", label.properties, zoom);
14431
- label.halo = evaluateStyle(label.entry.paint?.["text-halo-color"] ?? "#fff", label.properties, zoom);
14432
- label.haloWidth = evaluateStyle(label.entry.paint?.["text-halo-width"] ?? 0, label.properties, zoom);
14433
14588
  if (label.along && label.pixelBase * 2 ** map.getZoom() < label.text.length * label.size * 0.6) return null;
14434
14589
  const point = map.latLngToContainerPoint(label.latlng);
14435
14590
  if (point.x < 0 || point.y < 0 || point.x > size.x || point.y > size.y) return null;
@@ -14505,7 +14660,10 @@
14505
14660
  function vectorLabelIcon(label, sheet) {
14506
14661
  if (label.icon) return vectorSpriteIcon(label, sheet);
14507
14662
  const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
14508
- const lines = label.along ? [label.text] : wrapVectorLabel(label.text);
14663
+ const lines = label.along ? (
14664
+ /* alloc */
14665
+ [label.text]
14666
+ ) : wrapVectorLabel(label.text);
14509
14667
  let longest = 0, line2, key, text, index;
14510
14668
  for (line2 of lines) longest = Math.max(longest, Array.from(line2).length);
14511
14669
  const width = Math.max(40, longest * label.size * 0.65 + 12);
@@ -16569,7 +16727,7 @@
16569
16727
  }
16570
16728
 
16571
16729
  // src/scene/initializerFor.js
16572
- function initializerFor(type, options = {}) {
16730
+ function initializerFor(type, options = sceneEmptyOptions) {
16573
16731
  switch (type) {
16574
16732
  case "raster":
16575
16733
  return options.asset !== void 0 || /\.tiff?(?:[?#]|$)/i.test(options.url) ? initCog : initRaster;
@@ -16637,7 +16795,7 @@
16637
16795
  if (type === "vector") {
16638
16796
  if (isVectorTileSource(settings)) {
16639
16797
  initVectorTiles(this, settings);
16640
- } else if (settings.data !== void 0 || settings.url && !/\.(?:pmtiles|glb|gltf)(?:[?#]|$)/i.test(settings.url)) {
16798
+ } else if (settings.data !== void 0 || settings.style !== void 0 && !settings.url || settings.url && !/\.(?:pmtiles|glb|gltf)(?:[?#]|$)/i.test(settings.url)) {
16641
16799
  initializeGeoJSON(this, settings);
16642
16800
  } else {
16643
16801
  init3D(this, settings);
@@ -16722,6 +16880,9 @@
16722
16880
  return markerSetRotation(this, rotation);
16723
16881
  }
16724
16882
 
16883
+ // src/core/layerCallInitHooks.js
16884
+ init_L();
16885
+
16725
16886
  // src/core/initializeNativeLayer.js
16726
16887
  init_L();
16727
16888
 
@@ -16736,14 +16897,14 @@
16736
16897
 
16737
16898
  // src/core/closestCameraLayerPoint.js
16738
16899
  function closestCameraLayerPoint(point) {
16739
- this._project();
16900
+ projectNativePath(this);
16740
16901
  this._parts = this._rings;
16741
16902
  return closestMethods.get(this).call(this, point);
16742
16903
  }
16743
16904
 
16744
16905
  // src/core/cameraCircleBounds.js
16745
16906
  function cameraCircleBounds() {
16746
- this._project();
16907
+ if (this._map) projectNativePath(this);
16747
16908
  return boundsMethods.get(this).call(this);
16748
16909
  }
16749
16910
 
@@ -16848,25 +17009,66 @@
16848
17009
  }
16849
17010
 
16850
17011
  // src/core/layerCallInitHooks.js
16851
- function layerCallInitHooks2() {
16852
- if (!sceneLayers.has(this)) {
17012
+ function layerCallInitHooks() {
17013
+ const initialized = this._initHooksCalled;
17014
+ if (!L.version.startsWith("2.")) layerProto.value.callInitHooks.call(this);
17015
+ if (L.version.startsWith("2.") || !initialized) {
16853
17016
  sceneLayers.add(this);
17017
+ initializeNativeLayer.call(this);
16854
17018
  }
16855
- const initialized = this._initHooksCalled;
16856
- layerCallInitHooks.value.call(this);
16857
- if (!initialized) initializeNativeLayer.call(this);
17019
+ }
17020
+
17021
+ // src/globals/leafletLayer.js
17022
+ init_L();
17023
+ var leafletLayer = L?.Layer;
17024
+
17025
+ // src/core/constructLayer.js
17026
+ function constructLayer(options) {
17027
+ const layer = Reflect.construct(
17028
+ leafletLayer,
17029
+ /* alloc */
17030
+ [],
17031
+ new.target
17032
+ );
17033
+ layerInitialize.call(layer, options);
17034
+ layer.callInitHooks();
17035
+ return layer;
17036
+ }
17037
+
17038
+ // src/core/layerAddInitHook.js
17039
+ init_L();
17040
+ function layerAddInitHook() {
17041
+ leafletLayer.addInitHook.apply(this === L.Layer ? leafletLayer : this, arguments);
17042
+ return this;
17043
+ }
17044
+
17045
+ // src/core/layerMergeOptions.js
17046
+ init_L();
17047
+ function layerMergeOptions(options) {
17048
+ leafletLayer.mergeOptions.call(this === L.Layer ? leafletLayer : this, options);
17049
+ return this;
16858
17050
  }
16859
17051
 
16860
17052
  // src/index.js
16861
- layerProto.value = Object.defineProperties({}, Object.getOwnPropertyDescriptors(L.Layer.prototype));
16862
- layerCallInitHooks.value = L.Layer.prototype.callInitHooks;
16863
- L.Layer.include({
16864
- initialize: layerInitialize,
16865
- _layerAdd: layerLayerAdd,
16866
- callInitHooks: layerCallInitHooks2
16867
- });
17053
+ layerProto.value = Object.defineProperties({}, Object.getOwnPropertyDescriptors(leafletLayer.prototype));
17054
+ layerProto.value._layerAdd = leafletLayer.prototype._layerAdd;
17055
+ layerProto.value.callInitHooks = leafletLayer.prototype.callInitHooks;
17056
+ if (L.version.startsWith("2.")) {
17057
+ Object.setPrototypeOf(constructLayer, leafletLayer);
17058
+ constructLayer.prototype = leafletLayer.prototype;
17059
+ constructLayer.initHooks = true;
17060
+ constructLayer.addInitHook = layerAddInitHook;
17061
+ constructLayer.mergeOptions = layerMergeOptions;
17062
+ L.Layer = constructLayer;
17063
+ leafletLayer.prototype.constructor = L.Layer;
17064
+ leafletLayer.addInitHook(layerCallInitHooks);
17065
+ } else {
17066
+ leafletLayer.prototype.initialize = layerInitialize;
17067
+ leafletLayer.prototype.callInitHooks = layerCallInitHooks;
17068
+ }
17069
+ Object.assign(leafletLayer.prototype, { _layerAdd: layerLayerAdd });
16868
17070
  removeLayer.value = L.Map.prototype.removeLayer;
16869
- L.Map.include({ removeLayer: removeLayer2, getPitch, getBearing, setPitch, setBearing });
16870
- L.Marker.include({ setRotation });
17071
+ Object.assign(L.Map.prototype, { removeLayer: removeLayer2, getPitch, getBearing, setPitch, setBearing });
17072
+ Object.assign(L.Marker.prototype, { setRotation });
16871
17073
  })();
16872
17074
  //# sourceMappingURL=leaflet-city-mapper-src.js.map