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,16 @@
1
+ import { streamTerrainByMap } from '../weakmaps/streamTerrainByMap.js';
2
+
3
+ export function prepareGridTerrainRequests(state) {
4
+ const stream = streamTerrainByMap.get(state.map);
5
+ if (state.terrainStream !== stream) {
6
+ state.terrainStream = stream;
7
+ state.terrainRequests = stream ? /* alloc */ new Map() : null;
8
+ }
9
+ if (state.terrainRequests) {
10
+ let key;
11
+ for (key of state.terrainRequests.keys()) {
12
+ if (!state.source._tiles[key]) state.terrainRequests.delete(key);
13
+ }
14
+ }
15
+ return stream;
16
+ }
@@ -1,36 +1,30 @@
1
1
  import { L } from '../globals/L.js';
2
- import { disposeMesh } from '../rendering/disposeMesh.js';
3
- import { createMesh } from '../rendering/createMesh.js';
4
2
  import { styleNativeMesh } from './styleNativeMesh.js';
3
+ import { createNativeMesh } from './createNativeMesh.js';
4
+ import { updateNativeStrokeRadius } from './updateNativeStrokeRadius.js';
5
5
 
6
- export function putNativeMesh(state, key, position, color, opacity, texture, uv) {
7
- const { backend: layer, source, meshes } = state;
6
+ export function putNativeMesh(state, key, position, color, opacity, texture, uv, terrain = false) {
7
+ const { source, meshes } = state;
8
8
  if (!position.length) return;
9
+ const nativeStroke = key === 'stroke' && Boolean(state.strokeCoordinates) && source.options.interactive === false;
9
10
  let mesh = meshes.get(key);
10
11
  if (!mesh || mesh.geometry.attributes.position.data.length !== position.length ||
11
- mesh.program.uniforms.baseTexture?.value !== texture) {
12
- const normal = /* alloc */ [];
13
- let index;
14
- for (index = 0; index < position.length; index++) normal.push(index % 3 === 1 ? 1 : 0);
15
- const data = /* alloc */ { position, normal };
16
- if (uv) data.uv = uv;
17
- const material = /* alloc */ {
18
- vertexColors: false, color, opacity, unlit: true, alphaMode: 'BLEND',
19
- };
20
- if (texture) material.baseTexture = texture;
21
- if (mesh) disposeMesh(layer, mesh);
22
- mesh = createMesh(layer, data, material, 0, source instanceof L.GridLayer ? state.rasterProgram : undefined);
23
- if (source instanceof L.GridLayer) {
24
- state.rasterProgram ||= mesh.program;
25
- mesh.texture = texture;
26
- }
27
- meshes.set(key, mesh);
12
+ (source instanceof L.GridLayer && mesh.program.depthWrite !== terrain) ||
13
+ mesh.program.uniforms.baseTexture?.value !== texture ||
14
+ Boolean(mesh.program._layerMaterial.nativeStroke) !== nativeStroke) {
15
+ mesh = createNativeMesh(state, key, position, color, opacity, texture, uv, terrain, nativeStroke);
28
16
  } else {
29
17
  const attribute = mesh.geometry.attributes.position;
30
18
  attribute.data.set(position);
31
19
  attribute.needsUpdate = true;
32
20
  mesh.geometry.bounds = null;
21
+ if (nativeStroke) {
22
+ mesh.geometry.attributes.normal.data.set(state.strokeAnchors);
23
+ mesh.geometry.attributes.normal.needsUpdate = true;
24
+ }
33
25
  }
26
+ if (nativeStroke) updateNativeStrokeRadius(mesh);
27
+ if (mesh.program.uniforms.strokeScale) mesh.program.uniforms.strokeScale.value = 1;
34
28
  styleNativeMesh(state, mesh, color, opacity);
35
29
  return mesh;
36
30
  }
@@ -1,5 +1,16 @@
1
1
  import { refreshNativeLayer } from './refreshNativeLayer.js';
2
+ import { L } from '../globals/L.js';
3
+ import { update } from '../scene/scheduleSceneUpdate.js';
2
4
 
3
- export function refreshNativeEvent() {
4
- refreshNativeLayer(this);
5
+ export function refreshNativeEvent(event) {
6
+ if (event?.type === 'zoomend' && this.source instanceof L.Polyline &&
7
+ (!this.source.options.stroke || !(Number(this.source.options.weight) > 0))) return;
8
+ if (event?.type === 'zoomend' && this.strokeCoordinates && (!this.dirty || this.zoomOnly)) {
9
+ this.zoomOnly = true;
10
+ this.dirty = true;
11
+ update(this.backend);
12
+ return;
13
+ }
14
+ if (event?.type === 'terrainchange' && this.marker) this.source.update();
15
+ refreshNativeLayer(this);
5
16
  }
@@ -10,6 +10,7 @@ import { update } from '../scene/scheduleSceneUpdate.js';
10
10
  import { hideTargets } from './hideTargets.js';
11
11
 
12
12
  export function refreshNativeLayer(state = this) {
13
+ state.zoomOnly = false;
13
14
  state.dirty = true;
14
15
  state.viewDirty = true;
15
16
  state.failed = false;
@@ -0,0 +1,10 @@
1
+ export function retainGridTerrain(state) {
2
+ let key, mesh, retained;
3
+ for ([key, mesh] of state.meshes) {
4
+ if (state.source._tiles[key] || !mesh._terrainRequest) continue;
5
+ retained = state.textures.get(key);
6
+ if (!retained) continue;
7
+ retained.used = true;
8
+ mesh._nativeUsed = true;
9
+ }
10
+ }
@@ -1,29 +1,27 @@
1
- import { L } from '../globals/L.js';
2
- import { coreWhite } from '../globals/coreWhite.js';
3
-
4
- import { styleNativeMesh } from './styleNativeMesh.js';
5
- import { quadNativeMesh } from './quadNativeMesh.js';
6
- import { boundsQuad } from '../geometry/boundsQuad.js';
1
+ import { prepareGridTerrainRequests } from './prepareGridTerrainRequests.js';
2
+ import { syncGridTile } from './syncGridTile.js';
3
+ import { syncTerrainGridTile } from './syncTerrainGridTile.js';
4
+ import { retainGridTerrain } from './retainGridTerrain.js';
7
5
 
8
6
 
9
7
  export function syncGridLayer(state) {
10
- const { source, textures, meshes } = state;
11
- let key, tile, opacity, retained, mesh, nw, se;
8
+ const { source } = state;
9
+ const stream = prepareGridTerrainRequests(state);
10
+ let key, tile, opacity, mesh, pending = false;
12
11
  for (key in source._tiles) {
13
12
  if (!Object.hasOwn(source._tiles, key)) continue;
14
13
  tile = source._tiles[key];
15
- if (!tile.loaded || tile.el instanceof HTMLImageElement && !tile.el.naturalWidth) continue;
16
- opacity = (source.options.opacity ?? 1) * (tile._gpuOpacity ?? 1);
17
- retained = textures.get(key);
18
- mesh = meshes.get(key);
19
- if (mesh && retained?.image === tile.el && retained.url === (tile.el.currentSrc || tile.el.src)) {
20
- retained.used = true;
21
- styleNativeMesh(state, mesh, coreWhite, opacity);
22
- } else {
23
- [nw, se] = source._tileCoordsToNwSe(tile.coords);
24
- mesh = quadNativeMesh(state, key, tile.el, boundsQuad(state,
25
- /* alloc */ new L.LatLngBounds(nw, se)), opacity);
14
+ if (!tile.loaded || tile.el instanceof HTMLImageElement && !tile.el.naturalWidth) {
15
+ pending = Boolean(stream);
16
+ continue;
26
17
  }
18
+ opacity = (source.options.opacity ?? 1) * (tile._gpuOpacity ?? 1);
19
+ mesh = state.terrainRequests ? syncTerrainGridTile(state, key, tile, opacity)
20
+ : syncGridTile(state, key, tile, opacity);
21
+ if (state.terrainRequests && !state.terrainRequests.get(key).tiles) pending = true;
27
22
  if (mesh) mesh.renderOrder += tile.coords.z / 100;
28
23
  }
24
+ if (stream && (pending || !Object.keys(source._tiles).length)) {
25
+ retainGridTerrain(state);
26
+ }
29
27
  }
@@ -0,0 +1,18 @@
1
+ import { L } from '../globals/L.js';
2
+ import { coreWhite } from '../globals/coreWhite.js';
3
+ import { styleNativeMesh } from './styleNativeMesh.js';
4
+ import { quadNativeMesh } from './quadNativeMesh.js';
5
+ import { boundsQuad } from '../geometry/boundsQuad.js';
6
+
7
+ export function syncGridTile(state, key, tile, opacity) {
8
+ const retained = state.textures.get(key), mesh = state.meshes.get(key);
9
+ if (mesh && !mesh._terrainRequest && retained?.image === tile.el &&
10
+ retained.url === (tile.el.currentSrc || tile.el.src)) {
11
+ retained.used = true;
12
+ styleNativeMesh(state, mesh, coreWhite, opacity);
13
+ return mesh;
14
+ }
15
+ const [nw, se] = state.source._tileCoordsToNwSe(tile.coords);
16
+ return quadNativeMesh(state, key, tile.el,
17
+ boundsQuad(state, /* alloc */ new L.LatLngBounds(nw, se)), opacity);
18
+ }
@@ -0,0 +1,12 @@
1
+ export function syncNativeStrokeAnchors(state, stroke) {
2
+ const { source } = state;
3
+ if (state.strokeAnchors?.length === stroke.length && stroke.length) {
4
+ if (source.options.interactive === false) state.strokeCoordinates = stroke;
5
+ else {
6
+ state.strokeCoordinates = /* alloc */ new Float64Array(stroke);
7
+ state.strokeAnchors = /* alloc */ new Float64Array(state.strokeAnchors);
8
+ }
9
+ state.strokeZoom = state.map.getZoom();
10
+ state.strokeWeight = Number(source.options.weight);
11
+ } else state.strokeAnchors = null;
12
+ }
@@ -0,0 +1,29 @@
1
+ import { styleNativeMesh } from './styleNativeMesh.js';
2
+ import { parseColor } from '../colors/parseColor.js';
3
+
4
+ export function syncNativeStrokeZoom(state) {
5
+ const { source, meshes, strokeCoordinates, strokeAnchors } = state;
6
+ const mesh = meshes.get('stroke');
7
+ let i, r, g, b, fill;
8
+ if (mesh) {
9
+ const factor = 2 ** (state.strokeZoom - state.map.getZoom()) *
10
+ Number(source.options.weight) / state.strokeWeight;
11
+ const attribute = mesh.geometry.attributes.position;
12
+ if (mesh.program.uniforms.strokeScale) {
13
+ mesh.program.uniforms.strokeScale.value = factor;
14
+ } else {
15
+ for (i = 0; i < strokeCoordinates.length; i++) {
16
+ attribute.data[i] = strokeAnchors[i] + (strokeCoordinates[i] - strokeAnchors[i]) * factor;
17
+ }
18
+ attribute.needsUpdate = true;
19
+ mesh.geometry.bounds = null;
20
+ }
21
+ ({ r, g, b } = parseColor(source.options.color));
22
+ styleNativeMesh(state, mesh, /* alloc */ [r, g, b], source.options.opacity ?? 1);
23
+ }
24
+ fill = meshes.get('fill');
25
+ if (fill) {
26
+ ({ r, g, b } = parseColor(source.options.fillColor || source.options.color));
27
+ styleNativeMesh(state, fill, /* alloc */ [r, g, b], source.options.fillOpacity ?? 1);
28
+ }
29
+ }
@@ -0,0 +1,28 @@
1
+ import { coreWhite } from '../globals/coreWhite.js';
2
+ import { loadGridTerrain } from './loadGridTerrain.js';
3
+ import { styleNativeMesh } from './styleNativeMesh.js';
4
+ import { terrainGridMesh } from './terrainGridMesh.js';
5
+
6
+ export function syncTerrainGridTile(state, key, tile, opacity) {
7
+ const retained = state.textures.get(key), mesh = state.meshes.get(key);
8
+ let request = state.terrainRequests.get(key);
9
+ if (!request || request.tile !== tile) {
10
+ request = /* alloc */ { tile, stream: state.terrainStream };
11
+ state.terrainRequests.set(key, request);
12
+ loadGridTerrain(state, key, tile, request);
13
+ }
14
+ if (!request.tiles) {
15
+ if (mesh && retained?.image === tile.el) {
16
+ retained.used = true;
17
+ styleNativeMesh(state, mesh, coreWhite, opacity);
18
+ }
19
+ return null;
20
+ }
21
+ if (mesh && mesh._terrainRequest === request && retained?.image === tile.el &&
22
+ retained.url === (tile.el.currentSrc || tile.el.src)) {
23
+ retained.used = true;
24
+ styleNativeMesh(state, mesh, coreWhite, opacity);
25
+ return mesh;
26
+ }
27
+ return terrainGridMesh(state, key, tile, request, opacity);
28
+ }
@@ -1,22 +1,19 @@
1
- import { geometryPixelStates } from '../globals/geometryPixelStates.js';
2
-
3
-
4
- import { nativeGeometry } from '../geometry/nativeGeometry.js';
5
- import { localPixelForGeometry } from '../projections/localPixelForGeometry.js';
6
1
  import { parseColor } from '../colors/parseColor.js';
7
2
  import { putNativeMesh } from './putNativeMesh.js';
3
+ import { syncNativeStrokeZoom } from './syncNativeStrokeZoom.js';
4
+ import { nativeVectorGeometry } from './nativeVectorGeometry.js';
5
+ import { syncNativeStrokeAnchors } from './syncNativeStrokeAnchors.js';
8
6
 
9
7
  export function syncVectorLayer(state) {
10
8
  const { source } = state;
11
- geometryPixelStates.push(state);
12
- let geometry;
13
- try {
14
- geometry = nativeGeometry(source, state.map, localPixelForGeometry);
15
- } finally {
16
- geometryPixelStates.pop();
9
+ if (state.zoomOnly) {
10
+ syncNativeStrokeZoom(state);
11
+ state.zoomOnly = false;
12
+ return;
17
13
  }
18
- const { fill, stroke } = geometry;
19
- let i, key, positions, color, opacity, r, g, b;
14
+ const { fill, stroke } = nativeVectorGeometry(state);
15
+ syncNativeStrokeAnchors(state, stroke);
16
+ let i, key, positions, color, opacity, r, g, b, attributes;
20
17
  for (i = 0; i < 2; i++) {
21
18
  key = i ? 'stroke' : 'fill';
22
19
  positions = i ? stroke : fill;
@@ -25,5 +22,10 @@ export function syncVectorLayer(state) {
25
22
  if (!positions.length) continue;
26
23
  ({ r, g, b } = parseColor(color));
27
24
  putNativeMesh(state, key, positions, /* alloc */ [r, g, b], opacity ?? 1);
25
+ if (key === 'stroke' && source.options.interactive === false && state.strokeCoordinates) {
26
+ attributes = state.meshes.get(key).geometry.attributes;
27
+ state.strokeCoordinates = attributes.position.data;
28
+ state.strokeAnchors = attributes.normal.data;
29
+ }
28
30
  }
29
31
  }
@@ -0,0 +1,34 @@
1
+ import { rootByLayer } from '../weakmaps/rootByLayer.js';
2
+ import { coreWhite } from '../globals/coreWhite.js';
3
+ import { textureFor } from '../textures/nativeTextureFor.js';
4
+ import { terrainElevation } from '../terrain/terrainElevation.js';
5
+ import { localPosition } from '../projections/localPosition.js';
6
+ import { putNativeMesh } from './putNativeMesh.js';
7
+
8
+ export function terrainGridMesh(state, key, tile, request, opacity) {
9
+ const texture = textureFor(state, key, tile.el);
10
+ if (!texture) return;
11
+ const { x, y, z } = tile.coords, divisions = 32;
12
+ const northwest = localPosition(state, state.map.unproject(/* alloc */ [x * 256, y * 256], z));
13
+ const southeast = localPosition(state, state.map.unproject(/* alloc */ [(x + 1) * 256, (y + 1) * 256], z));
14
+ const vertices = /* alloc */ [], position = /* alloc */ [], uv = /* alloc */ [];
15
+ const base = rootByLayer.get(state.backend).position[1];
16
+ let row, col, u, v, elevation, a, b, c, d, index;
17
+ for (row = 0; row <= divisions; row++) for (col = 0; col <= divisions; col++) {
18
+ u = col / divisions; v = row / divisions;
19
+ elevation = terrainElevation(/* alloc */ { x: (x + u) * 256, y: (y + v) * 256 }, request.tiles);
20
+ if (!Number.isFinite(elevation)) throw /* alloc */ new Error(`Missing elevation sample in ${z}/${x}/${y}`);
21
+ vertices.push(/* alloc */ [northwest[0] + (southeast[0] - northwest[0]) * u, elevation - base,
22
+ northwest[2] + (southeast[2] - northwest[2]) * v, u, v]);
23
+ }
24
+ for (row = 0; row < divisions; row++) for (col = 0; col < divisions; col++) {
25
+ a = row * (divisions + 1) + col; b = a + 1; c = a + divisions + 1; d = c + 1;
26
+ for (index of /* alloc */ [a, c, b, b, c, d]) {
27
+ position.push(vertices[index][0], vertices[index][1], vertices[index][2]);
28
+ uv.push(vertices[index][3], vertices[index][4]);
29
+ }
30
+ }
31
+ const mesh = putNativeMesh(state, key, position, coreWhite, opacity, texture, uv, true);
32
+ mesh._terrainRequest = request;
33
+ return mesh;
34
+ }
@@ -0,0 +1,9 @@
1
+ export function updateNativeStrokeRadius(mesh) {
2
+ const attributes = mesh.geometry.attributes, positions = attributes.position.data, anchors = attributes.normal.data;
3
+ let i, radius = 0;
4
+ for (i = 0; i < positions.length; i += 3) {
5
+ radius = Math.max(radius, Math.hypot(positions[i] - anchors[i],
6
+ positions[i + 1] - anchors[i + 1], positions[i + 2] - anchors[i + 2]));
7
+ }
8
+ mesh.geometry.nativeStrokeRadius = radius;
9
+ }
@@ -1,3 +1,23 @@
1
- export function displayPoint(map, point) {
2
- return map.layerPointToContainerPoint(point).subtract(map._getMapPanePos());
3
- }
1
+ import { streamTerrainByMap } from '../weakmaps/streamTerrainByMap.js';
2
+ import { renderers } from '../weakmaps/renderers.js';
3
+ import { sceneOriginByLayer } from '../weakmaps/sceneOriginByLayer.js';
4
+ import { cameraViewByMap } from '../weakmaps/cameraViewByMap.js';
5
+ import { mapMethods } from '../globals/mapMethods.js';
6
+ import { radians } from '../globals/radians.js';
7
+ import { earthCirc } from '../globals/earthCirc.js';
8
+ import { mapElevationOf } from '../terrain/mapElevationOf.js';
9
+ import { animationPoint } from './transformZoomAnimationPoint.js';
10
+ import { project } from './projectCameraPoint.js';
11
+
12
+ export function displayPoint(map, point, location) {
13
+ const shared = renderers.get(map), origin = shared && sceneOriginByLayer.get(shared);
14
+ if (!streamTerrainByMap.get(map) || !origin) {
15
+ return map.layerPointToContainerPoint(point).subtract(map._getMapPanePos());
16
+ }
17
+ const elevation = mapElevationOf(map, location || map.layerPointToLatLng(point)) ?? 0;
18
+ const center = mapElevationOf(map, map.getCenter()) ?? 0;
19
+ const zoom = cameraViewByMap.get(map)?.zoom ?? map.getZoom();
20
+ const height = (elevation - center) * map.options.crs.scale(zoom) / (earthCirc * Math.cos(origin.lat * radians));
21
+ const raw = animationPoint(map, mapMethods.value.layerPointToContainerPoint.call(map, point));
22
+ return project(map, raw, false, false, height).subtract(map._getMapPanePos());
23
+ }
@@ -4,7 +4,7 @@ import { pointOf } from './toPoint.js';
4
4
  import { project } from './projectCameraPoint.js';
5
5
 
6
6
 
7
- export function groundBounds(map, padding = cameraZeroPadding) {
7
+ export function groundBounds(map, padding = cameraZeroPadding, height = 0) {
8
8
  const min = pointOf(padding).divideBy(2), max = map.getSize().subtract(min);
9
9
  const bounds = /* alloc */ new L.Bounds();
10
10
  const minX = min.x, minY = min.y;
@@ -12,7 +12,7 @@ export function groundBounds(map, padding = cameraZeroPadding) {
12
12
  for (i = 0; i < 4; i++) {
13
13
  min.x = i % 2 ? max.x : minX;
14
14
  min.y = i < 2 ? minY : max.y;
15
- bounds.extend(project(map, min, true, true));
15
+ bounds.extend(project(map, min, true, true, height));
16
16
  }
17
17
  return bounds;
18
18
  }
@@ -1,5 +1,10 @@
1
1
  import { localPosition } from './localPosition.js';
2
2
 
3
- export function localPixel(state, point) {
4
- return localPosition(state, state.map.unproject(point));
3
+ export function localPixel(state, point) {
4
+ if (state.pixelProjection) {
5
+ const { transformation, scale, origin, metres } = state.pixelProjection;
6
+ const projected = transformation.untransform(point, scale);
7
+ return /* alloc */ [(projected.x - origin.x) * metres, 0, -(projected.y - origin.y) * metres];
8
+ }
9
+ return localPosition(state, state.map.unproject(point));
5
10
  }
@@ -2,6 +2,8 @@ import { geometryPixelStates } from '../globals/geometryPixelStates.js';
2
2
 
3
3
  import { localPixel } from './localPixel.js';
4
4
 
5
- export function localPixelForGeometry(point) {
6
- return localPixel(geometryPixelStates[geometryPixelStates.length - 1], point);
5
+ export function localPixelForGeometry(point, anchor) {
6
+ const state = geometryPixelStates[geometryPixelStates.length - 1];
7
+ if (anchor && state.strokeAnchors) state.strokeAnchors.push(...localPixel(state, anchor));
8
+ return localPixel(state, point);
7
9
  }
@@ -3,7 +3,7 @@ import { pointOf } from './toPoint.js';
3
3
  import { angles } from './cameraAngles.js';
4
4
 
5
5
 
6
- export function project(map, point, inverse = false, limit = false) {
6
+ export function project(map, point, inverse = false, limit = false, height = 0) {
7
7
  const size = map.getSize(), halfX = size.x / 2, halfY = size.y / 2, distance = size.y * 1.5;
8
8
  const result = pointOf(point);
9
9
  if (!distance) return result;
@@ -12,16 +12,17 @@ export function project(map, point, inverse = false, limit = false) {
12
12
  if (inverse) {
13
13
  const far = size.y * map.options.pitchMaxDistance;
14
14
  const denominator = tilt * distance + rise * y;
15
- let v = denominator * tilt > 0 ? y * distance / denominator : -far;
15
+ let v = denominator * tilt > 0
16
+ ? (y * (distance - tilt * height) + distance * rise * height) / denominator : -far;
16
17
  if (limit) v = Math.max(-far, Math.min(far, v));
17
- const u = x * (distance - rise * v) / distance;
18
+ const u = x * (distance - rise * v - tilt * height) / distance;
18
19
  result.x = cos * u + sin * v + halfX;
19
20
  result.y = -sin * u + cos * v + halfY;
20
21
  return result;
21
22
  }
22
23
  const u = cos * x - sin * y, v = sin * x + cos * y;
23
- const scale = distance / (distance - rise * v);
24
+ const scale = distance / (distance - rise * v - tilt * height);
24
25
  result.x = u * scale + halfX;
25
- result.y = tilt * v * scale + halfY;
26
+ result.y = (tilt * v - rise * height) * scale + halfY;
26
27
  return result;
27
28
  }
@@ -1,4 +1,5 @@
1
1
  import { computeBounds } from '../geometry/computeBounds.js';
2
+ import { nativeStrokeExpansion } from './nativeStrokeExpansion.js';
2
3
 
3
4
  export function collectVisibleMesh(mesh, projection, frustum, frustumLengths, candidates) {
4
5
  if (!mesh.geometry.bounds) computeBounds(mesh.geometry);
@@ -12,16 +13,18 @@ export function collectVisibleMesh(mesh, projection, frustum, frustumLengths, ca
12
13
  sphere.x = world[0] * center[0] + world[4] * center[1] + world[8] * center[2] + world[12];
13
14
  sphere.y = world[1] * center[0] + world[5] * center[1] + world[9] * center[2] + world[13];
14
15
  sphere.z = world[2] * center[0] + world[6] * center[1] + world[10] * center[2] + world[14];
15
- sphere.radius = bounds.radius * Math.max(
16
+ sphere.scale = Math.max(
16
17
  Math.hypot(world[0], world[1], world[2]),
17
18
  Math.hypot(world[4], world[5], world[6]),
18
19
  Math.hypot(world[8], world[9], world[10])
19
20
  );
21
+ sphere.radius = bounds.radius * sphere.scale;
20
22
  sphere.bounds = bounds;
21
23
  sphere.matrix = world;
22
24
  sphere.version = mesh._worldMatrixVersion;
23
25
  }
24
- const { x, y, z, radius } = sphere;
26
+ const { x, y, z } = sphere;
27
+ const radius = sphere.radius + nativeStrokeExpansion(mesh) * sphere.scale;
25
28
  const clipZ = projection[2] * x + projection[6] * y + projection[10] * z + projection[14];
26
29
  const clipW = projection[3] * x + projection[7] * y + projection[11] * z + projection[15];
27
30
  mesh._sortDepth = clipZ / clipW;
@@ -7,7 +7,7 @@ import { prepareMeshTextures } from '../textures/prepareMeshTextures.js';
7
7
 
8
8
  /** Upload retained CPU data and draw one mesh in the active WebGPU render pass. */
9
9
  export function drawGeometry(layer, mesh, pass, cullMode, frontFace) {
10
- const { geometry } = mesh;
10
+ const { geometry } = mesh, { attributes, drawRange } = geometry;
11
11
  const renderer = rendererByLayer.get(layer);
12
12
  const { device } = renderer;
13
13
  const pipeline = drawPipeline(renderer, mesh, cullMode, frontFace);
@@ -19,25 +19,25 @@ export function drawGeometry(layer, mesh, pass, cullMode, frontFace) {
19
19
  meshOffsets
20
20
  ));
21
21
 
22
- pass.setVertexBuffer(0, geometry.attributes.position.buffer);
23
- pass.setVertexBuffer(1, geometry.attributes.normal.buffer);
24
- if (geometry.attributes.color) pass.setVertexBuffer(2, geometry.attributes.color.buffer);
25
- if (geometry.attributes.uv) pass.setVertexBuffer(3, geometry.attributes.uv.buffer);
26
- const instances = geometry.attributes.instanceOffset;
22
+ pass.setVertexBuffer(0, attributes.position.buffer);
23
+ pass.setVertexBuffer(1, attributes.normal.buffer);
24
+ if (attributes.color) pass.setVertexBuffer(2, attributes.color.buffer);
25
+ if (attributes.uv) pass.setVertexBuffer(3, attributes.uv.buffer);
26
+ const instances = attributes.instanceOffset;
27
27
  if (instances) pass.setVertexBuffer(4, instances.buffer);
28
28
  let name, attribute;
29
- for (name in geometry.attributes) {
30
- attribute = geometry.attributes[name];
29
+ for (name in attributes) {
30
+ attribute = attributes[name];
31
31
  if (!attribute.needsUpdate) continue;
32
32
  device.queue.writeBuffer(attribute.buffer, 0, attribute.data);
33
33
  attribute.needsUpdate = false;
34
34
  if (name === 'position' || name === 'instanceOffset') geometry.bounds = null;
35
35
  }
36
- const index = geometry.attributes.index;
36
+ const index = attributes.index;
37
37
  if (index) {
38
38
  pass.setIndexBuffer(index.buffer, index.indexFormat);
39
- pass.drawIndexed(geometry.drawRange.count, instances?.count ?? 1, geometry.drawRange.start, 0, 0);
39
+ pass.drawIndexed(drawRange.count, instances?.count ?? 1, drawRange.start, 0, 0);
40
40
  } else {
41
- pass.draw(geometry.drawRange.count, instances?.count ?? 1, geometry.drawRange.start, 0);
41
+ pass.draw(drawRange.count, instances?.count ?? 1, drawRange.start, 0);
42
42
  }
43
43
  }
@@ -9,11 +9,13 @@ import { drawGeometry } from './drawGeometry.js';
9
9
  export function drawSceneMeshes(layer, encoder, meshes) {
10
10
  const renderer = rendererByLayer.get(layer);
11
11
  const pass = encoder.beginRenderPass((
12
- scenePass.colorAttachments[0].view = renderer.context.getCurrentTexture().createView(),
12
+ scenePass.colorAttachments[0].view = renderer.colorTexture.createView(),
13
+ scenePass.colorAttachments[0].resolveTarget = renderer.context.getCurrentTexture().createView(),
13
14
  scenePass.depthStencilAttachment.view = renderer.depthTexture.createView(),
14
15
  scenePass
15
16
  ));
16
17
  scenePass.colorAttachments[0].view = null;
18
+ scenePass.colorAttachments[0].resolveTarget = null;
17
19
  scenePass.depthStencilAttachment.view = null;
18
20
  pass.setViewport(0, 0, renderer.canvas.width, renderer.canvas.height, 0, 1);
19
21
  pass.setBindGroup(1, renderer.sunlight.bindGroup);
@@ -0,0 +1,4 @@
1
+ export function nativeStrokeExpansion(mesh) {
2
+ const strokeScale = mesh.program?.uniforms?.strokeScale?.value ?? 1;
3
+ return Math.max(0, strokeScale - 1) * (mesh.geometry.nativeStrokeRadius || 0);
4
+ }
@@ -20,6 +20,8 @@ export function prepareMeshUniforms(renderer, mesh) {
20
20
  data[base + 34] = mesh.program.nightSparkle ? data[55] : 0;
21
21
  data[base + 35] = mesh.ground ? 1 : mesh._appearance ?? 1;
22
22
  prepareMeshCutout(renderer, mesh, base);
23
+ data[base + 40] = uniforms.strokeScale?.value ?? 1;
24
+ data[base + 41] = data[base + 42] = data[base + 43] = 0;
23
25
  return offset;
24
26
  }
25
27
  import { prepareMeshCutout } from '../materials/prepareMeshCutout.js';
@@ -2,22 +2,32 @@ import { rendererByLayer } from '../weakmaps/rendererByLayer.js';
2
2
  import { sizeByLayer } from '../weakmaps/sizeByLayer.js';
3
3
 
4
4
  import { depthTexture as sharedDepthTexture } from '../globals/depthTexture.js';
5
+ import { colorTexture as sharedColorTexture } from '../globals/colorTexture.js';
5
6
 
6
7
 
7
8
  import { destroyTexture } from '../textures/destroyTexture.js';
8
9
 
9
10
  export function resizeRenderer(layer, size) {
11
+ const renderer = rendererByLayer.get(layer);
10
12
  if (!sizeByLayer.get(layer) || !sizeByLayer.get(layer).equals(size)) {
11
- rendererByLayer.get(layer).width = size.x;
12
- rendererByLayer.get(layer).height = size.y;
13
- rendererByLayer.get(layer).canvas.width = Math.round(size.x * rendererByLayer.get(layer).dpr);
14
- rendererByLayer.get(layer).canvas.height = Math.round(size.y * rendererByLayer.get(layer).dpr);
15
- rendererByLayer.get(layer).canvas.style.width = `${size.x}px`;
16
- rendererByLayer.get(layer).canvas.style.height = `${size.y}px`;
17
- if (rendererByLayer.get(layer).depthTexture) destroyTexture(layer, rendererByLayer.get(layer).depthTexture);
18
- rendererByLayer.get(layer).depthTexture = rendererByLayer.get(layer).device.createTexture((
19
- sharedDepthTexture.size[0] = rendererByLayer.get(layer).canvas.width,
20
- sharedDepthTexture.size[1] = rendererByLayer.get(layer).canvas.height,
13
+ renderer.width = size.x;
14
+ renderer.height = size.y;
15
+ renderer.canvas.width = Math.round(size.x * renderer.dpr);
16
+ renderer.canvas.height = Math.round(size.y * renderer.dpr);
17
+ renderer.canvas.style.width = `${size.x}px`;
18
+ renderer.canvas.style.height = `${size.y}px`;
19
+ if (renderer.depthTexture) destroyTexture(layer, renderer.depthTexture);
20
+ renderer.colorTexture?.destroy();
21
+ renderer.colorTexture = renderer.device.createTexture((
22
+ sharedColorTexture.size[0] = renderer.canvas.width,
23
+ sharedColorTexture.size[1] = renderer.canvas.height,
24
+ sharedColorTexture.format = renderer.format,
25
+ sharedColorTexture.usage = GPUTextureUsage.RENDER_ATTACHMENT,
26
+ sharedColorTexture
27
+ ));
28
+ renderer.depthTexture = renderer.device.createTexture((
29
+ sharedDepthTexture.size[0] = renderer.canvas.width,
30
+ sharedDepthTexture.size[1] = renderer.canvas.height,
21
31
  sharedDepthTexture.usage = GPUTextureUsage.RENDER_ATTACHMENT,
22
32
  sharedDepthTexture
23
33
  ));
@@ -1,14 +1,13 @@
1
- import { initializeGeoJSON } from '../sources/initializeGeoJSON.js';
2
1
  import { initRaster } from '../raster/initRaster.js';
3
2
  import { initTerrain } from '../terrain/initTerrain.js';
4
3
  import { initTraffic } from '../traffic/initTraffic.js';
5
4
  import { initCog } from '../cog/initCog.js';
5
+ import { sceneEmptyOptions } from '../globals/sceneEmptyOptions.js';
6
6
 
7
- export function initializerFor(type) {
7
+ export function initializerFor(type, options = sceneEmptyOptions) {
8
8
  switch (type) {
9
- case 'geojson': return initializeGeoJSON;
10
- case 'pmtiles': return initRaster;
11
- case 'cog': return initCog;
9
+ case 'raster': return options.asset !== undefined || /\.tiff?(?:[?#]|$)/i.test(options.url)
10
+ ? initCog : initRaster;
12
11
  case 'terrain': return initTerrain;
13
12
  case 'traffic': return initTraffic;
14
13
  default: return null;