leaflet-city-mapper 0.0.6 → 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 (283) hide show
  1. package/README.md +11 -6
  2. package/cucumber.mjs +1 -3
  3. package/dist/leaflet-city-mapper-src.js +8574 -7879
  4. package/dist/leaflet-city-mapper-src.js.map +4 -4
  5. package/dist/leaflet-city-mapper-worker-src.js +2776 -0
  6. package/dist/leaflet-city-mapper-worker-src.js.map +4 -4
  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 -3
  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/setBearing.js +5 -0
  20. package/src/camera/setPitch.js +5 -0
  21. package/src/camera/updateMapCamera.js +8 -6
  22. package/src/cog/initCog.js +2 -2
  23. package/src/controls/cameraControls.js +27 -22
  24. package/src/core/cameraCircleBounds.js +2 -1
  25. package/src/core/closestCameraLayerPoint.js +2 -1
  26. package/src/core/constructLayer.js +9 -0
  27. package/src/core/extendLeafletClass.js +5 -0
  28. package/src/core/extendTerrainPixelBounds.js +31 -0
  29. package/src/core/gridlayerGetTiledPixelBounds.js +12 -4
  30. package/src/core/layerAddInitHook.js +7 -0
  31. package/src/core/layerCallInitHooks.js +13 -13
  32. package/src/core/layerMergeOptions.js +7 -0
  33. package/src/core/markerSetPos.js +1 -1
  34. package/src/core/popupGetEvents.js +1 -1
  35. package/src/core/popupUpdatePosition.js +8 -8
  36. package/src/core/projectNativePath.js +23 -0
  37. package/src/core/tooltipGetEvents.js +1 -1
  38. package/src/core/tooltipSetPosition.js +2 -2
  39. package/src/geometry/appendNativeTriangle.js +2 -2
  40. package/src/geometry/circleGeometry.js +4 -3
  41. package/src/geometry/createModelGeometry.js +2 -9
  42. package/src/geometry/dashedSegment.js +10 -5
  43. package/src/geometry/disk.js +1 -1
  44. package/src/geometry/fillNativePolygon.js +20 -0
  45. package/src/geometry/lineJoin.js +2 -2
  46. package/src/geometry/markerQuadCorners.js +6 -0
  47. package/src/geometry/nativeGeometry.js +1 -1
  48. package/src/geometry/polygon.js +4 -10
  49. package/src/geometry/segment.js +4 -3
  50. package/src/globals/colorTexture.js +6 -0
  51. package/src/globals/depthTexture.js +1 -0
  52. package/src/globals/drawMeshEntry.js +1 -1
  53. package/src/globals/layerControlAddItem.js +3 -0
  54. package/src/globals/leafletLayer.js +3 -0
  55. package/src/globals/meshPipeline.js +1 -0
  56. package/src/globals/mvtTextDecoder.js +1 -0
  57. package/src/globals/nativeScalableStyleKeys.js +1 -0
  58. package/src/globals/scenePass.js +1 -0
  59. package/src/globals/vectorStyleNamedColors.js +8 -0
  60. package/src/globals/vectorTileEvents.js +1 -0
  61. package/src/globals/workerCogSource.js +1 -0
  62. package/src/gpu/initializeRendererResources.js +10 -12
  63. package/src/gpu/mountRenderer.js +4 -11
  64. package/src/gpu/releaseRenderer.js +1 -0
  65. package/src/index.js +31 -22
  66. package/src/layer-controls/layerControlInputId.js +11 -0
  67. package/src/layer-controls/placeEntry.js +2 -0
  68. package/src/materials/createProgram.js +7 -6
  69. package/src/materials/createProgramUniforms.js +1 -0
  70. package/src/models/loadModel.js +6 -10
  71. package/src/models/loadModelResources.js +2 -8
  72. package/src/models/modelNode.js +3 -7
  73. package/src/models/prepareModel.js +19 -0
  74. package/src/models/prepareModelGeometry.js +25 -0
  75. package/src/models/prepareModelPrimitive.js +17 -0
  76. package/src/mvt/addMvtCrossings.js +17 -0
  77. package/src/mvt/appendMvtBandTriangles.js +31 -0
  78. package/src/mvt/appendMvtCoordinates.js +11 -0
  79. package/src/mvt/appendMvtPolygonTriangles.js +19 -0
  80. package/src/mvt/beginMvtPath.js +9 -0
  81. package/src/mvt/closeMvtPath.js +7 -0
  82. package/src/mvt/collectMvtEdges.js +19 -0
  83. package/src/mvt/createMvtReader.js +7 -0
  84. package/src/mvt/decodeVectorTile.js +32 -0
  85. package/src/mvt/expectMvtWire.js +3 -0
  86. package/src/mvt/finishMvtPath.js +5 -0
  87. package/src/mvt/finiteMvtCoordinate.js +7 -0
  88. package/src/mvt/groupMvtPolygons.js +25 -0
  89. package/src/mvt/isMvtFallbackError.js +6 -0
  90. package/src/mvt/mergeMvtActiveEdges.js +9 -0
  91. package/src/mvt/mvtEdgeX.js +4 -0
  92. package/src/mvt/mvtPathsVertices.js +8 -0
  93. package/src/mvt/mvtPolygonPaths.js +12 -0
  94. package/src/mvt/numericMvtValue.js +4 -0
  95. package/src/mvt/readMvtFeature.js +34 -0
  96. package/src/mvt/readMvtField.js +8 -0
  97. package/src/mvt/readMvtGeometry.js +29 -0
  98. package/src/mvt/readMvtInteger.js +12 -0
  99. package/src/mvt/readMvtKnownValue.js +21 -0
  100. package/src/mvt/readMvtLayer.js +31 -0
  101. package/src/mvt/readMvtMessage.js +10 -0
  102. package/src/mvt/readMvtNumber.js +9 -0
  103. package/src/mvt/readMvtNumbers.js +11 -0
  104. package/src/mvt/readMvtString.js +6 -0
  105. package/src/mvt/readMvtValue.js +19 -0
  106. package/src/mvt/skipMvtField.js +14 -0
  107. package/src/mvt/sortMvtActiveEdges.js +15 -0
  108. package/src/mvt/sortedMvtLevels.js +22 -0
  109. package/src/mvt/takeMvtBytes.js +8 -0
  110. package/src/mvt/tessellateVectorRings.js +19 -0
  111. package/src/mvt/triangulateVectorRings.js +19 -0
  112. package/src/native/beforeNativeRender.js +6 -0
  113. package/src/native/canScaleNativeStyle.js +17 -0
  114. package/src/native/createNativeMesh.js +31 -0
  115. package/src/native/disposeNativeLayer.js +1 -1
  116. package/src/native/getGridTerrainTile.js +34 -0
  117. package/src/native/gridTerrainElevation.js +26 -0
  118. package/src/native/loadGridTerrain.js +26 -0
  119. package/src/native/nativeLayer.js +2 -2
  120. package/src/native/nativeLayerMethod.js +5 -14
  121. package/src/native/nativeProgram.js +20 -0
  122. package/src/native/nativeTerrainElevation.js +16 -0
  123. package/src/native/nativeVectorGeometry.js +23 -0
  124. package/src/native/orderNativeGridLayer.js +14 -0
  125. package/src/native/prepareGridTerrainRequests.js +16 -0
  126. package/src/native/putNativeMesh.js +15 -21
  127. package/src/native/refreshNativeEvent.js +13 -2
  128. package/src/native/refreshNativeLayer.js +1 -0
  129. package/src/native/retainGridTerrain.js +10 -0
  130. package/src/native/syncGridLayer.js +17 -19
  131. package/src/native/syncGridTile.js +18 -0
  132. package/src/native/syncNativeStrokeAnchors.js +12 -0
  133. package/src/native/syncNativeStrokeZoom.js +29 -0
  134. package/src/native/syncTerrainGridTile.js +28 -0
  135. package/src/native/syncVectorLayer.js +15 -13
  136. package/src/native/terrainGridMesh.js +34 -0
  137. package/src/native/updateNativeStrokeRadius.js +9 -0
  138. package/src/projections/displayContainerPoint.js +23 -3
  139. package/src/projections/groundBounds.js +2 -2
  140. package/src/projections/localPixel.js +7 -2
  141. package/src/projections/localPixelForGeometry.js +4 -2
  142. package/src/projections/projectCameraPoint.js +6 -5
  143. package/src/rendering/collectVisibleMesh.js +5 -2
  144. package/src/rendering/drawGeometry.js +11 -11
  145. package/src/rendering/drawSceneMeshes.js +3 -1
  146. package/src/rendering/nativeStrokeExpansion.js +4 -0
  147. package/src/rendering/prepareMeshUniforms.js +2 -0
  148. package/src/rendering/resizeRenderer.js +20 -10
  149. package/src/scene/initializerFor.js +4 -5
  150. package/src/scene/layerInitialize.js +14 -12
  151. package/src/scene/resolveNextInitialization.js +1 -1
  152. package/src/shaders/materialShaders.js +1 -0
  153. package/src/shaders/materialVertexShader.js +7 -2
  154. package/src/shaders/nativeStrokeShader.js +6 -0
  155. package/src/shadows/drawShadowMeshes.js +6 -5
  156. package/src/sources/attachAreaMesh.js +5 -6
  157. package/src/sources/buildArea.js +4 -5
  158. package/src/sources/buildAreaFeature.js +3 -19
  159. package/src/sources/initVectorTiles.js +15 -0
  160. package/src/sources/isVectorTileSource.js +4 -0
  161. package/src/sources/pumpSourceAreas.js +1 -1
  162. package/src/sources/readyVectorTiles.js +10 -0
  163. package/src/sources/sourceAreaContext.js +1 -6
  164. package/src/sunlight/createSun.js +0 -1
  165. package/src/sunlight/initSunlight.js +19 -8
  166. package/src/terrain/initTerrain.js +7 -1
  167. package/src/terrain/loadTerrain.js +4 -1
  168. package/src/terrain/mapElevationOf.js +5 -1
  169. package/src/terrain/onTerrainAdd.js +11 -1
  170. package/src/terrain/onTerrainRemove.js +10 -1
  171. package/src/textures/nativeTextureFor.js +2 -3
  172. package/src/textures/uploadCanvasTexture.js +11 -2
  173. package/src/utils/yieldTask.js +5 -0
  174. package/src/vector-style/appendQuotedStyleCharacter.js +22 -0
  175. package/src/vector-style/arrayContainsRange.js +8 -0
  176. package/src/vector-style/evaluateBoolean.js +18 -0
  177. package/src/vector-style/evaluateCoalesceOrCase.js +21 -0
  178. package/src/vector-style/evaluateComparison.js +16 -0
  179. package/src/vector-style/evaluateIExpression.js +8 -0
  180. package/src/vector-style/evaluateInput.js +6 -0
  181. package/src/vector-style/evaluateInterpolate.js +27 -0
  182. package/src/vector-style/evaluateMatch.js +12 -0
  183. package/src/vector-style/evaluateMath.js +14 -0
  184. package/src/vector-style/evaluateMembership.js +18 -0
  185. package/src/vector-style/evaluateNegation.js +13 -0
  186. package/src/vector-style/evaluatePrimitive.js +9 -0
  187. package/src/vector-style/evaluateStep.js +11 -0
  188. package/src/vector-style/evaluateStyle.js +33 -0
  189. package/src/vector-style/evaluateToExpression.js +14 -0
  190. package/src/vector-style/fillVectorPaint.js +17 -0
  191. package/src/vector-style/lineVectorPaint.js +21 -0
  192. package/src/vector-style/parseFunctionalColor.js +14 -0
  193. package/src/vector-style/parseHexColor.js +13 -0
  194. package/src/vector-style/parseVectorStyle.js +13 -0
  195. package/src/vector-style/readPaintValue.js +6 -0
  196. package/src/vector-style/removeTrailingCommas.js +12 -0
  197. package/src/vector-style/scaleDashArray.js +13 -0
  198. package/src/vector-style/skipStyleComment.js +9 -0
  199. package/src/vector-style/stripStyleComments.js +21 -0
  200. package/src/vector-style/styleColor.js +11 -0
  201. package/src/vector-style/validateVectorLayers.js +10 -0
  202. package/src/vector-style/vectorPaint.js +8 -0
  203. package/src/vector-style/visibleStyle.js +7 -0
  204. package/src/vector-tiles/appendVectorBatch.js +22 -0
  205. package/src/vector-tiles/attachVectorTileBatch.js +17 -0
  206. package/src/vector-tiles/attachVectorTileBatches.js +15 -0
  207. package/src/vector-tiles/compareVectorLabelPriority.js +3 -0
  208. package/src/vector-tiles/compareVectorTileDistance.js +3 -0
  209. package/src/vector-tiles/configureVectorTileLayer.js +28 -0
  210. package/src/vector-tiles/createVectorLabel.js +22 -0
  211. package/src/vector-tiles/forwardVectorTileError.js +5 -0
  212. package/src/vector-tiles/loadVectorSprite.js +5 -0
  213. package/src/vector-tiles/loadVectorTile.js +36 -0
  214. package/src/vector-tiles/onVectorTileAdd.js +39 -0
  215. package/src/vector-tiles/onVectorTileMessage.js +10 -0
  216. package/src/vector-tiles/onVectorTileRemove.js +20 -0
  217. package/src/vector-tiles/onVectorTileWorkerError.js +11 -0
  218. package/src/vector-tiles/paintVectorTileBatch.js +12 -0
  219. package/src/vector-tiles/prepareVectorLabel.js +25 -0
  220. package/src/vector-tiles/prepareVectorStyleLayer.js +30 -0
  221. package/src/vector-tiles/prepareVectorTile.js +16 -0
  222. package/src/vector-tiles/projectVectorPaths.js +15 -0
  223. package/src/vector-tiles/projectVectorPoint.js +6 -0
  224. package/src/vector-tiles/projectVectorTriangles.js +18 -0
  225. package/src/vector-tiles/pruneVectorTiles.js +11 -0
  226. package/src/vector-tiles/pumpVectorTiles.js +18 -0
  227. package/src/vector-tiles/readTileJSON.js +17 -0
  228. package/src/vector-tiles/readVectorStyle.js +17 -0
  229. package/src/vector-tiles/refreshVectorTiles.js +5 -0
  230. package/src/vector-tiles/reserveVectorLabelCells.js +6 -0
  231. package/src/vector-tiles/retireVectorTileGroup.js +13 -0
  232. package/src/vector-tiles/revokeVectorWorkerUrl.js +9 -0
  233. package/src/vector-tiles/rotateVectorLabel.js +12 -0
  234. package/src/vector-tiles/rotateVectorLabels.js +6 -0
  235. package/src/vector-tiles/simplifyVectorPath.js +21 -0
  236. package/src/vector-tiles/updateVectorLabelMarker.js +27 -0
  237. package/src/vector-tiles/updateVectorLabelStyle.js +8 -0
  238. package/src/vector-tiles/updateVectorTileLabels.js +28 -0
  239. package/src/vector-tiles/updateVectorTilePaint.js +20 -0
  240. package/src/vector-tiles/updateVectorTiles.js +29 -0
  241. package/src/vector-tiles/validateVectorTileZooms.js +6 -0
  242. package/src/vector-tiles/vectorFeaturePaint.js +15 -0
  243. package/src/vector-tiles/vectorFeaturePaths.js +16 -0
  244. package/src/vector-tiles/vectorFeatureZoom.js +8 -0
  245. package/src/vector-tiles/vectorLabelAnchors.js +24 -0
  246. package/src/vector-tiles/vectorLabelCandidates.js +11 -0
  247. package/src/vector-tiles/vectorLabelCells.js +23 -0
  248. package/src/vector-tiles/vectorLabelIcon.js +30 -0
  249. package/src/vector-tiles/vectorLabelProperty.js +3 -0
  250. package/src/vector-tiles/vectorLabelText.js +10 -0
  251. package/src/vector-tiles/vectorSpriteIcon.js +11 -0
  252. package/src/vector-tiles/vectorStraightRun.js +14 -0
  253. package/src/vector-tiles/vectorStyleDependencies.js +15 -0
  254. package/src/vector-tiles/vectorStyleValue.js +5 -0
  255. package/src/vector-tiles/vectorStyleZoom.js +6 -0
  256. package/src/vector-tiles/vectorTileAwaited.js +9 -0
  257. package/src/vector-tiles/vectorTileOverlaps.js +4 -0
  258. package/src/vector-tiles/vectorTilePaint.js +10 -0
  259. package/src/vector-tiles/vectorTileSettings.js +17 -0
  260. package/src/vector-tiles/vectorTilesIdle.js +3 -0
  261. package/src/vector-tiles/vectorTolerance.js +4 -0
  262. package/src/vector-tiles/wrapVectorLabel.js +11 -0
  263. package/src/walk/initWalk.js +19 -6
  264. package/src/weakmaps/nativeProgramsByRenderer.js +1 -0
  265. package/src/weakmaps/pathProjectionByMap.js +1 -0
  266. package/src/weakmaps/streamTerrainByLayer.js +1 -0
  267. package/src/weakmaps/streamTerrainByMap.js +1 -0
  268. package/src/weakmaps/vectorTileOptionsByLayer.js +1 -0
  269. package/src/weakmaps/vectorWorkerByLayer.js +1 -0
  270. package/src/weakmaps/workerMapByLayer.js +1 -0
  271. package/src/workers/buildAreaInWorker.js +3 -27
  272. package/src/workers/cogWorker.js +20 -0
  273. package/src/workers/createGeometryWorker.js +1 -0
  274. package/src/workers/geometryWorker.js +15 -0
  275. package/src/workers/getCogInWorker.js +7 -0
  276. package/src/workers/modelWorker.js +10 -0
  277. package/src/workers/openCogInWorker.js +14 -0
  278. package/src/workers/runSourceWorker.js +32 -0
  279. package/src/workers/settleGeometryWorker.js +1 -1
  280. package/src/workers/vectorTileWorker.js +10 -0
  281. package/src/geometry/buildExtrudedPolygon.js +0 -10
  282. package/src/globals/layerCallInitHooks.js +0 -1
  283. package/src/sources/buildAreaPoint.js +0 -7
