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
|
@@ -12,6 +12,9 @@ import { loading } from '../globals/loading.js';
|
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
import { init3D } from './init3D.js';
|
|
15
|
+
import { initializeGeoJSON } from '../sources/initializeGeoJSON.js';
|
|
16
|
+
import { isVectorTileSource } from '../sources/isVectorTileSource.js';
|
|
17
|
+
import { initVectorTiles } from '../sources/initVectorTiles.js';
|
|
15
18
|
import { noOperation } from '../utils/noOperation.js';
|
|
16
19
|
import { resolveNextInitialization } from './resolveNextInitialization.js';
|
|
17
20
|
import { initializeLayer } from './initializeLayer.js';
|
|
@@ -25,21 +28,20 @@ export function layerInitialize(options = sceneEmptyOptions) {
|
|
|
25
28
|
L.Util.setOptions(this, options);
|
|
26
29
|
return;
|
|
27
30
|
}
|
|
28
|
-
const {
|
|
29
|
-
|
|
30
|
-
type = options.source.data?.type === 'FeatureCollection'
|
|
31
|
-
? 'geojson'
|
|
32
|
-
: /\.pmtiles(?:[?#]|$)/i.test(options.source.url) ? 'pmtiles'
|
|
33
|
-
: /\.tiff?(?:[?#]|$)/i.test(options.source.url) ? 'cog' : '3d',
|
|
34
|
-
...source
|
|
35
|
-
},
|
|
36
|
-
...core
|
|
37
|
-
} = options;
|
|
31
|
+
const { source: { type = /\.pmtiles(?:[?#]|$)|\.tiff?(?:[?#]|$)/i.test(options.source.url)
|
|
32
|
+
? 'raster' : 'vector', ...source }, ...core } = options;
|
|
38
33
|
const settings = /* alloc */ { ...source, ...core };
|
|
39
34
|
L.Util.setOptions(this, core);
|
|
40
35
|
typeByLayer.set(this, type);
|
|
41
|
-
if (type === '
|
|
42
|
-
|
|
36
|
+
if (type === 'vector') {
|
|
37
|
+
if (isVectorTileSource(settings)) {
|
|
38
|
+
initVectorTiles(this, settings);
|
|
39
|
+
} else if (settings.data !== undefined || settings.style !== undefined && !settings.url ||
|
|
40
|
+
settings.url && !/\.(?:pmtiles|glb|gltf)(?:[?#]|$)/i.test(settings.url)) {
|
|
41
|
+
initializeGeoJSON(this, settings);
|
|
42
|
+
} else {
|
|
43
|
+
init3D(this, settings);
|
|
44
|
+
}
|
|
43
45
|
return;
|
|
44
46
|
}
|
|
45
47
|
kindByLayer.set(this, 'pending');
|
|
@@ -5,7 +5,7 @@ import { initializerFor } from './initializerFor.js';
|
|
|
5
5
|
|
|
6
6
|
export function resolveNextInitialization() {
|
|
7
7
|
const task = pendingInitializations.shift();
|
|
8
|
-
task.initialize = initializerFor(task.type);
|
|
8
|
+
task.initialize = initializerFor(task.type, task.settings);
|
|
9
9
|
if (!task.initialize) {
|
|
10
10
|
task.error = /* alloc */ new Error(`Unknown layer type: ${task.type}`);
|
|
11
11
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { roofVertexShader } from './roofVertexShader.js';
|
|
2
|
+
import { nativeStrokeShader } from './nativeStrokeShader.js';
|
|
2
3
|
|
|
3
4
|
export function materialVertexShader(material, sparkle, elevationWGSL, hasTerrain, textured, hasRoof) {
|
|
4
5
|
const instanceOffset = material.instanced ? ' + input.instanceOffset.xyz' : '';
|
|
6
|
+
const stroke = nativeStrokeShader(material);
|
|
5
7
|
return /* wgsl */ `
|
|
6
8
|
struct Mesh {
|
|
7
9
|
worldMatrix: mat4x4<f32>,
|
|
@@ -11,6 +13,7 @@ export function materialVertexShader(material, sparkle, elevationWGSL, hasTerrai
|
|
|
11
13
|
terrain: vec4<f32>,
|
|
12
14
|
highlight: vec4<f32>,
|
|
13
15
|
cutout: vec4<f32>,
|
|
16
|
+
nativeStroke: vec4<f32>,
|
|
14
17
|
};
|
|
15
18
|
struct Frame {
|
|
16
19
|
viewMatrix: mat4x4<f32>,
|
|
@@ -46,6 +49,7 @@ export function materialVertexShader(material, sparkle, elevationWGSL, hasTerrai
|
|
|
46
49
|
@vertex fn vertexMain(input: VertexInput, @builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
|
|
47
50
|
var output: VertexOutput;
|
|
48
51
|
var position = input.position${instanceOffset};
|
|
52
|
+
${stroke.position}
|
|
49
53
|
${hasTerrain ? 'position.y = elevation(u.terrain.xy + input.uv * u.terrain.z, u.terrain.w) - u.terrain.w;' : ''}
|
|
50
54
|
let featureVertex = f32(vertexIndex)${material.instanced ? ' + input.instanceOffset.w' : ''};
|
|
51
55
|
let highlighted = featureVertex >= u.highlight.x && featureVertex < u.highlight.y;
|
|
@@ -54,8 +58,9 @@ export function materialVertexShader(material, sparkle, elevationWGSL, hasTerrai
|
|
|
54
58
|
: 'u.baseColor.rgb'};
|
|
55
59
|
// Inverse-transpose from cofactors; the camera view matrix is orthonormal.
|
|
56
60
|
let m = mat3x3<f32>(u.worldMatrix[0].xyz, u.worldMatrix[1].xyz, u.worldMatrix[2].xyz);
|
|
57
|
-
|
|
58
|
-
|
|
61
|
+
${stroke.normal}
|
|
62
|
+
let normal = (cross(m[1], m[2]) * sourceNormal.x + cross(m[2], m[0]) * sourceNormal.y +
|
|
63
|
+
cross(m[0], m[1]) * sourceNormal.z) / determinant(m);
|
|
59
64
|
output.normal = (frame.viewMatrix * vec4<f32>(normal, 0.0)).xyz;
|
|
60
65
|
let world = u.worldMatrix * vec4<f32>(position, 1.0);
|
|
61
66
|
output.shadowPosition = solar.matrix * world;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function nativeStrokeShader(material) {
|
|
2
|
+
return /* alloc */ {
|
|
3
|
+
position: material.nativeStroke ? 'position = input.normal + (input.position - input.normal) * u.nativeStroke.x;' : '',
|
|
4
|
+
normal: material.nativeStroke ? 'let sourceNormal = vec3<f32>(0.0, 1.0, 0.0);' : 'let sourceNormal = input.normal;',
|
|
5
|
+
};
|
|
6
|
+
}
|
|
@@ -15,9 +15,10 @@ export function drawShadowMeshes(layer, encoder, meshes) {
|
|
|
15
15
|
let pipeline = sun.pipeline;
|
|
16
16
|
pass.setPipeline(pipeline);
|
|
17
17
|
pass.setBindGroup(1, sun.depthBindGroup);
|
|
18
|
-
let mesh, instances, nextPipeline, offset, attribute, index, range;
|
|
18
|
+
let mesh, attributes, instances, nextPipeline, offset, attribute, index, range;
|
|
19
19
|
for (mesh of meshes) {
|
|
20
|
-
|
|
20
|
+
attributes = mesh.geometry.attributes;
|
|
21
|
+
instances = attributes.instanceOffset;
|
|
21
22
|
nextPipeline = instances ? sun.instancePipeline : sun.pipeline;
|
|
22
23
|
if (nextPipeline !== pipeline) {
|
|
23
24
|
pipeline = nextPipeline;
|
|
@@ -36,7 +37,7 @@ export function drawShadowMeshes(layer, encoder, meshes) {
|
|
|
36
37
|
shadowBindGroup.layout = null;
|
|
37
38
|
shadowBindGroup.entries[0].resource.buffer = null;
|
|
38
39
|
}
|
|
39
|
-
for (attribute of Object.values(
|
|
40
|
+
for (attribute of Object.values(attributes)) {
|
|
40
41
|
if (attribute.needsUpdate) {
|
|
41
42
|
device.queue.writeBuffer(attribute.buffer, 0, attribute.data);
|
|
42
43
|
attribute.needsUpdate = false;
|
|
@@ -47,9 +48,9 @@ export function drawShadowMeshes(layer, encoder, meshes) {
|
|
|
47
48
|
shadowOffsets
|
|
48
49
|
));
|
|
49
50
|
|
|
50
|
-
pass.setVertexBuffer(0,
|
|
51
|
+
pass.setVertexBuffer(0, attributes.position.buffer);
|
|
51
52
|
if (instances) pass.setVertexBuffer(1, instances.buffer);
|
|
52
|
-
index =
|
|
53
|
+
index = attributes.index, range = mesh.geometry.drawRange;
|
|
53
54
|
if (index) {
|
|
54
55
|
pass.setIndexBuffer(index.buffer, index.indexFormat);
|
|
55
56
|
pass.drawIndexed(range.count, instances?.count ?? 1, range.start, 0, 0);
|
|
@@ -9,7 +9,6 @@ import { createProgram } from '../materials/createProgram.js';
|
|
|
9
9
|
|
|
10
10
|
import { setParent } from '../scene/setParent.js';
|
|
11
11
|
import { update } from '../scene/scheduleSceneUpdate.js';
|
|
12
|
-
import { instanceAreaGeometry } from '../geometry/instanceAreaGeometry.js';
|
|
13
12
|
|
|
14
13
|
export function attachAreaMesh(context) {
|
|
15
14
|
const { backend: layer, area } = context;
|
|
@@ -18,15 +17,15 @@ export function attachAreaMesh(context) {
|
|
|
18
17
|
return;
|
|
19
18
|
}
|
|
20
19
|
const device = rendererByLayer.get(layer).device;
|
|
21
|
-
const data = context.preparedGeometry
|
|
20
|
+
const data = context.preparedGeometry;
|
|
22
21
|
const attributes = /* alloc */ {
|
|
23
|
-
position: /* alloc */ { size: 3, data: data.positions
|
|
24
|
-
normal: /* alloc */ { size: 3, data: data.normals
|
|
25
|
-
color: /* alloc */ { size: 3, data: data.colors
|
|
22
|
+
position: /* alloc */ { size: 3, data: data.positions },
|
|
23
|
+
normal: /* alloc */ { size: 3, data: data.normals },
|
|
24
|
+
color: /* alloc */ { size: 3, data: data.colors },
|
|
26
25
|
};
|
|
27
26
|
if (data.instanceOffsets) attributes.instanceOffset = /* alloc */ { size: 4, data: data.instanceOffsets };
|
|
28
27
|
if (layer.options.nightLight) attributes.uv = /* alloc */ {
|
|
29
|
-
size: 2, data:
|
|
28
|
+
size: 2, data: data.uvs,
|
|
30
29
|
};
|
|
31
30
|
let name, attribute;
|
|
32
31
|
for (name in attributes) {
|
package/src/sources/buildArea.js
CHANGED
|
@@ -23,14 +23,13 @@ export async function buildArea(layer, area, map) {
|
|
|
23
23
|
if (geojsonByLayer.get(layer) && typeof layer.options.style !== 'function') {
|
|
24
24
|
throw /* alloc */ new Error('style must be a function');
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
if (layer.options.worker !== false && typeof Worker !== 'undefined' && data.features.length >= 64) {
|
|
29
|
-
context.jobs = /* alloc */ [];
|
|
26
|
+
if (layer.options.worker === false) {
|
|
27
|
+
throw /* alloc */ new Error('worker: false is no longer supported; GeoJSON geometry requires Web Workers');
|
|
30
28
|
}
|
|
29
|
+
const context = sourceAreaContext(layer, area, map);
|
|
31
30
|
await buildAreaFeatures(context, area, data.features);
|
|
32
31
|
if (area.request.signal.aborted) return;
|
|
33
|
-
|
|
32
|
+
await buildAreaInWorker(context, area.request.signal);
|
|
34
33
|
if (area.request.signal.aborted) return;
|
|
35
34
|
attachAreaMesh(context);
|
|
36
35
|
} catch (error) {
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { buildAreaPoint } from './buildAreaPoint.js';
|
|
2
|
-
import { buildAreaPolygon } from '../geometry/buildExtrudedPolygon.js';
|
|
3
1
|
import { parseColor } from '../colors/parseColor.js';
|
|
4
2
|
import { featureAnchor } from './featureAnchor.js';
|
|
5
3
|
import { extrusionStyle } from './extrusionStyle.js';
|
|
@@ -10,7 +8,7 @@ export function buildAreaFeature(context, feature) {
|
|
|
10
8
|
const { backend: layer, area, map } = context;
|
|
11
9
|
const coords = area.coords;
|
|
12
10
|
const coordinates = featureAnchor(feature, layer.options.nightLight);
|
|
13
|
-
const geometry = feature.geometry
|
|
11
|
+
const geometry = feature.geometry;
|
|
14
12
|
const lon = coordinates[0], lat = coordinates[1];
|
|
15
13
|
if (!matchesAreaTile(map, coords, lon, lat)) return;
|
|
16
14
|
const style = extrusionStyle(layer, feature);
|
|
@@ -18,25 +16,11 @@ export function buildAreaFeature(context, feature) {
|
|
|
18
16
|
context.skipped++;
|
|
19
17
|
return;
|
|
20
18
|
}
|
|
21
|
-
const {
|
|
19
|
+
const { color = 0xd9b38c } = style;
|
|
22
20
|
const baseColor = parseColor(color);
|
|
23
|
-
|
|
24
|
-
prepareAreaGeometryJob(context, feature, lon, lat, style, baseColor);
|
|
25
|
-
context.featureFaces.push(/* alloc */ {
|
|
26
|
-
id: feature.id ?? feature.properties?.objectid ?? JSON.stringify(geometry),
|
|
27
|
-
properties: feature.properties, baseColor,
|
|
28
|
-
});
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const vertexStart = context.positions.length / 3;
|
|
32
|
-
if (isTree) buildAreaPoint(context, feature, lon, lat, style, baseColor);
|
|
33
|
-
let polygon;
|
|
34
|
-
if (geometry.type === 'Polygon') buildAreaPolygon(context, geometry.coordinates, top, bottom, baseColor);
|
|
35
|
-
else if (geometry.type === 'MultiPolygon') for (polygon of geometry.coordinates) buildAreaPolygon(context, polygon, top, bottom, baseColor);
|
|
36
|
-
const vertexEnd = context.positions.length / 3;
|
|
21
|
+
prepareAreaGeometryJob(context, feature, lon, lat, style, baseColor);
|
|
37
22
|
context.featureFaces.push(/* alloc */ {
|
|
38
23
|
id: feature.id ?? feature.properties?.objectid ?? JSON.stringify(geometry),
|
|
39
24
|
properties: feature.properties, baseColor,
|
|
40
|
-
faceStart: vertexStart / 3, faceEnd: vertexEnd / 3, vertexStart, vertexEnd,
|
|
41
25
|
});
|
|
42
26
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { kindByLayer } from '../weakmaps/kindByLayer.js';
|
|
2
|
+
import { readyByLayer } from '../weakmaps/readyByLayer.js';
|
|
3
|
+
import { configureVectorTileLayer } from '../vector-tiles/configureVectorTileLayer.js';
|
|
4
|
+
import { readyVectorTiles } from './readyVectorTiles.js';
|
|
5
|
+
import { reportError } from '../raster/reportRasterError.js';
|
|
6
|
+
import { noOperation } from '../utils/noOperation.js';
|
|
7
|
+
|
|
8
|
+
export function initVectorTiles(layer, options) {
|
|
9
|
+
kindByLayer.set(layer, 'pending');
|
|
10
|
+
const ready = configureVectorTileLayer(layer, options)
|
|
11
|
+
.then(readyVectorTiles.bind(null, layer))
|
|
12
|
+
.catch(reportError.bind(null, layer));
|
|
13
|
+
readyByLayer.set(layer, ready);
|
|
14
|
+
ready.catch(noOperation);
|
|
15
|
+
}
|
|
@@ -16,7 +16,7 @@ import { pendingSourceAreas } from './pendingSourceAreas.js';
|
|
|
16
16
|
/** Share four load/build slots across source layers, nearest ground blocks first. */
|
|
17
17
|
export function pump(layer, map = layer._map) {
|
|
18
18
|
const shared = map && renderers.get(map);
|
|
19
|
-
if (!shared) return;
|
|
19
|
+
if (!shared || !layersByLayer.has(shared)) return;
|
|
20
20
|
const layers = /* alloc */ [];
|
|
21
21
|
let sourceLayer, area, areaBackend;
|
|
22
22
|
for (sourceLayer of layersByLayer.get(shared)) {
|
|
@@ -8,13 +8,8 @@ export function sourceAreaContext(layer, area, map) {
|
|
|
8
8
|
return /* alloc */ {
|
|
9
9
|
backend: layer, area, map, crs, origin,
|
|
10
10
|
metres: Math.cos(locationByLayer.get(layer).lat * radians),
|
|
11
|
-
|
|
12
|
-
normals: /* alloc */ [],
|
|
13
|
-
colors: /* alloc */ [],
|
|
14
|
-
uvs: /* alloc */ [],
|
|
11
|
+
jobs: /* alloc */ [],
|
|
15
12
|
featureFaces: /* alloc */ [],
|
|
16
|
-
lights: /* alloc */ [],
|
|
17
|
-
supports: /* alloc */ new Set(),
|
|
18
13
|
skipped: 0,
|
|
19
14
|
};
|
|
20
15
|
}
|
|
@@ -38,7 +38,6 @@ export function createSun(map) {
|
|
|
38
38
|
status.setAttribute('role', 'status');
|
|
39
39
|
const note = document.createElement('small');
|
|
40
40
|
note.style.color = '#555';
|
|
41
|
-
note.textContent = 'Indicative · loaded geometry only. Streetlight illumination is estimated, not measured lux.';
|
|
42
41
|
container.append(date, slider, timeRow, status, note);
|
|
43
42
|
const state = /* alloc */ {
|
|
44
43
|
control: null, map, originalSky: '', container, sunDisc, moonDisc, date, slider, output, status,
|
|
@@ -6,12 +6,23 @@ import { onAdd } from './onAddTimeControl.js';
|
|
|
6
6
|
import { addTo } from './addTimeControlToMap.js';
|
|
7
7
|
import { remove } from './removeTimeControl.js';
|
|
8
8
|
import { onRemoveSun } from './onRemoveSun.js';
|
|
9
|
+
import { extendLeafletClass } from '../core/extendLeafletClass.js';
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
class TimeControl extends extendLeafletClass(L.Control) {
|
|
12
|
+
static initHooks = true;
|
|
13
|
+
static defaultOptions = { position: 'bottomright' };
|
|
14
|
+
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super(options);
|
|
17
|
+
if (L.version.startsWith('2.')) {
|
|
18
|
+
initialize.call(this, options);
|
|
19
|
+
this.callInitHooks();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
Object.assign(TimeControl.prototype, { onAdd, onRemove: onRemoveSun, addTo, remove });
|
|
24
|
+
if (L.version.startsWith('1.')) {
|
|
25
|
+
TimeControl.prototype.options = Object.assign(Object.create(L.Control.prototype.options), TimeControl.defaultOptions);
|
|
26
|
+
TimeControl.prototype.initialize = initialize;
|
|
27
|
+
}
|
|
28
|
+
L.Control.Time = TimeControl;
|
|
@@ -3,6 +3,7 @@ import { rasterTilesByLayer } from '../weakmaps/rasterTilesByLayer.js';
|
|
|
3
3
|
import { terrainReadyByLayer } from '../weakmaps/terrainReadyByLayer.js';
|
|
4
4
|
import { terrainSourceByLayer } from '../weakmaps/terrainSourceByLayer.js';
|
|
5
5
|
import { terrainTilesByLayer } from '../weakmaps/terrainTilesByLayer.js';
|
|
6
|
+
import { streamTerrainByLayer } from '../weakmaps/streamTerrainByLayer.js';
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
|
|
@@ -12,10 +13,14 @@ import { init3D } from '../scene/init3D.js';
|
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* Renders Float32 DEM tiles and archived raster basemaps in the shared WebGPU scene.
|
|
15
|
-
* Source options: `url` (single-zoom Float32 PMTiles or supported COG DEM)
|
|
16
|
+
* Source options: `url` (single-zoom Float32 PMTiles or supported COG DEM),
|
|
17
|
+
* or `getTile(z, x, y, signal)` for streamed 256px Float32 elevations;
|
|
16
18
|
* `bridges` (optional GeoJSON deck polygons with Z, see _addBridges).
|
|
17
19
|
*/
|
|
18
20
|
export function initTerrain(layer, options) {
|
|
21
|
+
if (options.getTile !== undefined && typeof options.getTile !== 'function') {
|
|
22
|
+
throw /* alloc */ new Error('Streamed terrain requires a getTile function');
|
|
23
|
+
}
|
|
19
24
|
const terrainSource = options.url;
|
|
20
25
|
const layerOptions = /* alloc */ { ...options };
|
|
21
26
|
delete layerOptions.url;
|
|
@@ -24,5 +29,6 @@ export function initTerrain(layer, options) {
|
|
|
24
29
|
terrainTilesByLayer.set(layer, /* alloc */ new Map());
|
|
25
30
|
rasterTilesByLayer.set(layer, /* alloc */ new Map());
|
|
26
31
|
terrainReadyByLayer.set(layer, false);
|
|
32
|
+
if (options.getTile) streamTerrainByLayer.set(layer, true);
|
|
27
33
|
kindByLayer.set(layer, 'terrain');
|
|
28
34
|
}
|
|
@@ -5,6 +5,7 @@ import { terrainControllerByLayer } from '../weakmaps/terrainControllerByLayer.j
|
|
|
5
5
|
import { terrainLoadingByLayer } from '../weakmaps/terrainLoadingByLayer.js';
|
|
6
6
|
import { terrainReadyByLayer } from '../weakmaps/terrainReadyByLayer.js';
|
|
7
7
|
import { terrainSourceByLayer } from '../weakmaps/terrainSourceByLayer.js';
|
|
8
|
+
import { workerMapByLayer } from '../weakmaps/workerMapByLayer.js';
|
|
8
9
|
|
|
9
10
|
import { createLayer } from '../scene/createLayer.js';
|
|
10
11
|
|
|
@@ -23,9 +24,11 @@ export async function loadTerrain(layer) {
|
|
|
23
24
|
try {
|
|
24
25
|
if (!terrainSourceByLayer.get(layer)) throw /* alloc */ new Error('Terrain layer requires a PMTiles or COG elevation archive');
|
|
25
26
|
const archive = createLayer(/* alloc */ { source: /* alloc */ {
|
|
26
|
-
type:
|
|
27
|
+
type: 'raster',
|
|
27
28
|
url: terrainSourceByLayer.get(layer), archive: layer.options.archive, asset: layer.options.asset,
|
|
29
|
+
workerUrl: layer.options.workerUrl,
|
|
28
30
|
} });
|
|
31
|
+
workerMapByLayer.set(archive, layer._map);
|
|
29
32
|
terrainArchiveByLayer.set(layer, archive);
|
|
30
33
|
await readyByLayer.get(archive);
|
|
31
34
|
const header = headerByLayer.get(archive);
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { terrain3DByMap } from '../weakmaps/terrain3DByMap.js';
|
|
2
|
+
import { streamTerrainByMap } from '../weakmaps/streamTerrainByMap.js';
|
|
2
3
|
import { getElevation } from './getElevation.js';
|
|
4
|
+
import { gridTerrainElevation } from '../native/gridTerrainElevation.js';
|
|
3
5
|
|
|
4
6
|
export function mapElevationOf(map, location) {
|
|
5
7
|
const terrain = terrain3DByMap.get(map);
|
|
6
|
-
|
|
8
|
+
if (terrain) return getElevation(terrain, location);
|
|
9
|
+
const stream = streamTerrainByMap.get(map);
|
|
10
|
+
return stream && gridTerrainElevation(stream, location);
|
|
7
11
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { rootByLayer } from '../weakmaps/rootByLayer.js';
|
|
2
2
|
import { terrainPromiseByLayer } from '../weakmaps/terrainPromiseByLayer.js';
|
|
3
3
|
import { terrain3DByMap } from '../weakmaps/terrain3DByMap.js';
|
|
4
|
+
import { streamTerrainByMap } from '../weakmaps/streamTerrainByMap.js';
|
|
5
|
+
import { streamTerrainByLayer } from '../weakmaps/streamTerrainByLayer.js';
|
|
4
6
|
|
|
5
7
|
|
|
6
8
|
|
|
@@ -13,9 +15,17 @@ import { setLayerTerrain } from './setLayerTerrain.js';
|
|
|
13
15
|
|
|
14
16
|
export function onTerrainAdd(layer, map) {
|
|
15
17
|
|
|
16
|
-
if (terrain3DByMap.get(map) && terrain3DByMap.get(map) !== layer) {
|
|
18
|
+
if (streamTerrainByMap.get(map) || terrain3DByMap.get(map) && terrain3DByMap.get(map) !== layer) {
|
|
17
19
|
throw /* alloc */ new Error('Only one terrain layer can be active per map');
|
|
18
20
|
}
|
|
21
|
+
if (streamTerrainByLayer.get(layer)) {
|
|
22
|
+
streamTerrainByMap.set(map, /* alloc */ {
|
|
23
|
+
layer, map, terrainCache: /* alloc */ new Map(), terrainController: /* alloc */ new AbortController(),
|
|
24
|
+
});
|
|
25
|
+
onAdd3DLayer(layer, map);
|
|
26
|
+
map.fire('terrainchange');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
19
29
|
terrain3DByMap.set(map, layer);
|
|
20
30
|
onAdd3DLayer(layer, map);
|
|
21
31
|
if (rootByLayer.get(layer)) terrainPromiseByLayer.set(layer, loadTerrain(layer));
|
|
@@ -11,6 +11,7 @@ import { terrainPromiseByLayer } from '../weakmaps/terrainPromiseByLayer.js';
|
|
|
11
11
|
import { terrainReadyByLayer } from '../weakmaps/terrainReadyByLayer.js';
|
|
12
12
|
import { terrainTilesByLayer } from '../weakmaps/terrainTilesByLayer.js';
|
|
13
13
|
import { terrain3DByMap } from '../weakmaps/terrain3DByMap.js';
|
|
14
|
+
import { streamTerrainByMap } from '../weakmaps/streamTerrainByMap.js';
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
import { renderEmpty } from '../globals/renderEmpty.js';
|
|
@@ -25,7 +26,15 @@ import { onRemove3DLayer } from '../scene/onRemove3DLayer.js';
|
|
|
25
26
|
import { clearLayerTerrain } from './clearLayerTerrain.js';
|
|
26
27
|
|
|
27
28
|
export function onTerrainRemove(layer, map) {
|
|
28
|
-
|
|
29
|
+
const stream = streamTerrainByMap.get(map);
|
|
30
|
+
if (stream?.layer === layer) {
|
|
31
|
+
streamTerrainByMap.delete(map);
|
|
32
|
+
stream.terrainController.abort();
|
|
33
|
+
stream.terrainCache.clear();
|
|
34
|
+
map.fire('terrainchange');
|
|
35
|
+
onRemove3DLayer(layer, map);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
29
38
|
terrainControllerByLayer.get(layer)?.abort();
|
|
30
39
|
terrainLoadingByLayer.set(layer, false);
|
|
31
40
|
terrainReadyByLayer.set(layer, false);
|
|
@@ -17,8 +17,7 @@ export function textureFor(state, key, image) {
|
|
|
17
17
|
const url = image.currentSrc || image.src;
|
|
18
18
|
if (!texture || texture.image !== image || texture.url !== url) {
|
|
19
19
|
if (texture) {
|
|
20
|
-
|
|
21
|
-
if (mesh) disposeMesh(layer, mesh);
|
|
20
|
+
disposeMesh(layer, meshes.get(key));
|
|
22
21
|
meshes.delete(key);
|
|
23
22
|
destroyTexture(layer, texture.texture);
|
|
24
23
|
textures.delete(key);
|
|
@@ -35,7 +34,7 @@ export function textureFor(state, key, image) {
|
|
|
35
34
|
sampler: device.createSampler(coreSampler),
|
|
36
35
|
};
|
|
37
36
|
textures.set(key, texture);
|
|
38
|
-
if (image instanceof HTMLCanvasElement) {
|
|
37
|
+
if (image instanceof HTMLCanvasElement || url.startsWith('data:image/svg+xml')) {
|
|
39
38
|
texture.pending = true;
|
|
40
39
|
uploadCanvasTexture(state, key, texture, image, device, width, height);
|
|
41
40
|
} else {
|
|
@@ -2,9 +2,18 @@ import { current } from '../native/isCurrentNativeLayer.js';
|
|
|
2
2
|
import { refreshNativeLayer } from '../native/refreshNativeLayer.js';
|
|
3
3
|
|
|
4
4
|
export async function uploadCanvasTexture(state, key, texture, image, device, width, height) {
|
|
5
|
-
let bitmap;
|
|
5
|
+
let bitmap, source = image;
|
|
6
6
|
try {
|
|
7
|
-
|
|
7
|
+
if (image instanceof HTMLImageElement) {
|
|
8
|
+
const canvas = document.createElement('canvas');
|
|
9
|
+
canvas.width = width;
|
|
10
|
+
canvas.height = height;
|
|
11
|
+
const context = canvas.getContext('2d');
|
|
12
|
+
if (!context) throw /* alloc */ new Error('Unable to rasterize SVG image');
|
|
13
|
+
context.drawImage(image, 0, 0, width, height);
|
|
14
|
+
source = canvas;
|
|
15
|
+
}
|
|
16
|
+
bitmap = await createImageBitmap(source);
|
|
8
17
|
if (!current(state) || state.textures.get(key) !== texture) return;
|
|
9
18
|
device.queue.copyExternalImageToTexture(
|
|
10
19
|
/* alloc */ { source: bitmap },
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export function appendQuotedStyleCharacter(char, state) {
|
|
2
|
+
if (state.quoted) {
|
|
3
|
+
if (state.escaped) {
|
|
4
|
+
state.escaped = false;
|
|
5
|
+
return char === "'" ? char : '\\' + char;
|
|
6
|
+
}
|
|
7
|
+
if (char === '\\') {
|
|
8
|
+
state.escaped = true;
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
if (char === state.quoted) {
|
|
12
|
+
state.quoted = '';
|
|
13
|
+
return '"';
|
|
14
|
+
}
|
|
15
|
+
return char === '"' ? '\\"' : char;
|
|
16
|
+
}
|
|
17
|
+
if (char === '"' || char === "'") {
|
|
18
|
+
state.quoted = char;
|
|
19
|
+
return '"';
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { evaluateStyle } from './evaluateStyle.js';
|
|
2
|
+
|
|
3
|
+
export function evaluateBoolean(op, args, properties, zoom, legacy) {
|
|
4
|
+
let i = 0;
|
|
5
|
+
if (op === 'all') {
|
|
6
|
+
for (i = 0; i < args.length; i++) {
|
|
7
|
+
if (!evaluateStyle(args[i], properties, zoom, legacy)) return false;
|
|
8
|
+
}
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
if (op === 'any') {
|
|
12
|
+
for (i = 0; i < args.length; i++) {
|
|
13
|
+
if (evaluateStyle(args[i], properties, zoom, legacy)) return true;
|
|
14
|
+
}
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
throw /* alloc */ new Error(`Unsupported vector style expression: ${op}`);
|
|
18
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { evaluateStyle } from './evaluateStyle.js';
|
|
2
|
+
|
|
3
|
+
export function evaluateCoalesceOrCase(op, args, properties, zoom, legacy) {
|
|
4
|
+
let i = 0, result = null;
|
|
5
|
+
if (op === 'coalesce') {
|
|
6
|
+
for (i = 0; i < args.length; i++) {
|
|
7
|
+
result = evaluateStyle(args[i], properties, zoom);
|
|
8
|
+
if (result !== null && result !== undefined) return result;
|
|
9
|
+
}
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
if (op === 'case') {
|
|
13
|
+
for (i = 0; i < args.length - 1; i += 2) {
|
|
14
|
+
if (evaluateStyle(args[i], properties, zoom)) {
|
|
15
|
+
return evaluateStyle(args[i + 1], properties, zoom);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return evaluateStyle(args[args.length - 1], properties, zoom);
|
|
19
|
+
}
|
|
20
|
+
throw /* alloc */ new Error(`Unsupported vector style expression: ${op}`);
|
|
21
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { evaluateInput } from './evaluateInput.js';
|
|
2
|
+
import { evaluateStyle } from './evaluateStyle.js';
|
|
3
|
+
|
|
4
|
+
export function evaluateComparison(op, args, properties, zoom, legacy) {
|
|
5
|
+
const left = evaluateInput(args[0], properties, zoom, legacy);
|
|
6
|
+
const right = evaluateStyle(args[1], properties, zoom);
|
|
7
|
+
switch (op) {
|
|
8
|
+
case '==': return left === right;
|
|
9
|
+
case '!=': return left !== right;
|
|
10
|
+
case '<=': return left <= right;
|
|
11
|
+
case '>=': return left >= right;
|
|
12
|
+
case '<': return left < right;
|
|
13
|
+
case '>': return left > right;
|
|
14
|
+
default: throw /* alloc */ new Error(`Unsupported vector style expression: ${op}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { evaluateInterpolate } from './evaluateInterpolate.js';
|
|
2
|
+
import { evaluateMembership } from './evaluateMembership.js';
|
|
3
|
+
|
|
4
|
+
export function evaluateIExpression(op, args, properties, zoom, legacy) {
|
|
5
|
+
if (op === 'in') return evaluateMembership(op, args, properties, zoom, legacy);
|
|
6
|
+
if (op === 'interpolate') return evaluateInterpolate(args, properties, zoom);
|
|
7
|
+
throw /* alloc */ new Error(`Unsupported vector style expression: ${op}`);
|
|
8
|
+
}
|