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.
- package/README.md +11 -6
- package/cucumber.mjs +1 -3
- package/dist/leaflet-city-mapper-src.js +8574 -7879
- package/dist/leaflet-city-mapper-src.js.map +4 -4
- package/dist/leaflet-city-mapper-worker-src.js +2776 -0
- package/dist/leaflet-city-mapper-worker-src.js.map +4 -4
- package/dist/leaflet-city-mapper-worker.js +1 -1
- package/dist/leaflet-city-mapper-worker.js.map +4 -4
- package/dist/leaflet-city-mapper.js +5 -3
- package/dist/leaflet-city-mapper.js.map +4 -4
- package/libs/leaflet-lens.js +44 -27
- package/libs/leaflet.js +4 -4
- package/libs/openlayers-bindings.js +2 -1
- package/libs/openlayers-bindings.min.js +1 -1
- package/libs/openlayers-bindings.min.js.map +3 -3
- package/package.json +2 -2
- package/src/camera/mapCamera.js +7 -7
- package/src/camera/mapTryAnimatedPan.js +4 -4
- package/src/camera/setBearing.js +5 -0
- package/src/camera/setPitch.js +5 -0
- package/src/camera/updateMapCamera.js +8 -6
- package/src/cog/initCog.js +2 -2
- package/src/controls/cameraControls.js +27 -22
- package/src/core/cameraCircleBounds.js +2 -1
- package/src/core/closestCameraLayerPoint.js +2 -1
- package/src/core/constructLayer.js +9 -0
- package/src/core/extendLeafletClass.js +5 -0
- package/src/core/extendTerrainPixelBounds.js +31 -0
- package/src/core/gridlayerGetTiledPixelBounds.js +12 -4
- package/src/core/layerAddInitHook.js +7 -0
- package/src/core/layerCallInitHooks.js +13 -13
- package/src/core/layerMergeOptions.js +7 -0
- package/src/core/markerSetPos.js +1 -1
- package/src/core/popupGetEvents.js +1 -1
- package/src/core/popupUpdatePosition.js +8 -8
- package/src/core/projectNativePath.js +23 -0
- package/src/core/tooltipGetEvents.js +1 -1
- package/src/core/tooltipSetPosition.js +2 -2
- package/src/geometry/appendNativeTriangle.js +2 -2
- package/src/geometry/circleGeometry.js +4 -3
- package/src/geometry/createModelGeometry.js +2 -9
- package/src/geometry/dashedSegment.js +10 -5
- package/src/geometry/disk.js +1 -1
- package/src/geometry/fillNativePolygon.js +20 -0
- package/src/geometry/lineJoin.js +2 -2
- package/src/geometry/markerQuadCorners.js +6 -0
- package/src/geometry/nativeGeometry.js +1 -1
- package/src/geometry/polygon.js +4 -10
- package/src/geometry/segment.js +4 -3
- package/src/globals/colorTexture.js +6 -0
- package/src/globals/depthTexture.js +1 -0
- package/src/globals/drawMeshEntry.js +1 -1
- package/src/globals/layerControlAddItem.js +3 -0
- package/src/globals/leafletLayer.js +3 -0
- package/src/globals/meshPipeline.js +1 -0
- package/src/globals/mvtTextDecoder.js +1 -0
- package/src/globals/nativeScalableStyleKeys.js +1 -0
- package/src/globals/scenePass.js +1 -0
- package/src/globals/vectorStyleNamedColors.js +8 -0
- package/src/globals/vectorTileEvents.js +1 -0
- package/src/globals/workerCogSource.js +1 -0
- package/src/gpu/initializeRendererResources.js +10 -12
- package/src/gpu/mountRenderer.js +4 -11
- package/src/gpu/releaseRenderer.js +1 -0
- package/src/index.js +31 -22
- package/src/layer-controls/layerControlInputId.js +11 -0
- package/src/layer-controls/placeEntry.js +2 -0
- package/src/materials/createProgram.js +7 -6
- package/src/materials/createProgramUniforms.js +1 -0
- package/src/models/loadModel.js +6 -10
- package/src/models/loadModelResources.js +2 -8
- package/src/models/modelNode.js +3 -7
- package/src/models/prepareModel.js +19 -0
- package/src/models/prepareModelGeometry.js +25 -0
- package/src/models/prepareModelPrimitive.js +17 -0
- package/src/mvt/addMvtCrossings.js +17 -0
- package/src/mvt/appendMvtBandTriangles.js +31 -0
- package/src/mvt/appendMvtCoordinates.js +11 -0
- package/src/mvt/appendMvtPolygonTriangles.js +19 -0
- package/src/mvt/beginMvtPath.js +9 -0
- package/src/mvt/closeMvtPath.js +7 -0
- package/src/mvt/collectMvtEdges.js +19 -0
- package/src/mvt/createMvtReader.js +7 -0
- package/src/mvt/decodeVectorTile.js +32 -0
- package/src/mvt/expectMvtWire.js +3 -0
- package/src/mvt/finishMvtPath.js +5 -0
- package/src/mvt/finiteMvtCoordinate.js +7 -0
- package/src/mvt/groupMvtPolygons.js +25 -0
- package/src/mvt/isMvtFallbackError.js +6 -0
- package/src/mvt/mergeMvtActiveEdges.js +9 -0
- package/src/mvt/mvtEdgeX.js +4 -0
- package/src/mvt/mvtPathsVertices.js +8 -0
- package/src/mvt/mvtPolygonPaths.js +12 -0
- package/src/mvt/numericMvtValue.js +4 -0
- package/src/mvt/readMvtFeature.js +34 -0
- package/src/mvt/readMvtField.js +8 -0
- package/src/mvt/readMvtGeometry.js +29 -0
- package/src/mvt/readMvtInteger.js +12 -0
- package/src/mvt/readMvtKnownValue.js +21 -0
- package/src/mvt/readMvtLayer.js +31 -0
- package/src/mvt/readMvtMessage.js +10 -0
- package/src/mvt/readMvtNumber.js +9 -0
- package/src/mvt/readMvtNumbers.js +11 -0
- package/src/mvt/readMvtString.js +6 -0
- package/src/mvt/readMvtValue.js +19 -0
- package/src/mvt/skipMvtField.js +14 -0
- package/src/mvt/sortMvtActiveEdges.js +15 -0
- package/src/mvt/sortedMvtLevels.js +22 -0
- package/src/mvt/takeMvtBytes.js +8 -0
- package/src/mvt/tessellateVectorRings.js +19 -0
- package/src/mvt/triangulateVectorRings.js +19 -0
- package/src/native/beforeNativeRender.js +6 -0
- package/src/native/canScaleNativeStyle.js +17 -0
- package/src/native/createNativeMesh.js +31 -0
- package/src/native/disposeNativeLayer.js +1 -1
- package/src/native/getGridTerrainTile.js +34 -0
- package/src/native/gridTerrainElevation.js +26 -0
- package/src/native/loadGridTerrain.js +26 -0
- package/src/native/nativeLayer.js +2 -2
- package/src/native/nativeLayerMethod.js +5 -14
- package/src/native/nativeProgram.js +20 -0
- package/src/native/nativeTerrainElevation.js +16 -0
- package/src/native/nativeVectorGeometry.js +23 -0
- package/src/native/orderNativeGridLayer.js +14 -0
- package/src/native/prepareGridTerrainRequests.js +16 -0
- package/src/native/putNativeMesh.js +15 -21
- package/src/native/refreshNativeEvent.js +13 -2
- package/src/native/refreshNativeLayer.js +1 -0
- package/src/native/retainGridTerrain.js +10 -0
- package/src/native/syncGridLayer.js +17 -19
- package/src/native/syncGridTile.js +18 -0
- package/src/native/syncNativeStrokeAnchors.js +12 -0
- package/src/native/syncNativeStrokeZoom.js +29 -0
- package/src/native/syncTerrainGridTile.js +28 -0
- package/src/native/syncVectorLayer.js +15 -13
- package/src/native/terrainGridMesh.js +34 -0
- package/src/native/updateNativeStrokeRadius.js +9 -0
- package/src/projections/displayContainerPoint.js +23 -3
- package/src/projections/groundBounds.js +2 -2
- package/src/projections/localPixel.js +7 -2
- package/src/projections/localPixelForGeometry.js +4 -2
- package/src/projections/projectCameraPoint.js +6 -5
- package/src/rendering/collectVisibleMesh.js +5 -2
- package/src/rendering/drawGeometry.js +11 -11
- package/src/rendering/drawSceneMeshes.js +3 -1
- package/src/rendering/nativeStrokeExpansion.js +4 -0
- package/src/rendering/prepareMeshUniforms.js +2 -0
- package/src/rendering/resizeRenderer.js +20 -10
- package/src/scene/initializerFor.js +4 -5
- package/src/scene/layerInitialize.js +14 -12
- package/src/scene/resolveNextInitialization.js +1 -1
- package/src/shaders/materialShaders.js +1 -0
- package/src/shaders/materialVertexShader.js +7 -2
- package/src/shaders/nativeStrokeShader.js +6 -0
- package/src/shadows/drawShadowMeshes.js +6 -5
- package/src/sources/attachAreaMesh.js +5 -6
- package/src/sources/buildArea.js +4 -5
- package/src/sources/buildAreaFeature.js +3 -19
- package/src/sources/initVectorTiles.js +15 -0
- package/src/sources/isVectorTileSource.js +4 -0
- package/src/sources/pumpSourceAreas.js +1 -1
- package/src/sources/readyVectorTiles.js +10 -0
- package/src/sources/sourceAreaContext.js +1 -6
- package/src/sunlight/createSun.js +0 -1
- package/src/sunlight/initSunlight.js +19 -8
- package/src/terrain/initTerrain.js +7 -1
- package/src/terrain/loadTerrain.js +4 -1
- package/src/terrain/mapElevationOf.js +5 -1
- package/src/terrain/onTerrainAdd.js +11 -1
- package/src/terrain/onTerrainRemove.js +10 -1
- package/src/textures/nativeTextureFor.js +2 -3
- package/src/textures/uploadCanvasTexture.js +11 -2
- package/src/utils/yieldTask.js +5 -0
- package/src/vector-style/appendQuotedStyleCharacter.js +22 -0
- package/src/vector-style/arrayContainsRange.js +8 -0
- package/src/vector-style/evaluateBoolean.js +18 -0
- package/src/vector-style/evaluateCoalesceOrCase.js +21 -0
- package/src/vector-style/evaluateComparison.js +16 -0
- package/src/vector-style/evaluateIExpression.js +8 -0
- package/src/vector-style/evaluateInput.js +6 -0
- package/src/vector-style/evaluateInterpolate.js +27 -0
- package/src/vector-style/evaluateMatch.js +12 -0
- package/src/vector-style/evaluateMath.js +14 -0
- package/src/vector-style/evaluateMembership.js +18 -0
- package/src/vector-style/evaluateNegation.js +13 -0
- package/src/vector-style/evaluatePrimitive.js +9 -0
- package/src/vector-style/evaluateStep.js +11 -0
- package/src/vector-style/evaluateStyle.js +33 -0
- package/src/vector-style/evaluateToExpression.js +14 -0
- package/src/vector-style/fillVectorPaint.js +17 -0
- package/src/vector-style/lineVectorPaint.js +21 -0
- package/src/vector-style/parseFunctionalColor.js +14 -0
- package/src/vector-style/parseHexColor.js +13 -0
- package/src/vector-style/parseVectorStyle.js +13 -0
- package/src/vector-style/readPaintValue.js +6 -0
- package/src/vector-style/removeTrailingCommas.js +12 -0
- package/src/vector-style/scaleDashArray.js +13 -0
- package/src/vector-style/skipStyleComment.js +9 -0
- package/src/vector-style/stripStyleComments.js +21 -0
- package/src/vector-style/styleColor.js +11 -0
- package/src/vector-style/validateVectorLayers.js +10 -0
- package/src/vector-style/vectorPaint.js +8 -0
- package/src/vector-style/visibleStyle.js +7 -0
- package/src/vector-tiles/appendVectorBatch.js +22 -0
- package/src/vector-tiles/attachVectorTileBatch.js +17 -0
- package/src/vector-tiles/attachVectorTileBatches.js +15 -0
- package/src/vector-tiles/compareVectorLabelPriority.js +3 -0
- package/src/vector-tiles/compareVectorTileDistance.js +3 -0
- package/src/vector-tiles/configureVectorTileLayer.js +28 -0
- package/src/vector-tiles/createVectorLabel.js +22 -0
- package/src/vector-tiles/forwardVectorTileError.js +5 -0
- package/src/vector-tiles/loadVectorSprite.js +5 -0
- package/src/vector-tiles/loadVectorTile.js +36 -0
- package/src/vector-tiles/onVectorTileAdd.js +39 -0
- package/src/vector-tiles/onVectorTileMessage.js +10 -0
- package/src/vector-tiles/onVectorTileRemove.js +20 -0
- package/src/vector-tiles/onVectorTileWorkerError.js +11 -0
- package/src/vector-tiles/paintVectorTileBatch.js +12 -0
- package/src/vector-tiles/prepareVectorLabel.js +25 -0
- package/src/vector-tiles/prepareVectorStyleLayer.js +30 -0
- package/src/vector-tiles/prepareVectorTile.js +16 -0
- package/src/vector-tiles/projectVectorPaths.js +15 -0
- package/src/vector-tiles/projectVectorPoint.js +6 -0
- package/src/vector-tiles/projectVectorTriangles.js +18 -0
- package/src/vector-tiles/pruneVectorTiles.js +11 -0
- package/src/vector-tiles/pumpVectorTiles.js +18 -0
- package/src/vector-tiles/readTileJSON.js +17 -0
- package/src/vector-tiles/readVectorStyle.js +17 -0
- package/src/vector-tiles/refreshVectorTiles.js +5 -0
- package/src/vector-tiles/reserveVectorLabelCells.js +6 -0
- package/src/vector-tiles/retireVectorTileGroup.js +13 -0
- package/src/vector-tiles/revokeVectorWorkerUrl.js +9 -0
- package/src/vector-tiles/rotateVectorLabel.js +12 -0
- package/src/vector-tiles/rotateVectorLabels.js +6 -0
- package/src/vector-tiles/simplifyVectorPath.js +21 -0
- package/src/vector-tiles/updateVectorLabelMarker.js +27 -0
- package/src/vector-tiles/updateVectorLabelStyle.js +8 -0
- package/src/vector-tiles/updateVectorTileLabels.js +28 -0
- package/src/vector-tiles/updateVectorTilePaint.js +20 -0
- package/src/vector-tiles/updateVectorTiles.js +29 -0
- package/src/vector-tiles/validateVectorTileZooms.js +6 -0
- package/src/vector-tiles/vectorFeaturePaint.js +15 -0
- package/src/vector-tiles/vectorFeaturePaths.js +16 -0
- package/src/vector-tiles/vectorFeatureZoom.js +8 -0
- package/src/vector-tiles/vectorLabelAnchors.js +24 -0
- package/src/vector-tiles/vectorLabelCandidates.js +11 -0
- package/src/vector-tiles/vectorLabelCells.js +23 -0
- package/src/vector-tiles/vectorLabelIcon.js +30 -0
- package/src/vector-tiles/vectorLabelProperty.js +3 -0
- package/src/vector-tiles/vectorLabelText.js +10 -0
- package/src/vector-tiles/vectorSpriteIcon.js +11 -0
- package/src/vector-tiles/vectorStraightRun.js +14 -0
- package/src/vector-tiles/vectorStyleDependencies.js +15 -0
- package/src/vector-tiles/vectorStyleValue.js +5 -0
- package/src/vector-tiles/vectorStyleZoom.js +6 -0
- package/src/vector-tiles/vectorTileAwaited.js +9 -0
- package/src/vector-tiles/vectorTileOverlaps.js +4 -0
- package/src/vector-tiles/vectorTilePaint.js +10 -0
- package/src/vector-tiles/vectorTileSettings.js +17 -0
- package/src/vector-tiles/vectorTilesIdle.js +3 -0
- package/src/vector-tiles/vectorTolerance.js +4 -0
- package/src/vector-tiles/wrapVectorLabel.js +11 -0
- package/src/walk/initWalk.js +19 -6
- package/src/weakmaps/nativeProgramsByRenderer.js +1 -0
- package/src/weakmaps/pathProjectionByMap.js +1 -0
- package/src/weakmaps/streamTerrainByLayer.js +1 -0
- package/src/weakmaps/streamTerrainByMap.js +1 -0
- package/src/weakmaps/vectorTileOptionsByLayer.js +1 -0
- package/src/weakmaps/vectorWorkerByLayer.js +1 -0
- package/src/weakmaps/workerMapByLayer.js +1 -0
- package/src/workers/buildAreaInWorker.js +3 -27
- package/src/workers/cogWorker.js +20 -0
- package/src/workers/createGeometryWorker.js +1 -0
- package/src/workers/geometryWorker.js +15 -0
- package/src/workers/getCogInWorker.js +7 -0
- package/src/workers/modelWorker.js +10 -0
- package/src/workers/openCogInWorker.js +14 -0
- package/src/workers/runSourceWorker.js +32 -0
- package/src/workers/settleGeometryWorker.js +1 -1
- package/src/workers/vectorTileWorker.js +10 -0
- package/src/geometry/buildExtrudedPolygon.js +0 -10
- package/src/globals/layerCallInitHooks.js +0 -1
- package/src/sources/buildAreaPoint.js +0 -7
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function mvtPolygonPaths(rings) {
|
|
2
|
+
const paths = /* alloc */ [];
|
|
3
|
+
let ring, i, path;
|
|
4
|
+
for (ring of rings) {
|
|
5
|
+
path = /* alloc */ [];
|
|
6
|
+
for (i = 0; i < ring.length - 1; i++) {
|
|
7
|
+
path.push(/* alloc */ { x: ring[i][0], y: ring[i][1] });
|
|
8
|
+
}
|
|
9
|
+
paths.push(path);
|
|
10
|
+
}
|
|
11
|
+
return paths;
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { numericMvtValue } from './numericMvtValue.js';
|
|
3
|
+
import { readMvtField } from './readMvtField.js';
|
|
4
|
+
import { readMvtGeometry } from './readMvtGeometry.js';
|
|
5
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
6
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
7
|
+
import { readMvtNumbers } from './readMvtNumbers.js';
|
|
8
|
+
import { skipMvtField } from './skipMvtField.js';
|
|
9
|
+
|
|
10
|
+
export function readMvtFeature(reader, keys, values) {
|
|
11
|
+
let id, type = 0, field, wire, i = 0;
|
|
12
|
+
const tags = /* alloc */ [], commands = /* alloc */ [];
|
|
13
|
+
while (reader.pos < reader.bytes.length) {
|
|
14
|
+
[field, wire] = readMvtField(reader);
|
|
15
|
+
if (field === 1) {
|
|
16
|
+
expectMvtWire(wire, 0);
|
|
17
|
+
id = numericMvtValue(readMvtInteger(reader));
|
|
18
|
+
} else if (field === 2) readMvtNumbers(reader, wire, tags);
|
|
19
|
+
else if (field === 3) {
|
|
20
|
+
expectMvtWire(wire, 0);
|
|
21
|
+
type = readMvtNumber(reader);
|
|
22
|
+
} else if (field === 4) readMvtNumbers(reader, wire, commands);
|
|
23
|
+
else skipMvtField(reader, wire);
|
|
24
|
+
}
|
|
25
|
+
if (tags.length % 2 || type > 3) throw /* alloc */ new Error('Invalid MVT feature');
|
|
26
|
+
const properties = Object.create(null);
|
|
27
|
+
for (; i < tags.length; i += 2) {
|
|
28
|
+
if (tags[i] >= keys.length || tags[i + 1] >= values.length) {
|
|
29
|
+
throw /* alloc */ new Error('Invalid MVT property index');
|
|
30
|
+
}
|
|
31
|
+
properties[keys[tags[i]]] = values[tags[i + 1]];
|
|
32
|
+
}
|
|
33
|
+
return /* alloc */ { id, type, properties, geometry: type ? readMvtGeometry(commands, type) : /* alloc */ [] };
|
|
34
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
2
|
+
|
|
3
|
+
export function readMvtField(reader) {
|
|
4
|
+
const tag = readMvtNumber(reader);
|
|
5
|
+
const field = Math.floor(tag / 8), wire = tag % 8;
|
|
6
|
+
if (!field || field > 536870911) throw /* alloc */ new Error('Invalid MVT field number');
|
|
7
|
+
return /* alloc */ [field, wire];
|
|
8
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { finishMvtPath } from './finishMvtPath.js';
|
|
2
|
+
import { appendMvtCoordinates } from './appendMvtCoordinates.js';
|
|
3
|
+
import { beginMvtPath } from './beginMvtPath.js';
|
|
4
|
+
import { closeMvtPath } from './closeMvtPath.js';
|
|
5
|
+
|
|
6
|
+
export function readMvtGeometry(commands, type) {
|
|
7
|
+
const paths = /* alloc */ [];
|
|
8
|
+
const state = /* alloc */ { x: 0, y: 0, path: null, closed: false, index: 0 };
|
|
9
|
+
let command, id, count;
|
|
10
|
+
while (state.index < commands.length) {
|
|
11
|
+
command = commands[state.index++];
|
|
12
|
+
id = command % 8;
|
|
13
|
+
count = Math.floor(command / 8);
|
|
14
|
+
if (!count || command > 0xffffffff) throw /* alloc */ new Error('Invalid MVT geometry command');
|
|
15
|
+
if (id === 7) {
|
|
16
|
+
closeMvtPath(state, type, count);
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
if (id !== 1 && id !== 2 || count > Math.floor((commands.length - state.index) / 2)) {
|
|
20
|
+
throw /* alloc */ new Error('Invalid MVT geometry parameters');
|
|
21
|
+
}
|
|
22
|
+
if (id === 1) beginMvtPath(state, paths, type, count);
|
|
23
|
+
else if (type === 1 || !state.path || state.closed) throw /* alloc */ new Error('Invalid MVT LineTo');
|
|
24
|
+
appendMvtCoordinates(commands, state, count);
|
|
25
|
+
}
|
|
26
|
+
finishMvtPath(state.path, type, state.closed);
|
|
27
|
+
if (!paths.length) throw /* alloc */ new Error('Empty MVT geometry');
|
|
28
|
+
return paths;
|
|
29
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
2
|
+
|
|
3
|
+
export function readMvtInteger(reader) {
|
|
4
|
+
let value = 0n, i = 0, byte;
|
|
5
|
+
for (; i < 10; i++) {
|
|
6
|
+
byte = reader.bytes[takeMvtBytes(reader, 1)];
|
|
7
|
+
if (i === 9 && byte > 1) throw /* alloc */ new Error('Invalid MVT varint');
|
|
8
|
+
value |= BigInt(byte & 127) << BigInt(i * 7);
|
|
9
|
+
if (byte < 128) return value;
|
|
10
|
+
}
|
|
11
|
+
throw /* alloc */ new Error('Invalid MVT varint');
|
|
12
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { numericMvtValue } from './numericMvtValue.js';
|
|
3
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
4
|
+
import { readMvtString } from './readMvtString.js';
|
|
5
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
6
|
+
|
|
7
|
+
export function readMvtKnownValue(reader, field, wire) {
|
|
8
|
+
let offset, integer;
|
|
9
|
+
if (field === 1) return readMvtString(reader, wire);
|
|
10
|
+
if (field === 2 || field === 3) {
|
|
11
|
+
expectMvtWire(wire, field === 2 ? 5 : 1);
|
|
12
|
+
offset = takeMvtBytes(reader, field === 2 ? 4 : 8);
|
|
13
|
+
return field === 2 ? reader.view.getFloat32(offset, true) : reader.view.getFloat64(offset, true);
|
|
14
|
+
}
|
|
15
|
+
expectMvtWire(wire, 0);
|
|
16
|
+
integer = readMvtInteger(reader);
|
|
17
|
+
if (field === 4) return numericMvtValue(BigInt.asIntN(64, integer));
|
|
18
|
+
if (field === 5) return numericMvtValue(integer);
|
|
19
|
+
if (field === 6) return numericMvtValue((integer >> 1n) ^ -(integer & 1n));
|
|
20
|
+
return integer !== 0n;
|
|
21
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { readMvtFeature } from './readMvtFeature.js';
|
|
3
|
+
import { readMvtField } from './readMvtField.js';
|
|
4
|
+
import { readMvtMessage } from './readMvtMessage.js';
|
|
5
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
6
|
+
import { readMvtString } from './readMvtString.js';
|
|
7
|
+
import { readMvtValue } from './readMvtValue.js';
|
|
8
|
+
import { skipMvtField } from './skipMvtField.js';
|
|
9
|
+
|
|
10
|
+
export function readMvtLayer(reader) {
|
|
11
|
+
let name, version, extent = 4096, field, wire, value, i = 0;
|
|
12
|
+
const keys = /* alloc */ [], values = /* alloc */ [], features = /* alloc */ [];
|
|
13
|
+
while (reader.pos < reader.bytes.length) {
|
|
14
|
+
[field, wire] = readMvtField(reader);
|
|
15
|
+
if (field === 1) name = readMvtString(reader, wire);
|
|
16
|
+
else if (field === 2) features.push(readMvtMessage(reader, wire));
|
|
17
|
+
else if (field === 3) keys.push(readMvtString(reader, wire));
|
|
18
|
+
else if (field === 4) values.push(readMvtValue(readMvtMessage(reader, wire)));
|
|
19
|
+
else if (field === 5 || field === 15) {
|
|
20
|
+
expectMvtWire(wire, 0);
|
|
21
|
+
value = readMvtNumber(reader);
|
|
22
|
+
if (field === 5) extent = value;
|
|
23
|
+
else version = value;
|
|
24
|
+
} else skipMvtField(reader, wire);
|
|
25
|
+
}
|
|
26
|
+
if (!name || !/* alloc */ [1, 2].includes(version) || !extent || extent > 0xffffffff) {
|
|
27
|
+
throw /* alloc */ new Error('Invalid MVT layer metadata');
|
|
28
|
+
}
|
|
29
|
+
for (; i < features.length; i++) features[i] = readMvtFeature(features[i], keys, values);
|
|
30
|
+
return /* alloc */ { name, extent, features };
|
|
31
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createMvtReader } from './createMvtReader.js';
|
|
2
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
3
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
4
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
5
|
+
|
|
6
|
+
export function readMvtMessage(reader, wire) {
|
|
7
|
+
expectMvtWire(wire, 2);
|
|
8
|
+
const size = readMvtNumber(reader), start = takeMvtBytes(reader, size);
|
|
9
|
+
return createMvtReader(reader.bytes.subarray(start, start + size));
|
|
10
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
2
|
+
|
|
3
|
+
export function readMvtNumber(reader) {
|
|
4
|
+
const value = readMvtInteger(reader);
|
|
5
|
+
if (value > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
6
|
+
throw /* alloc */ new Error('MVT integer exceeds safe range');
|
|
7
|
+
}
|
|
8
|
+
return Number(value);
|
|
9
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { readMvtMessage } from './readMvtMessage.js';
|
|
2
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
3
|
+
|
|
4
|
+
export function readMvtNumbers(reader, wire, target) {
|
|
5
|
+
let packed;
|
|
6
|
+
if (wire === 0) target.push(readMvtNumber(reader));
|
|
7
|
+
else {
|
|
8
|
+
packed = readMvtMessage(reader, wire);
|
|
9
|
+
while (packed.pos < packed.bytes.length) target.push(readMvtNumber(packed));
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readMvtField } from './readMvtField.js';
|
|
2
|
+
import { skipMvtField } from './skipMvtField.js';
|
|
3
|
+
import { readMvtKnownValue } from './readMvtKnownValue.js';
|
|
4
|
+
|
|
5
|
+
export function readMvtValue(reader) {
|
|
6
|
+
let value, found = false, field, wire;
|
|
7
|
+
while (reader.pos < reader.bytes.length) {
|
|
8
|
+
[field, wire] = readMvtField(reader);
|
|
9
|
+
if (field < 1 || field > 7) {
|
|
10
|
+
skipMvtField(reader, wire);
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
if (found) throw /* alloc */ new Error('Multiple MVT value types');
|
|
14
|
+
found = true;
|
|
15
|
+
value = readMvtKnownValue(reader, field, wire);
|
|
16
|
+
}
|
|
17
|
+
if (!found) throw /* alloc */ new Error('Empty MVT value');
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { expectMvtWire } from './expectMvtWire.js';
|
|
2
|
+
import { readMvtInteger } from './readMvtInteger.js';
|
|
3
|
+
import { readMvtNumber } from './readMvtNumber.js';
|
|
4
|
+
import { takeMvtBytes } from './takeMvtBytes.js';
|
|
5
|
+
|
|
6
|
+
export function skipMvtField(reader, wire) {
|
|
7
|
+
switch (wire) {
|
|
8
|
+
case 0: readMvtInteger(reader); break;
|
|
9
|
+
case 1: takeMvtBytes(reader, 8); break;
|
|
10
|
+
case 2: takeMvtBytes(reader, readMvtNumber(reader)); break;
|
|
11
|
+
case 5: takeMvtBytes(reader, 4); break;
|
|
12
|
+
default: throw /* alloc */ new Error('Unsupported MVT wire type');
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { mergeMvtActiveEdges } from './mergeMvtActiveEdges.js';
|
|
2
|
+
|
|
3
|
+
export function sortMvtActiveEdges(active) {
|
|
4
|
+
const sorted = /* alloc */ new Array(active.length);
|
|
5
|
+
let width = 1, left, mid, right, i;
|
|
6
|
+
while (width < active.length) {
|
|
7
|
+
for (left = 0; left < active.length; left += width * 2) {
|
|
8
|
+
mid = Math.min(left + width, active.length);
|
|
9
|
+
right = Math.min(left + width * 2, active.length);
|
|
10
|
+
mergeMvtActiveEdges(active, sorted, left, mid, right);
|
|
11
|
+
}
|
|
12
|
+
for (i = 0; i < active.length; i++) active[i] = sorted[i];
|
|
13
|
+
width *= 2;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function sortedMvtLevels(levels) {
|
|
2
|
+
const sorted = /* alloc */ [];
|
|
3
|
+
let y, gap = 0, i = 0, j, value, count = 0;
|
|
4
|
+
for (y of levels) sorted.push(y);
|
|
5
|
+
gap = Math.floor(sorted.length / 2);
|
|
6
|
+
for (; gap > 0; gap = Math.floor(gap / 2)) {
|
|
7
|
+
for (i = gap; i < sorted.length; i++) {
|
|
8
|
+
value = sorted[i];
|
|
9
|
+
j = i;
|
|
10
|
+
while (j >= gap && sorted[j - gap] > value) {
|
|
11
|
+
sorted[j] = sorted[j - gap];
|
|
12
|
+
j -= gap;
|
|
13
|
+
}
|
|
14
|
+
sorted[j] = value;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
for (i = 0; i < sorted.length; i++) {
|
|
18
|
+
if (!count || sorted[i] - sorted[count - 1] > 1e-8) sorted[count++] = sorted[i];
|
|
19
|
+
}
|
|
20
|
+
sorted.length = count;
|
|
21
|
+
return sorted;
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { addMvtCrossings } from './addMvtCrossings.js';
|
|
2
|
+
import { appendMvtBandTriangles } from './appendMvtBandTriangles.js';
|
|
3
|
+
import { collectMvtEdges } from './collectMvtEdges.js';
|
|
4
|
+
import { sortedMvtLevels } from './sortedMvtLevels.js';
|
|
5
|
+
|
|
6
|
+
export function tessellateVectorRings(rings) {
|
|
7
|
+
const edges = /* alloc */ [], levels = /* alloc */ new Set(), triangles = /* alloc */ [];
|
|
8
|
+
let sorted, i = 1, top, bottom;
|
|
9
|
+
collectMvtEdges(rings, edges, levels);
|
|
10
|
+
addMvtCrossings(edges, levels);
|
|
11
|
+
sorted = sortedMvtLevels(levels);
|
|
12
|
+
// ponytail: quadratic edge scan; use a sweep-line index for large datasets.
|
|
13
|
+
for (; i < sorted.length; i++) {
|
|
14
|
+
top = sorted[i - 1];
|
|
15
|
+
bottom = sorted[i];
|
|
16
|
+
if (bottom > top) appendMvtBandTriangles(edges, top, bottom, triangles);
|
|
17
|
+
}
|
|
18
|
+
return triangles;
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { appendMvtPolygonTriangles } from './appendMvtPolygonTriangles.js';
|
|
2
|
+
import { groupMvtPolygons } from './groupMvtPolygons.js';
|
|
3
|
+
import { mvtPathsVertices } from './mvtPathsVertices.js';
|
|
4
|
+
import { mvtPolygonPaths } from './mvtPolygonPaths.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Reuse City Mapper's triangulator in tile space, with even-odd tessellation
|
|
8
|
+
* for quantized touching/crossing rings. Output triangles omit their closure.
|
|
9
|
+
*/
|
|
10
|
+
export function triangulateVectorRings(rings) {
|
|
11
|
+
const polygons = groupMvtPolygons(rings), triangles = /* alloc */ [];
|
|
12
|
+
let polygon, paths, vertices;
|
|
13
|
+
for (polygon of polygons) {
|
|
14
|
+
paths = mvtPolygonPaths(polygon);
|
|
15
|
+
vertices = mvtPathsVertices(paths);
|
|
16
|
+
appendMvtPolygonTriangles(polygon, paths, vertices, triangles);
|
|
17
|
+
}
|
|
18
|
+
return triangles;
|
|
19
|
+
}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import { synchronizeNativeLayer } from './synchronizeNativeLayer.js';
|
|
2
|
+
import { cameraViewByMap } from '../weakmaps/cameraViewByMap.js';
|
|
2
3
|
|
|
3
4
|
export function beforeNativeRender(state) {
|
|
4
5
|
try {
|
|
5
6
|
synchronizeNativeLayer(state);
|
|
7
|
+
const uniform = state.meshes.get('stroke')?.program.uniforms.strokeScale;
|
|
8
|
+
if (uniform) {
|
|
9
|
+
const zoom = cameraViewByMap.get(state.map)?.zoom ?? state.map.getZoom();
|
|
10
|
+
uniform.value = 2 ** (state.strokeZoom - zoom) * Number(state.source.options.weight) / state.strokeWeight;
|
|
11
|
+
}
|
|
6
12
|
} catch (error) {
|
|
7
13
|
state.failed = true;
|
|
8
14
|
state.source.fire('error', /* alloc */ { error });
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { L } from '../globals/L.js';
|
|
2
|
+
import { nativeScalableStyleKeys } from '../globals/nativeScalableStyleKeys.js';
|
|
3
|
+
|
|
4
|
+
export function canScaleNativeStyle(name, state, args) {
|
|
5
|
+
const { source } = state;
|
|
6
|
+
if (name !== 'setStyle' || source.options.interactive !== false || state.dirty && !state.zoomOnly) return false;
|
|
7
|
+
const stroke = state.strokeCoordinates && state.meshes.get('stroke')?.program.uniforms.strokeScale;
|
|
8
|
+
const fill = source instanceof L.Polygon && !source.options.stroke && state.meshes.has('fill');
|
|
9
|
+
if (!stroke && !fill) return false;
|
|
10
|
+
let key;
|
|
11
|
+
if (args[0]) {
|
|
12
|
+
for (key of Object.keys(args[0])) {
|
|
13
|
+
if (!nativeScalableStyleKeys.has(key)) return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { L } from '../globals/L.js';
|
|
2
|
+
import { disposeMesh } from '../rendering/disposeMesh.js';
|
|
3
|
+
import { createMesh } from '../rendering/createMesh.js';
|
|
4
|
+
import { nativeProgram } from './nativeProgram.js';
|
|
5
|
+
|
|
6
|
+
export function createNativeMesh(state, key, position, color, opacity, texture, uv, terrain, nativeStroke) {
|
|
7
|
+
const { backend: layer, source, meshes } = state;
|
|
8
|
+
// Unlit, noninteractive strokes use the normal slot for stationary anchors.
|
|
9
|
+
const normal = nativeStroke ? state.strokeAnchors : /* alloc */ [];
|
|
10
|
+
let index, mesh = meshes.get(key);
|
|
11
|
+
if (!nativeStroke) {
|
|
12
|
+
for (index = 0; index < position.length; index++) normal.push(index % 3 === 1 ? 1 : 0);
|
|
13
|
+
}
|
|
14
|
+
const data = /* alloc */ { position, normal };
|
|
15
|
+
if (uv) data.uv = uv;
|
|
16
|
+
const material = /* alloc */ {
|
|
17
|
+
vertexColors: false, color, opacity, unlit: true, alphaMode: 'BLEND', depthWrite: terrain, nativeStroke,
|
|
18
|
+
};
|
|
19
|
+
if (texture) material.baseTexture = texture;
|
|
20
|
+
if (mesh) disposeMesh(layer, mesh);
|
|
21
|
+
mesh = createMesh(layer, data, material, 0, source instanceof L.GridLayer
|
|
22
|
+
? (terrain ? state.terrainRasterProgram : state.rasterProgram) || nativeProgram(layer, material)
|
|
23
|
+
: nativeProgram(layer, material));
|
|
24
|
+
if (source instanceof L.GridLayer) {
|
|
25
|
+
if (terrain) state.terrainRasterProgram ||= mesh.program;
|
|
26
|
+
else state.rasterProgram ||= mesh.program;
|
|
27
|
+
mesh.texture = texture;
|
|
28
|
+
}
|
|
29
|
+
meshes.set(key, mesh);
|
|
30
|
+
return mesh;
|
|
31
|
+
}
|
|
@@ -17,7 +17,7 @@ export function disposeNativeLayer() {
|
|
|
17
17
|
const { source, map, backend: layer, meshes, textures, images } = state;
|
|
18
18
|
const events = 'load tileload tileunload move drag';
|
|
19
19
|
source.off(events, refreshNativeEvent, state);
|
|
20
|
-
map.off('zoomend', refreshNativeEvent, state);
|
|
20
|
+
map.off('zoomend terrainchange', refreshNativeEvent, state);
|
|
21
21
|
if (state.marker) map.off('move zoom rotate pitch resize viewreset', updateNativeLayerView, state);
|
|
22
22
|
removeNativeEvents(state);
|
|
23
23
|
let name, methods, mesh, texture, image;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export async function getGridTerrainTile(state, z, x, y) {
|
|
2
|
+
const limit = 2 ** z;
|
|
3
|
+
x = ((x % limit) + limit) % limit;
|
|
4
|
+
y = Math.max(0, Math.min(limit - 1, y));
|
|
5
|
+
const key = `${z}/${x}/${y}`;
|
|
6
|
+
let entry = state.terrainCache.get(key);
|
|
7
|
+
if (!entry) {
|
|
8
|
+
entry = /* alloc */ { promise: state.layer.options.getTile(z, x, y, state.terrainController.signal) };
|
|
9
|
+
state.terrainCache.set(key, entry);
|
|
10
|
+
} else {
|
|
11
|
+
state.terrainCache.delete(key);
|
|
12
|
+
state.terrainCache.set(key, entry);
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
if (!entry.data) entry.data = await entry.promise;
|
|
16
|
+
if (!(entry.data instanceof Float32Array) || entry.data.length !== 65536) {
|
|
17
|
+
throw /* alloc */ new Error(`Invalid elevation tile ${key}: expected 256x256 Float32Array`);
|
|
18
|
+
}
|
|
19
|
+
if (!entry.range) {
|
|
20
|
+
let minimum = Infinity, maximum = -Infinity, elevation;
|
|
21
|
+
for (elevation of entry.data) {
|
|
22
|
+
if (!Number.isFinite(elevation) || elevation <= -1000) continue;
|
|
23
|
+
minimum = Math.min(minimum, elevation);
|
|
24
|
+
maximum = Math.max(maximum, elevation);
|
|
25
|
+
}
|
|
26
|
+
entry.range = /* alloc */ [minimum, maximum];
|
|
27
|
+
}
|
|
28
|
+
} catch (error) {
|
|
29
|
+
if (state.terrainCache.get(key) === entry) state.terrainCache.delete(key);
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
while (state.terrainCache.size > 256) state.terrainCache.delete(state.terrainCache.keys().next().value);
|
|
33
|
+
return entry.data;
|
|
34
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { terrainElevation } from '../terrain/terrainElevation.js';
|
|
2
|
+
import { nativeTerrainElevation } from './nativeTerrainElevation.js';
|
|
3
|
+
|
|
4
|
+
export function gridTerrainElevation(state, location) {
|
|
5
|
+
let z = Math.max(0, Math.min(24, Math.round(state.map.getZoom())));
|
|
6
|
+
const tiles = /* alloc */ new Map();
|
|
7
|
+
let point, limit, x, y, index, dx, dy, tx, ty, entry, elevation;
|
|
8
|
+
for (; z >= 0; z--) {
|
|
9
|
+
point = state.map.project(location, z), limit = 2 ** z;
|
|
10
|
+
x = Math.floor(point.x / 256), y = Math.floor(point.y / 256);
|
|
11
|
+
elevation = nativeTerrainElevation(state, point, x, y, z);
|
|
12
|
+
if (Number.isFinite(elevation)) return elevation;
|
|
13
|
+
tiles.clear();
|
|
14
|
+
for (index = 0; index < 9; index++) {
|
|
15
|
+
dx = index % 3 - 1;
|
|
16
|
+
dy = Math.floor(index / 3) - 1;
|
|
17
|
+
tx = ((x + dx) % limit + limit) % limit;
|
|
18
|
+
ty = Math.max(0, Math.min(limit - 1, y + dy));
|
|
19
|
+
entry = state.terrainCache.get(`${z}/${tx}/${ty}`);
|
|
20
|
+
if (entry?.data) tiles.set(`${x + dx}/${y + dy}`, entry.data);
|
|
21
|
+
}
|
|
22
|
+
elevation = terrainElevation(point, tiles);
|
|
23
|
+
if (Number.isFinite(elevation)) return elevation;
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { getGridTerrainTile } from './getGridTerrainTile.js';
|
|
2
|
+
import { refreshNativeLayer } from './refreshNativeLayer.js';
|
|
3
|
+
|
|
4
|
+
export async function loadGridTerrain(state, key, tile, request) {
|
|
5
|
+
const { x, y, z } = tile.coords, stream = request.stream;
|
|
6
|
+
const jobs = /* alloc */ [], tiles = /* alloc */ new Map();
|
|
7
|
+
let dx, dy, i = 0;
|
|
8
|
+
try {
|
|
9
|
+
for (dy = -1; dy <= 1; dy++) for (dx = -1; dx <= 1; dx++) {
|
|
10
|
+
jobs.push(getGridTerrainTile(stream, z, x + dx, y + dy));
|
|
11
|
+
}
|
|
12
|
+
const values = await Promise.all(jobs);
|
|
13
|
+
if (state.disposed || stream.terrainController.signal.aborted ||
|
|
14
|
+
state.source._tiles[key] !== tile || state.terrainRequests.get(key) !== request) return;
|
|
15
|
+
for (dy = -1; dy <= 1; dy++) for (dx = -1; dx <= 1; dx++) tiles.set(`${x + dx}/${y + dy}`, values[i++]);
|
|
16
|
+
request.tiles = tiles;
|
|
17
|
+
refreshNativeLayer(state);
|
|
18
|
+
state.map.fire('terrainchange');
|
|
19
|
+
state.source._update();
|
|
20
|
+
} catch (error) {
|
|
21
|
+
if (!state.disposed && !stream.terrainController.signal.aborted && state.source._tiles[key] === tile) {
|
|
22
|
+
request.error = error;
|
|
23
|
+
stream.layer.fire('error', /* alloc */ { error, coords: tile.coords });
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -25,7 +25,7 @@ import { synchronizeNativeLayer } from './synchronizeNativeLayer.js';
|
|
|
25
25
|
export async function nativeLayer(state) {
|
|
26
26
|
const { source, map } = state;
|
|
27
27
|
const layer = state.backend = createLayer(/* alloc */ {
|
|
28
|
-
source: /* alloc */ { type: '
|
|
28
|
+
source: /* alloc */ { type: 'vector' },
|
|
29
29
|
});
|
|
30
30
|
state.meshes = /* alloc */ new Map();
|
|
31
31
|
state.textures = /* alloc */ new Map();
|
|
@@ -43,7 +43,7 @@ export async function nativeLayer(state) {
|
|
|
43
43
|
state.disposed = false;
|
|
44
44
|
const currentEvents = 'load tileload tileunload move drag';
|
|
45
45
|
source.on(currentEvents, refreshNativeEvent, state);
|
|
46
|
-
map.on('zoomend', refreshNativeEvent, state);
|
|
46
|
+
map.on('zoomend terrainchange', refreshNativeEvent, state);
|
|
47
47
|
if (state.marker) map.on('move zoom rotate pitch resize viewreset', updateNativeLayerView, state);
|
|
48
48
|
nativeEvents(state);
|
|
49
49
|
let name, own, original;
|
|
@@ -3,25 +3,15 @@ import { nativeGPUBackByMap } from '../weakmaps/nativeGPUBackByMap.js';
|
|
|
3
3
|
import { nativeGPUOrderByMap } from '../weakmaps/nativeGPUOrderByMap.js';
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
import { L } from '../globals/L.js';
|
|
7
|
-
|
|
8
|
-
|
|
9
6
|
import { refreshNativeLayer } from './refreshNativeLayer.js';
|
|
7
|
+
import { canScaleNativeStyle } from './canScaleNativeStyle.js';
|
|
8
|
+
import { orderNativeGridLayer } from './orderNativeGridLayer.js';
|
|
10
9
|
|
|
11
10
|
export function nativeLayerMethod(name, source, args) {
|
|
12
11
|
const state = nativeGPUByLayer.get(source), original = state.methods.get(name).original;
|
|
12
|
+
const scalable = canScaleNativeStyle(name, state, args);
|
|
13
13
|
const result = original.apply(source, args);
|
|
14
|
-
|
|
15
|
-
if ((name === 'bringToFront' || name === 'bringToBack') && source instanceof L.GridLayer) {
|
|
16
|
-
let extreme = name === 'bringToFront' ? -Infinity : Infinity;
|
|
17
|
-
for (layer of Object.values(state.map._layers)) {
|
|
18
|
-
if (layer === source || !(layer instanceof L.GridLayer) || layer.getPane() !== source.getPane()) continue;
|
|
19
|
-
zIndex = layer.options.zIndex || 0;
|
|
20
|
-
extreme = name === 'bringToFront' ? Math.max(extreme, zIndex) : Math.min(extreme, zIndex);
|
|
21
|
-
}
|
|
22
|
-
const edge = name === 'bringToFront' ? extreme + 1 : extreme - 1;
|
|
23
|
-
if (Number.isFinite(edge)) source.setZIndex(edge);
|
|
24
|
-
}
|
|
14
|
+
orderNativeGridLayer(state, name);
|
|
25
15
|
if (name === 'bringToFront') {
|
|
26
16
|
state.order = nativeGPUOrderByMap.get(state.map) + 1;
|
|
27
17
|
nativeGPUOrderByMap.set(state.map, state.order);
|
|
@@ -31,5 +21,6 @@ export function nativeLayerMethod(name, source, args) {
|
|
|
31
21
|
nativeGPUBackByMap.set(state.map, state.order);
|
|
32
22
|
}
|
|
33
23
|
refreshNativeLayer(state);
|
|
24
|
+
if (scalable && (!source.options.stroke || Number(source.options.weight) > 0)) state.zoomOnly = true;
|
|
34
25
|
return result;
|
|
35
26
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { rendererByLayer } from '../weakmaps/rendererByLayer.js';
|
|
2
|
+
import { nativeProgramsByRenderer } from '../weakmaps/nativeProgramsByRenderer.js';
|
|
3
|
+
import { createProgram } from '../materials/createProgram.js';
|
|
4
|
+
import { createProgramUniforms } from '../materials/createProgramUniforms.js';
|
|
5
|
+
|
|
6
|
+
export function nativeProgram(layer, material) {
|
|
7
|
+
const renderer = rendererByLayer.get(layer);
|
|
8
|
+
let programs = nativeProgramsByRenderer.get(renderer);
|
|
9
|
+
if (!programs) {
|
|
10
|
+
programs = /* alloc */ new Map();
|
|
11
|
+
nativeProgramsByRenderer.set(renderer, programs);
|
|
12
|
+
}
|
|
13
|
+
const key = `${Boolean(material.baseTexture)}:${Boolean(material.nativeStroke)}:${Boolean(material.depthWrite)}`;
|
|
14
|
+
let template = programs.get(key);
|
|
15
|
+
if (!template) {
|
|
16
|
+
template = createProgram(layer, /* alloc */ { doubleSided: true, ...material });
|
|
17
|
+
programs.set(key, template);
|
|
18
|
+
}
|
|
19
|
+
return /* alloc */ { ...template, uniforms: createProgramUniforms(material), _layerMaterial: material };
|
|
20
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { terrainElevation } from '../terrain/terrainElevation.js';
|
|
2
|
+
import { nativeGPUByLayer } from '../weakmaps/nativeGPUByLayer.js';
|
|
3
|
+
|
|
4
|
+
export function nativeTerrainElevation(state, point, x, y, z) {
|
|
5
|
+
let layer, native, request, elevation;
|
|
6
|
+
const key = `${x}:${y}:${z}`;
|
|
7
|
+
for (layer of Object.values(state.map._layers)) {
|
|
8
|
+
native = nativeGPUByLayer.get(layer);
|
|
9
|
+
if (native?.disposed || native?.terrainStream !== state) continue;
|
|
10
|
+
request = native.terrainRequests?.get(key);
|
|
11
|
+
if (!request?.tiles || layer._tiles[key] !== request.tile) continue;
|
|
12
|
+
elevation = terrainElevation(point, request.tiles);
|
|
13
|
+
if (Number.isFinite(elevation)) return elevation;
|
|
14
|
+
}
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { geometryPixelStates } from '../globals/geometryPixelStates.js';
|
|
2
|
+
import { nativeGeometry } from '../geometry/nativeGeometry.js';
|
|
3
|
+
import { localPixelForGeometry } from '../projections/localPixelForGeometry.js';
|
|
4
|
+
import { locationByLayer } from '../weakmaps/locationByLayer.js';
|
|
5
|
+
import { radians } from '../globals/radians.js';
|
|
6
|
+
import { L } from '../globals/L.js';
|
|
7
|
+
|
|
8
|
+
export function nativeVectorGeometry(state) {
|
|
9
|
+
const { source } = state;
|
|
10
|
+
state.strokeCoordinates = null;
|
|
11
|
+
state.strokeAnchors = source instanceof L.Polyline && !source.options.dashArray ? /* alloc */ [] : null;
|
|
12
|
+
const crs = state.map.options.crs, origin = locationByLayer.get(state.backend);
|
|
13
|
+
state.pixelProjection = /* alloc */ {
|
|
14
|
+
transformation: crs.transformation, scale: crs.scale(state.map.getZoom()),
|
|
15
|
+
origin: crs.project(origin), metres: Math.cos(origin.lat * radians),
|
|
16
|
+
};
|
|
17
|
+
geometryPixelStates.push(state);
|
|
18
|
+
try {
|
|
19
|
+
return nativeGeometry(source, state.map, localPixelForGeometry);
|
|
20
|
+
} finally {
|
|
21
|
+
geometryPixelStates.pop();
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { L } from '../globals/L.js';
|
|
2
|
+
|
|
3
|
+
export function orderNativeGridLayer(state, name) {
|
|
4
|
+
const { source } = state;
|
|
5
|
+
if (!(source instanceof L.GridLayer) || name !== 'bringToFront' && name !== 'bringToBack') return;
|
|
6
|
+
let extreme = name === 'bringToFront' ? -Infinity : Infinity, layer, zIndex;
|
|
7
|
+
for (layer of Object.values(state.map._layers)) {
|
|
8
|
+
if (layer === source || !(layer instanceof L.GridLayer) || layer.getPane() !== source.getPane()) continue;
|
|
9
|
+
zIndex = layer.options.zIndex || 0;
|
|
10
|
+
extreme = name === 'bringToFront' ? Math.max(extreme, zIndex) : Math.min(extreme, zIndex);
|
|
11
|
+
}
|
|
12
|
+
const edge = name === 'bringToFront' ? extreme + 1 : extreme - 1;
|
|
13
|
+
if (Number.isFinite(edge)) source.setZIndex(edge);
|
|
14
|
+
}
|