@@ -0,0 +1,10 @@
1
+ import { vectorPaint } from '../vector-style/vectorPaint.js';
2
+ import { visibleStyle } from '../vector-style/visibleStyle.js';
3
+
4
+ export function vectorTilePaint(batch, zoom) {
5
+ const paint = vectorPaint(batch.entry, batch.properties, zoom);
6
+ if (!visibleStyle(batch.entry, batch.properties, zoom)) {
7
+ paint.opacity = 0; paint.fillOpacity = 0;
8
+ }
9
+ return paint;
10
+ }
@@ -0,0 +1,17 @@
1
+ import { readTileJSON } from './readTileJSON.js';
2
+ import { readVectorStyle } from './readVectorStyle.js';
3
+ import { validateVectorTileZooms } from './validateVectorTileZooms.js';
4
+
5
+ export async function vectorTileSettings(options) {
6
+ if (!options || typeof options !== 'object') throw /* alloc */ new TypeError('Vector tiles require source options');
7
+ if (options.tileJSON) options = await readTileJSON(options);
8
+ let { url, style, minNativeZoom = 0, maxNativeZoom = 14, maxZoom = 19 } = options;
9
+ let key;
10
+ if (typeof url === 'string') url = url.replaceAll(/%7B([zxy])%7D/gi, '{$1}');
11
+ for (key of /* alloc */ ['{z}', '{x}', '{y}']) {
12
+ if (typeof url !== 'string' || !url.includes(key)) throw /* alloc */ new Error('Vector tiles require an XYZ URL template');
13
+ }
14
+ validateVectorTileZooms(minNativeZoom, maxNativeZoom, maxZoom);
15
+ style = await readVectorStyle(style);
16
+ return /* alloc */ { ...options, url, style, minNativeZoom, maxNativeZoom, maxZoom };
17
+ }
@@ -0,0 +1,3 @@
1
+ export function vectorTilesIdle(layer, session) {
2
+ return layer.session === session && performance.now() - (layer.changedAt || 0) >= 180;
3
+ }
@@ -0,0 +1,4 @@
1
+ /** Simplification tolerance in tile units: about 0.7 screen pixels at the displayed scale. */
2
+ export function vectorTolerance(job, layer) {
3
+ return layer.extent / 256 / 2 ** Math.max(-1, job.mapZoom - job.coords.z) * 0.7;
4
+ }
@@ -0,0 +1,11 @@
1
+ /** Greedy word wrap at 10 ems (MapLibre's default text-max-width), estimating glyph width at 0.52 em. */
2
+ export function wrapVectorLabel(text) {
3
+ const limit = Math.floor(10 / 0.52), lines = /* alloc */ [];
4
+ let line = '', word;
5
+ for (word of text.split(' ')) {
6
+ if (line && Array.from(`${line} ${word}`).length > limit) { lines.push(line); line = word; }
7
+ else line = line ? `${line} ${word}` : word;
8
+ }
9
+ lines.push(line);
10
+ return lines;
11
+ }
@@ -2,6 +2,7 @@ import { L } from '../globals/L.js';
2
2
  import { initialize } from './initializeWalkControl.js';
3
3
  import { onAdd } from './onAddWalkControl.js';
4
4
  import { onRemove } from './onRemoveWalkControl.js';
5
+ import { extendLeafletClass } from '../core/extendLeafletClass.js';
5
6
 
6
7
  /**
7
8
  * Third-person walk mode, toggled by a map button (and Esc): a pedestrian at the map centre runs with W/S (or ↑/↓) and
@@ -11,9 +12,21 @@ import { onRemove } from './onRemoveWalkControl.js';
11
12
  * Options: `speed` (m/s, default 70), `distance` (camera distance in metres, default 20), `position` (button corner, default 'bottomright').
12
13
  * Buildings, trees, models, streetlights and traffic block movement; the walker is moved out of newly loaded obstacles.
13
14
  */
14
- L.Control.Walk = L.Control.extend({
15
- options: { position: 'bottomright', speed: 70, distance: 20 },
16
- initialize,
17
- onAdd,
18
- onRemove,
19
- });
15
+ class WalkControl extends extendLeafletClass(L.Control) {
16
+ static initHooks = true;
17
+ static defaultOptions = { position: 'bottomright', speed: 70, distance: 20 };
18
+
19
+ constructor(options) {
20
+ super(options);
21
+ if (L.version.startsWith('2.')) {
22
+ initialize.call(this, options);
23
+ this.callInitHooks();
24
+ }
25
+ }
26
+ }
27
+ Object.assign(WalkControl.prototype, { onAdd, onRemove });
28
+ if (L.version.startsWith('1.')) {
29
+ WalkControl.prototype.options = Object.assign(Object.create(L.Control.prototype.options), WalkControl.defaultOptions);
30
+ WalkControl.prototype.initialize = initialize;
31
+ }
32
+ L.Control.Walk = WalkControl;
@@ -0,0 +1 @@
1
+ export const nativeProgramsByRenderer = new WeakMap();
@@ -0,0 +1 @@
1
+ export const pathProjectionByMap = new WeakMap();
@@ -0,0 +1 @@
1
+ export const streamTerrainByLayer = new WeakMap();
@@ -0,0 +1 @@
1
+ export const streamTerrainByMap = new WeakMap();
@@ -0,0 +1 @@
1
+ export const vectorTileOptionsByLayer = new WeakMap();
@@ -0,0 +1 @@
1
+ export const vectorWorkerByLayer = new WeakMap();
@@ -0,0 +1 @@
1
+ export const workerMapByLayer = new WeakMap();
@@ -1,40 +1,16 @@
1
- import { geometryWorkerUrl } from '../globals/geometryWorkerUrl.js';
2
- import { startGeometryWorker } from './startGeometryWorker.js';
3
- import { acquireGeometryWorker } from './acquireGeometryWorker.js';
1
+ import { runSourceWorker } from './runSourceWorker.js';
4
2
 
5
3
  export async function buildAreaInWorker(context, signal) {
6
- const entry = acquireGeometryWorker(context.map || context.backend._map, context.backend.options.workerUrl || geometryWorkerUrl);
7
- const { worker, pool } = entry;
8
- const task = /* alloc */ {
9
- worker, signal,
10
- input: /* alloc */ { jobs: context.jobs, nightLight: Boolean(context.backend.options.nightLight) },
11
- };
12
- entry.task = task;
13
- let completed = false;
14
4
  try {
15
- const data = await /* alloc */ new Promise(startGeometryWorker.bind(null, task));
5
+ const data = await runSourceWorker(context.map || context.backend._map, context.backend.options.workerUrl,
6
+ /* alloc */ { jobs: context.jobs, nightLight: Boolean(context.backend.options.nightLight) }, signal);
16
7
  let i;
17
8
  for (i = 0; i < data.ranges.length; i++) Object.assign(context.featureFaces[i], data.ranges[i]);
18
9
  context.positions = data.positions;
19
10
  context.uvs = data.uvs;
20
11
  context.lights = data.lights;
21
12
  context.preparedGeometry = data;
22
- completed = true;
23
13
  } finally {
24
- worker.removeEventListener('message', task.onEvent);
25
- worker.removeEventListener('error', task.onEvent);
26
- worker.removeEventListener('messageerror', task.onEvent);
27
- signal.removeEventListener('abort', task.onEvent);
28
- entry.task = null;
29
- if (completed && pool && !pool.closed && !signal.aborted) pool.idle.push(entry);
30
- else {
31
- if (!entry.closed) worker.terminate();
32
- if (pool) pool.entries.delete(entry);
33
- }
34
- if (entry.blobUrl) {
35
- URL.revokeObjectURL(entry.blobUrl);
36
- entry.blobUrl = null;
37
- }
38
14
  context.jobs = null;
39
15
  }
40
16
  }
@@ -0,0 +1,20 @@
1
+ import { openCog } from '../cog/openCog.js';
2
+ import { workerCogSource } from '../globals/workerCogSource.js';
3
+
4
+ export async function onCogMessage({ data }) {
5
+ try {
6
+ const key = JSON.stringify(/* alloc */ [data.url, data.asset]);
7
+ if (!workerCogSource.has(key)) {
8
+ workerCogSource.set(key, openCog(data.url, data.asset));
9
+ if (workerCogSource.size > 4) workerCogSource.delete(workerCogSource.keys().next().value);
10
+ }
11
+ const archive = await workerCogSource.get(key);
12
+ const result = data.z === undefined ? await archive.getHeader() : await archive.getZxy(data.z, data.x, data.y);
13
+ const transfers = /* alloc */ [];
14
+ if (result?.data) transfers.push(result.data);
15
+ if (result?.image) transfers.push(result.image);
16
+ self.postMessage(result, transfers);
17
+ } catch (error) {
18
+ self.postMessage(/* alloc */ { error: /* alloc */ { name: error.name, message: error.message } });
19
+ }
20
+ }
@@ -1,4 +1,5 @@
1
1
  export function createGeometryWorker(url, pool) {
2
+ if (typeof Worker === 'undefined') throw /* alloc */ new Error('Web Workers are required to prepare source geometry');
2
3
  let workerUrl = url, blobUrl, worker;
3
4
  if (globalThis.location) {
4
5
  const resolved = /* alloc */ new URL(url, location.href);
@@ -1,6 +1,21 @@
1
1
  import { assembleAreaGeometry } from '../geometry/assembleAreaGeometry.js';
2
+ import { onVectorTileMessage } from './vectorTileWorker.js';
3
+ import { onCogMessage } from './cogWorker.js';
4
+ import { onModelMessage } from './modelWorker.js';
2
5
 
3
6
  export function onGeometryMessage(event) {
7
+ if (event.data.type === 'model') {
8
+ onModelMessage(event);
9
+ return;
10
+ }
11
+ if (event.data.type === 'cog') {
12
+ onCogMessage(event);
13
+ return;
14
+ }
15
+ if (event.data.type === 'vector') {
16
+ onVectorTileMessage(event);
17
+ return;
18
+ }
4
19
  try {
5
20
  const data = assembleAreaGeometry(event.data);
6
21
  const transfers = /* alloc */ [data.positions.buffer, data.normals.buffer, data.colors.buffer, data.uvs.buffer];
@@ -0,0 +1,7 @@
1
+ import { workerMapByLayer } from '../weakmaps/workerMapByLayer.js';
2
+ import { runSourceWorker } from './runSourceWorker.js';
3
+
4
+ export function getCogInWorker(context, z, x, y, signal) {
5
+ return runSourceWorker(context.layer._map || workerMapByLayer.get(context.layer), context.workerUrl,
6
+ /* alloc */ { type: 'cog', url: context.url, asset: context.asset, z, x, y }, signal);
7
+ }
@@ -0,0 +1,10 @@
1
+ import { prepareModel } from '../models/prepareModel.js';
2
+
3
+ export async function onModelMessage({ data }) {
4
+ try {
5
+ const result = await prepareModel(data.url);
6
+ self.postMessage(/* alloc */ { description: result.description, images: result.images }, result.transfers);
7
+ } catch (error) {
8
+ self.postMessage(/* alloc */ { error: /* alloc */ { name: error.name, message: error.message } });
9
+ }
10
+ }
@@ -0,0 +1,14 @@
1
+ import { getCogHeader } from '../cog/getCogHeader.js';
2
+ import { getCogInWorker } from './getCogInWorker.js';
3
+
4
+ export async function openCogInWorker(layer, options) {
5
+ const context = /* alloc */ {
6
+ layer, url: /* alloc */ new URL(options.url, document.baseURI).href,
7
+ asset: options.asset, workerUrl: options.workerUrl,
8
+ };
9
+ const header = await getCogInWorker(context);
10
+ return /* alloc */ {
11
+ getHeader: getCogHeader.bind(null, /* alloc */ { header }),
12
+ getZxy: getCogInWorker.bind(null, context),
13
+ };
14
+ }
@@ -0,0 +1,32 @@
1
+ import { geometryWorkerUrl } from '../globals/geometryWorkerUrl.js';
2
+ import { startGeometryWorker } from './startGeometryWorker.js';
3
+ import { acquireGeometryWorker } from './acquireGeometryWorker.js';
4
+
5
+ export async function runSourceWorker(map, url, input, signal = /* alloc */ new AbortController().signal) {
6
+ signal.throwIfAborted();
7
+ const entry = acquireGeometryWorker(map, url || geometryWorkerUrl);
8
+ const { worker, pool } = entry;
9
+ const task = /* alloc */ { worker, signal, input };
10
+ entry.task = task;
11
+ let completed = false;
12
+ try {
13
+ const data = await /* alloc */ new Promise(startGeometryWorker.bind(null, task));
14
+ completed = true;
15
+ return data;
16
+ } finally {
17
+ worker.removeEventListener('message', task.onEvent);
18
+ worker.removeEventListener('error', task.onEvent);
19
+ worker.removeEventListener('messageerror', task.onEvent);
20
+ signal.removeEventListener('abort', task.onEvent);
21
+ entry.task = null;
22
+ if (completed && pool && !pool.closed && !signal.aborted) pool.idle.push(entry);
23
+ else {
24
+ if (!entry.closed) worker.terminate();
25
+ if (pool) pool.entries.delete(entry);
26
+ }
27
+ if (entry.blobUrl) {
28
+ URL.revokeObjectURL(entry.blobUrl);
29
+ entry.blobUrl = null;
30
+ }
31
+ }
32
+ }
@@ -2,7 +2,7 @@ export function settleGeometryWorker(task, event) {
2
2
  if (event.type === 'abort') task.reject(task.signal.reason);
3
3
  else if (event.type === 'error') task.reject(/* alloc */ new Error(`Geometry worker failed: ${event.message}`));
4
4
  else if (event.type === 'messageerror') task.reject(/* alloc */ new Error('Unable to receive geometry worker buffers'));
5
- else if (event.data.error) {
5
+ else if (event.data?.error) {
6
6
  const error = /* alloc */ new Error(event.data.error.message);
7
7
  error.name = event.data.error.name;
8
8
  task.reject(error);
@@ -0,0 +1,10 @@
1
+ import { prepareVectorTile } from '../vector-tiles/prepareVectorTile.js';
2
+
3
+ export function onVectorTileMessage({ data }) {
4
+ try {
5
+ const result = prepareVectorTile(data.buffer, data.coords, data.style, data.zoom, data.source, data.maxZoom, data.mapZoom);
6
+ self.postMessage(/* alloc */ { id: data.id, ...result });
7
+ } catch (error) {
8
+ self.postMessage(/* alloc */ { id: data.id, error: error.message });
9
+ }
10
+ }
@@ -1,10 +0,0 @@
1
- import { projectRing } from '../projections/projectRing.js';
2
- import { buildProjectedPolygon } from './buildProjectedPolygon.js';
3
-
4
- export function buildAreaPolygon(context, rings, top, bottom, baseColor) {
5
- if (!rings.length) throw /* alloc */ new Error('Empty GeoJSON polygon');
6
- const paths = /* alloc */ [];
7
- let ring;
8
- for (ring of rings) paths.push(projectRing(context, ring));
9
- buildProjectedPolygon(context, paths, top, bottom, baseColor);
10
- }
@@ -1 +0,0 @@
1
- export const layerCallInitHooks = { value: undefined };
@@ -1,7 +0,0 @@
1
- import { projectedTree } from '../projections/projectTreePoint.js';
2
- import { buildProjectedPoint } from '../geometry/buildProjectedPoint.js';
3
-
4
- export function buildAreaPoint(context, feature, lon, lat, style, baseColor) {
5
- const projected = projectedTree(context, lon, lat);
6
- buildProjectedPoint(context, projected, style, baseColor, feature.properties?.cod_ouvrag || `${lon},${lat}`);
7
- }