@mapwhit/tilerenderer 0.52.1 → 1.1.0
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 +7 -0
- package/build/min/package.json +2 -1
- package/build/min/src/shaders/_prelude.fragment.glsl.js +2 -2
- package/build/min/src/shaders/_prelude.vertex.glsl.js +2 -2
- package/build/min/src/shaders/background.fragment.glsl.js +2 -2
- package/build/min/src/shaders/background.vertex.glsl.js +1 -1
- package/build/min/src/shaders/background_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/background_pattern.vertex.glsl.js +1 -1
- package/build/min/src/shaders/circle.fragment.glsl.js +2 -2
- package/build/min/src/shaders/circle.vertex.glsl.js +2 -2
- package/build/min/src/shaders/clipping_mask.fragment.glsl.js +1 -1
- package/build/min/src/shaders/clipping_mask.vertex.glsl.js +1 -1
- package/build/min/src/shaders/collision_box.fragment.glsl.js +1 -1
- package/build/min/src/shaders/collision_box.vertex.glsl.js +1 -1
- package/build/min/src/shaders/collision_circle.fragment.glsl.js +1 -1
- package/build/min/src/shaders/collision_circle.vertex.glsl.js +1 -1
- package/build/min/src/shaders/debug.fragment.glsl.js +1 -1
- package/build/min/src/shaders/debug.vertex.glsl.js +1 -1
- package/build/min/src/shaders/fill.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/fill_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/fill_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/heatmap.fragment.glsl.js +2 -2
- package/build/min/src/shaders/heatmap.vertex.glsl.js +2 -2
- package/build/min/src/shaders/heatmap_texture.fragment.glsl.js +2 -2
- package/build/min/src/shaders/heatmap_texture.vertex.glsl.js +1 -1
- package/build/min/src/shaders/hillshade.fragment.glsl.js +2 -2
- package/build/min/src/shaders/hillshade.vertex.glsl.js +1 -1
- package/build/min/src/shaders/hillshade_prepare.fragment.glsl.js +2 -2
- package/build/min/src/shaders/hillshade_prepare.vertex.glsl.js +1 -1
- package/build/min/src/shaders/line.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line.vertex.glsl.js +2 -2
- package/build/min/src/shaders/line_gradient.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line_gradient.vertex.glsl.js +2 -2
- package/build/min/src/shaders/line_pattern.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line_pattern.vertex.glsl.js +2 -2
- package/build/min/src/shaders/line_sdf.fragment.glsl.js +2 -2
- package/build/min/src/shaders/line_sdf.vertex.glsl.js +2 -2
- package/build/min/src/shaders/raster.fragment.glsl.js +2 -2
- package/build/min/src/shaders/raster.vertex.glsl.js +1 -1
- package/build/min/src/shaders/symbol_icon.fragment.glsl.js +2 -2
- package/build/min/src/shaders/symbol_icon.vertex.glsl.js +2 -2
- package/build/min/src/shaders/symbol_sdf.fragment.glsl.js +2 -2
- package/build/min/src/shaders/symbol_sdf.vertex.glsl.js +2 -2
- package/package.json +5 -4
- package/src/data/array_types.js +55 -117
- package/src/data/bucket/circle_attributes.js +2 -4
- package/src/data/bucket/circle_bucket.js +19 -16
- package/src/data/bucket/fill_attributes.js +2 -4
- package/src/data/bucket/fill_bucket.js +38 -27
- package/src/data/bucket/fill_extrusion_attributes.js +2 -4
- package/src/data/bucket/fill_extrusion_bucket.js +56 -37
- package/src/data/bucket/heatmap_bucket.js +2 -11
- package/src/data/bucket/line_attributes.js +2 -4
- package/src/data/bucket/line_bucket.js +208 -163
- package/src/data/bucket/pattern_attributes.js +2 -4
- package/src/data/bucket/pattern_bucket_features.js +7 -9
- package/src/data/bucket/symbol_attributes.js +12 -26
- package/src/data/bucket/symbol_bucket.js +174 -323
- package/src/data/bucket/symbol_buffers.js +62 -0
- package/src/data/bucket/symbol_collision_buffers.js +33 -0
- package/src/data/bucket.js +26 -25
- package/src/data/dem_data.js +11 -10
- package/src/data/extent.js +1 -1
- package/src/data/feature_index.js +38 -28
- package/src/data/index_array_type.js +1 -6
- package/src/data/load_geometry.js +6 -9
- package/src/data/pos_attributes.js +2 -3
- package/src/data/program_configuration.js +47 -38
- package/src/data/raster_bounds_attributes.js +2 -2
- package/src/data/segment.js +4 -7
- package/src/geo/coordinate.js +1 -1
- package/src/geo/lng_lat.js +3 -3
- package/src/geo/lng_lat_bounds.js +8 -4
- package/src/geo/transform.js +69 -30
- package/src/gl/color_mode.js +2 -2
- package/src/gl/context.js +28 -29
- package/src/gl/cull_face_mode.js +1 -1
- package/src/gl/depth_mode.js +1 -1
- package/src/gl/framebuffer.js +8 -4
- package/src/gl/index_buffer.js +2 -2
- package/src/gl/stencil_mode.js +1 -1
- package/src/gl/value.js +33 -68
- package/src/gl/vertex_buffer.js +2 -2
- package/src/index.js +49 -25
- package/src/render/draw_background.js +17 -12
- package/src/render/draw_circle.js +15 -12
- package/src/render/draw_collision_debug.js +11 -8
- package/src/render/draw_debug.js +16 -14
- package/src/render/draw_fill.js +27 -20
- package/src/render/draw_fill_extrusion.js +20 -17
- package/src/render/draw_heatmap.js +21 -16
- package/src/render/draw_hillshade.js +12 -9
- package/src/render/draw_line.js +36 -22
- package/src/render/draw_raster.js +22 -18
- package/src/render/draw_symbol.js +38 -33
- package/src/render/glyph_atlas.js +9 -8
- package/src/render/glyph_manager.js +2 -3
- package/src/render/image_atlas.js +4 -11
- package/src/render/image_manager.js +39 -28
- package/src/render/line_atlas.js +2 -2
- package/src/render/painter.js +78 -61
- package/src/render/program/background_program.js +6 -13
- package/src/render/program/circle_program.js +8 -10
- package/src/render/program/clipping_mask_program.js +3 -5
- package/src/render/program/collision_program.js +4 -6
- package/src/render/program/debug_program.js +3 -5
- package/src/render/program/fill_extrusion_program.js +9 -15
- package/src/render/program/fill_program.js +10 -21
- package/src/render/program/heatmap_program.js +9 -15
- package/src/render/program/hillshade_program.js +16 -22
- package/src/render/program/line_program.js +14 -25
- package/src/render/program/pattern.js +5 -7
- package/src/render/program/program_uniforms.js +13 -20
- package/src/render/program/raster_program.js +9 -11
- package/src/render/program/symbol_program.js +5 -7
- package/src/render/program.js +5 -6
- package/src/render/texture.js +1 -1
- package/src/render/tile_mask.js +6 -4
- package/src/render/uniform_binding.js +9 -20
- package/src/render/vertex_array_object.js +5 -3
- package/src/shaders/encode_attribute.js +2 -6
- package/src/shaders/index.js +103 -51
- package/src/source/geojson_source.js +25 -30
- package/src/source/geojson_worker_source.js +46 -74
- package/src/source/geojson_wrapper.js +13 -5
- package/src/source/image_source.js +17 -28
- package/src/source/load_tilejson.js +3 -3
- package/src/source/pixels_to_tile_units.js +3 -3
- package/src/source/query_features.js +17 -15
- package/src/source/raster_dem_tile_source.js +54 -71
- package/src/source/raster_tile_source.js +14 -15
- package/src/source/resources/glyphs.js +4 -5
- package/src/source/resources/index.js +4 -12
- package/src/source/rtl_text_plugin.js +62 -35
- package/src/source/source.js +14 -22
- package/src/source/source_cache.js +221 -179
- package/src/source/source_state.js +125 -13
- package/src/source/tile.js +67 -66
- package/src/source/tile_bounds.js +36 -29
- package/src/source/tile_cache.js +2 -2
- package/src/source/tile_id.js +30 -26
- package/src/source/vector_tile_source.js +23 -21
- package/src/source/vector_tile_worker_source.js +22 -26
- package/src/source/worker_tile.js +139 -134
- package/src/style/create_style_layer.js +11 -11
- package/src/style/evaluation_parameters.js +4 -6
- package/src/style/light.js +5 -5
- package/src/style/load_sprite.js +6 -6
- package/src/style/parse_glyph_pbf.js +21 -17
- package/src/style/pauseable_placement.js +7 -9
- package/src/style/properties.js +21 -51
- package/src/style/query_utils.js +7 -13
- package/src/style/style.js +314 -221
- package/src/style/style_layer/background_style_layer.js +3 -4
- package/src/style/style_layer/background_style_layer_properties.js +2 -2
- package/src/style/style_layer/circle_style_layer.js +25 -20
- package/src/style/style_layer/circle_style_layer_properties.js +2 -2
- package/src/style/style_layer/fill_extrusion_style_layer.js +55 -37
- package/src/style/style_layer/fill_extrusion_style_layer_properties.js +2 -2
- package/src/style/style_layer/fill_style_layer.js +11 -12
- package/src/style/style_layer/fill_style_layer_properties.js +2 -2
- package/src/style/style_layer/heatmap_style_layer.js +6 -7
- package/src/style/style_layer/heatmap_style_layer_properties.js +2 -2
- package/src/style/style_layer/hillshade_style_layer.js +4 -5
- package/src/style/style_layer/hillshade_style_layer_properties.js +2 -2
- package/src/style/style_layer/line_style_layer.js +33 -30
- package/src/style/style_layer/line_style_layer_properties.js +5 -5
- package/src/style/style_layer/raster_style_layer.js +3 -4
- package/src/style/style_layer/raster_style_layer_properties.js +2 -2
- package/src/style/style_layer/symbol_style_layer.js +20 -21
- package/src/style/style_layer/symbol_style_layer_properties.js +2 -2
- package/src/style/style_layer.js +66 -47
- package/src/style/style_layer_index.js +17 -42
- package/src/style/zoom_history.js +1 -1
- package/src/style-spec/error/parsing_error.js +1 -1
- package/src/style-spec/error/validation_error.js +5 -3
- package/src/style-spec/feature_filter/convert.js +17 -9
- package/src/style-spec/feature_filter/index.js +13 -9
- package/src/style-spec/util/eval_support.js +2 -2
- package/src/style-spec/util/ref_properties.js +1 -1
- package/src/symbol/anchor.js +2 -6
- package/src/symbol/check_max_angle.js +13 -5
- package/src/symbol/clip_line.js +2 -3
- package/src/symbol/collision_feature.js +8 -4
- package/src/symbol/collision_index.js +5 -7
- package/src/symbol/cross_tile_symbol_index.js +7 -10
- package/src/symbol/get_anchors.js +15 -8
- package/src/symbol/grid_index.js +5 -3
- package/src/symbol/mergelines.js +2 -2
- package/src/symbol/opacity_state.js +1 -5
- package/src/symbol/placement.js +28 -23
- package/src/symbol/projection.js +29 -28
- package/src/symbol/quads.js +14 -16
- package/src/symbol/shaping.js +27 -19
- package/src/symbol/symbol_layout.js +24 -28
- package/src/symbol/symbol_size.js +13 -12
- package/src/symbol/transform_text.js +4 -4
- package/src/ui/camera.js +34 -18
- package/src/ui/map.js +102 -44
- package/src/util/async.js +11 -5
- package/src/util/browser.js +1 -1
- package/src/util/callback.js +3 -9
- package/src/util/classify_rings.js +13 -8
- package/src/util/color_ramp.js +3 -3
- package/src/util/config.js +4 -4
- package/src/util/dictionary_coder.js +2 -3
- package/src/util/dom.js +7 -3
- package/src/util/find_pole_of_inaccessibility.js +29 -14
- package/src/util/group_layers.js +41 -0
- package/src/util/image.js +3 -13
- package/src/util/interpolate.js +1 -1
- package/src/util/intersection_tests.js +80 -42
- package/src/util/is_char_in_unicode_block.js +1 -1
- package/src/util/key.js +25 -0
- package/src/util/loader/image.js +1 -1
- package/src/util/object.js +33 -76
- package/src/util/script_detection.js +212 -91
- package/src/util/struct_array.js +8 -40
- package/src/util/task_queue.js +11 -7
- package/src/util/throttle.js +2 -2
- package/src/util/tile_cover.js +8 -5
- package/src/util/token.js +1 -1
- package/src/util/unique_id.js +2 -2
- package/src/util/util.js +21 -29
- package/src/util/vectortile_to_geojson.js +4 -2
- package/src/util/verticalize_punctuation.js +3 -7
- package/src/util/warn.js +4 -4
- package/src/util/web_worker.js +3 -3
- package/src/worker.js +1 -4
- package/src/source/resources/images.js +0 -68
- package/src/source/worker.js +0 -110
- package/src/source/worker_source.js +0 -14
- package/src/style-spec/deref.js +0 -51
- package/src/style-spec/group_by_layout.js +0 -46
- package/src/util/actor.js +0 -108
- package/src/util/dispatcher.js +0 -65
- package/src/util/global_worker_pool.js +0 -15
- package/src/util/transfer_registry.js +0 -168
- package/src/util/web_worker_transfer.js +0 -43
- package/src/util/worker_pool.js +0 -41
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// register feature index for worker transfer
|
|
8
|
-
require('../data/feature_index');
|
|
1
|
+
import { ErrorEvent, Event, Evented } from '@mapwhit/events';
|
|
2
|
+
import browser from '../util/browser.js';
|
|
3
|
+
import { pick } from '../util/object.js';
|
|
4
|
+
import loadTileJSON from './load_tilejson.js';
|
|
5
|
+
import TileBounds from './tile_bounds.js';
|
|
6
|
+
import VectorTileWorkerSource from './vector_tile_worker_source.js';
|
|
9
7
|
|
|
10
8
|
class VectorTileSource extends Evented {
|
|
11
|
-
|
|
9
|
+
#worker;
|
|
10
|
+
|
|
11
|
+
constructor(id, options, eventedParent, { resources, layerIndex, showTileBoundaries }) {
|
|
12
12
|
super();
|
|
13
13
|
this.id = id;
|
|
14
|
-
this.dispatcher = dispatcher;
|
|
15
14
|
|
|
16
15
|
this.type = 'vector';
|
|
17
16
|
this.minzoom = 0;
|
|
@@ -20,6 +19,7 @@ class VectorTileSource extends Evented {
|
|
|
20
19
|
this.tileSize = 512;
|
|
21
20
|
this.reparseOverscaled = true;
|
|
22
21
|
this.isTileClipped = true;
|
|
22
|
+
this._showTileBoundaries = showTileBoundaries;
|
|
23
23
|
|
|
24
24
|
Object.assign(this, pick(options, ['url', 'scheme', 'tileSize']));
|
|
25
25
|
this._options = Object.assign({ type: 'vector' }, options);
|
|
@@ -29,6 +29,7 @@ class VectorTileSource extends Evented {
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
this.setEventedParent(eventedParent);
|
|
32
|
+
this.#worker = new VectorTileWorkerSource(resources, layerIndex);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
async load() {
|
|
@@ -37,7 +38,9 @@ class VectorTileSource extends Evented {
|
|
|
37
38
|
try {
|
|
38
39
|
const tileJSON = await loadTileJSON(this._options);
|
|
39
40
|
Object.assign(this, tileJSON);
|
|
40
|
-
if (tileJSON.bounds)
|
|
41
|
+
if (tileJSON.bounds) {
|
|
42
|
+
this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
|
|
43
|
+
}
|
|
41
44
|
|
|
42
45
|
// `content` is included here to prevent a race condition where `Style#_updateSources` is called
|
|
43
46
|
// before the TileJSON arrives. this makes sure the tiles needed are loaded once TileJSON arrives
|
|
@@ -58,10 +61,6 @@ class VectorTileSource extends Evented {
|
|
|
58
61
|
this.load();
|
|
59
62
|
}
|
|
60
63
|
|
|
61
|
-
serialize() {
|
|
62
|
-
return Object.assign({}, this._options);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
64
|
async loadTile(tile) {
|
|
66
65
|
if (tile.workerID != null && tile.state === 'loading') {
|
|
67
66
|
tile.reloadPromise ??= Promise.withResolvers();
|
|
@@ -86,7 +85,7 @@ class VectorTileSource extends Evented {
|
|
|
86
85
|
throw err;
|
|
87
86
|
}
|
|
88
87
|
const params = {
|
|
89
|
-
response: { data: rawData
|
|
88
|
+
response: { data: rawData },
|
|
90
89
|
uid: tile.uid,
|
|
91
90
|
tileID: tile.tileID,
|
|
92
91
|
zoom: tile.tileID.overscaledZ,
|
|
@@ -95,11 +94,14 @@ class VectorTileSource extends Evented {
|
|
|
95
94
|
source: this.id,
|
|
96
95
|
pixelRatio: browser.devicePixelRatio,
|
|
97
96
|
showCollisionBoxes: this.map.showCollisionBoxes,
|
|
98
|
-
globalState: this.map.getGlobalState()
|
|
97
|
+
globalState: this.map.getGlobalState(),
|
|
98
|
+
painter: this.map.painter
|
|
99
99
|
};
|
|
100
|
-
tile.workerID ??=
|
|
101
|
-
const data = await this.
|
|
102
|
-
|
|
100
|
+
tile.workerID ??= true;
|
|
101
|
+
const data = await this.#worker.loadTile(params);
|
|
102
|
+
if (this._showTileBoundaries) {
|
|
103
|
+
data.rawTileData = rawData;
|
|
104
|
+
}
|
|
103
105
|
tile.loadVectorData(data, this.map.painter);
|
|
104
106
|
} catch (err) {
|
|
105
107
|
if (tile.aborted) {
|
|
@@ -125,4 +127,4 @@ class VectorTileSource extends Evented {
|
|
|
125
127
|
}
|
|
126
128
|
}
|
|
127
129
|
|
|
128
|
-
|
|
130
|
+
export default VectorTileSource;
|
|
@@ -1,19 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
function loadVectorTile(params) {
|
|
6
|
-
if (!params.response) {
|
|
7
|
-
throw new Error('no tile data');
|
|
8
|
-
}
|
|
9
|
-
const { data } = params.response;
|
|
10
|
-
if (!data) {
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
return {
|
|
14
|
-
vectorTile: new VectorTile(new Protobuf(data))
|
|
15
|
-
};
|
|
16
|
-
}
|
|
1
|
+
import Protobuf from '@mapwhit/pbf';
|
|
2
|
+
import { VectorTile } from '@mapwhit/vector-tile';
|
|
3
|
+
import makeWorkerTile from './worker_tile.js';
|
|
17
4
|
|
|
18
5
|
/**
|
|
19
6
|
* The {@link WorkerSource} implementation that supports {@link VectorTileSource}.
|
|
@@ -31,10 +18,22 @@ class VectorTileWorkerSource {
|
|
|
31
18
|
* {@link VectorTileWorkerSource#loadTile}. The default implementation simply
|
|
32
19
|
* loads the pbf at `params.url`.
|
|
33
20
|
*/
|
|
34
|
-
constructor(resources, layerIndex
|
|
21
|
+
constructor(resources, layerIndex) {
|
|
35
22
|
this.resources = resources;
|
|
36
23
|
this.layerIndex = layerIndex;
|
|
37
|
-
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
loadVectorData(params) {
|
|
27
|
+
if (!params.response) {
|
|
28
|
+
throw new Error('no tile data');
|
|
29
|
+
}
|
|
30
|
+
const { data } = params.response;
|
|
31
|
+
if (!data) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
vectorTile: new VectorTile(new Protobuf(data))
|
|
36
|
+
};
|
|
38
37
|
}
|
|
39
38
|
|
|
40
39
|
/**
|
|
@@ -47,16 +46,13 @@ class VectorTileWorkerSource {
|
|
|
47
46
|
if (!response) {
|
|
48
47
|
return;
|
|
49
48
|
}
|
|
50
|
-
const { vectorTile
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const result = await workerTile.parse(vectorTile, this.layerIndex, this.resources);
|
|
55
|
-
if (rawData) {
|
|
56
|
-
result.rawTileData = rawData;
|
|
49
|
+
const { vectorTile } = response;
|
|
50
|
+
const result = await makeWorkerTile(params, vectorTile, this.layerIndex, this.resources);
|
|
51
|
+
if (vectorTile) {
|
|
52
|
+
result.vectorTile = vectorTile;
|
|
57
53
|
}
|
|
58
54
|
return result;
|
|
59
55
|
}
|
|
60
56
|
}
|
|
61
57
|
|
|
62
|
-
|
|
58
|
+
export default VectorTileWorkerSource;
|
|
@@ -1,148 +1,155 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const featureIndex = new FeatureIndex(this.tileID);
|
|
45
|
-
featureIndex.bucketLayerIDs = [];
|
|
1
|
+
import { CollisionBoxArray } from '../data/array_types.js';
|
|
2
|
+
import FillBucket from '../data/bucket/fill_bucket.js';
|
|
3
|
+
import FillExtrusionBucket from '../data/bucket/fill_extrusion_bucket.js';
|
|
4
|
+
import LineBucket from '../data/bucket/line_bucket.js';
|
|
5
|
+
import SymbolBucket from '../data/bucket/symbol_bucket.js';
|
|
6
|
+
import FeatureIndex from '../data/feature_index.js';
|
|
7
|
+
import GlyphAtlas from '../render/glyph_atlas.js';
|
|
8
|
+
import ImageAtlas from '../render/image_atlas.js';
|
|
9
|
+
import EvaluationParameters from '../style/evaluation_parameters.js';
|
|
10
|
+
import { performSymbolLayout } from '../symbol/symbol_layout.js';
|
|
11
|
+
import dictionaryCoder from '../util/dictionary_coder.js';
|
|
12
|
+
import { mapObject } from '../util/object.js';
|
|
13
|
+
import { OverscaledTileID } from './tile_id.js';
|
|
14
|
+
export default makeWorkerTile;
|
|
15
|
+
|
|
16
|
+
async function makeWorkerTile(params, vectorTile, layerIndex, resources) {
|
|
17
|
+
const tileID = createTileID(params);
|
|
18
|
+
|
|
19
|
+
const overscaling = tileID.overscaleFactor();
|
|
20
|
+
const { zoom, pixelRatio, source, showCollisionBoxes, globalState, justReloaded, painter } = params;
|
|
21
|
+
|
|
22
|
+
const collisionBoxArray = new CollisionBoxArray();
|
|
23
|
+
const sourceLayerCoder = dictionaryCoder(Object.keys(vectorTile.layers));
|
|
24
|
+
|
|
25
|
+
const featureIndex = new FeatureIndex(tileID);
|
|
26
|
+
featureIndex.bucketLayerIDs = [];
|
|
27
|
+
|
|
28
|
+
const uniqueBuckets = new Map();
|
|
29
|
+
|
|
30
|
+
const options = {
|
|
31
|
+
featureIndex,
|
|
32
|
+
iconDependencies: {},
|
|
33
|
+
patternDependencies: {},
|
|
34
|
+
glyphDependencies: {}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const layerFamilies = layerIndex.familiesBySource.get(source) ?? new Map();
|
|
38
|
+
for (const [sourceLayerId, sourceLayerFamilies] of layerFamilies) {
|
|
39
|
+
const sourceLayer = vectorTile.layers[sourceLayerId];
|
|
40
|
+
if (!sourceLayer) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
46
43
|
|
|
47
|
-
const
|
|
44
|
+
const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);
|
|
45
|
+
const features = new Array(sourceLayer.length);
|
|
46
|
+
for (let index = 0; index < sourceLayer.length; index++) {
|
|
47
|
+
features[index] = { feature: sourceLayer.feature(index), index, sourceLayerIndex };
|
|
48
|
+
}
|
|
48
49
|
|
|
49
|
-
const
|
|
50
|
-
|
|
51
|
-
iconDependencies: {},
|
|
52
|
-
patternDependencies: {},
|
|
53
|
-
glyphDependencies: {}
|
|
54
|
-
};
|
|
50
|
+
for (const layers of sourceLayerFamilies.values()) {
|
|
51
|
+
const layer = layers[0];
|
|
55
52
|
|
|
56
|
-
|
|
57
|
-
for (const sourceLayerId in layerFamilies) {
|
|
58
|
-
const sourceLayer = data.layers[sourceLayerId];
|
|
59
|
-
if (!sourceLayer) {
|
|
53
|
+
if (layer.minzoom && zoom < Math.floor(layer.minzoom)) {
|
|
60
54
|
continue;
|
|
61
55
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
warn.once(
|
|
65
|
-
`Vector tile source "${this.source}" layer "${sourceLayerId}" ` +
|
|
66
|
-
'does not use vector tile spec v2 and therefore may have some rendering errors.'
|
|
67
|
-
);
|
|
56
|
+
if (layer.maxzoom && zoom >= layer.maxzoom) {
|
|
57
|
+
continue;
|
|
68
58
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
const features = [];
|
|
72
|
-
for (let index = 0; index < sourceLayer.length; index++) {
|
|
73
|
-
const feature = sourceLayer.feature(index);
|
|
74
|
-
features.push({ feature, index, sourceLayerIndex });
|
|
59
|
+
if (layer.visibility === 'none') {
|
|
60
|
+
continue;
|
|
75
61
|
}
|
|
76
62
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
collisionBoxArray: this.collisionBoxArray,
|
|
94
|
-
sourceLayerIndex: sourceLayerIndex,
|
|
95
|
-
sourceID: this.source,
|
|
96
|
-
globalState: this.globalState
|
|
97
|
-
}));
|
|
98
|
-
|
|
99
|
-
bucket.populate(features, options);
|
|
100
|
-
featureIndex.bucketLayerIDs.push(family.map(l => l.id));
|
|
101
|
-
}
|
|
63
|
+
recalculateLayers(layers, zoom, globalState);
|
|
64
|
+
|
|
65
|
+
const bucket = layer.createBucket({
|
|
66
|
+
index: featureIndex.bucketLayerIDs.length,
|
|
67
|
+
layers,
|
|
68
|
+
zoom,
|
|
69
|
+
pixelRatio,
|
|
70
|
+
overscaling,
|
|
71
|
+
collisionBoxArray,
|
|
72
|
+
sourceLayerIndex,
|
|
73
|
+
sourceID: source,
|
|
74
|
+
globalState
|
|
75
|
+
});
|
|
76
|
+
uniqueBuckets.set(layer.id, bucket);
|
|
77
|
+
bucket.populate(features, options);
|
|
78
|
+
featureIndex.bucketLayerIDs.push(layers.map(l => l.id));
|
|
102
79
|
}
|
|
80
|
+
}
|
|
103
81
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
glyphMap,
|
|
123
|
-
glyphAtlas.positions,
|
|
124
|
-
iconMap,
|
|
125
|
-
imageAtlas.iconPositions,
|
|
126
|
-
this.showCollisionBoxes
|
|
127
|
-
);
|
|
128
|
-
} else if (
|
|
129
|
-
bucket.hasPattern &&
|
|
130
|
-
(bucket instanceof LineBucket || bucket instanceof FillBucket || bucket instanceof FillExtrusionBucket)
|
|
131
|
-
) {
|
|
132
|
-
recalculateLayers(bucket.layers, this.zoom, this.globalState);
|
|
133
|
-
bucket.addFeatures(options, imageAtlas.patternPositions);
|
|
82
|
+
const buckets = new Map();
|
|
83
|
+
const { glyphAtlas, imageAtlas, glyphMap, iconMap } = await makeAtlasses(options, resources);
|
|
84
|
+
let hasSymbolBuckets = false;
|
|
85
|
+
let queryPadding = 0;
|
|
86
|
+
for (const bucket of uniqueBuckets.values()) {
|
|
87
|
+
if (bucket instanceof SymbolBucket) {
|
|
88
|
+
hasSymbolBuckets = true;
|
|
89
|
+
recalculateLayers(bucket.layers, zoom, globalState);
|
|
90
|
+
performSymbolLayout(
|
|
91
|
+
bucket,
|
|
92
|
+
glyphMap,
|
|
93
|
+
glyphAtlas.positions,
|
|
94
|
+
iconMap,
|
|
95
|
+
imageAtlas.iconPositions,
|
|
96
|
+
showCollisionBoxes
|
|
97
|
+
);
|
|
98
|
+
if (justReloaded) {
|
|
99
|
+
bucket.justReloaded = true;
|
|
134
100
|
}
|
|
101
|
+
} else if (
|
|
102
|
+
bucket.hasPattern &&
|
|
103
|
+
(bucket instanceof LineBucket || bucket instanceof FillBucket || bucket instanceof FillExtrusionBucket)
|
|
104
|
+
) {
|
|
105
|
+
recalculateLayers(bucket.layers, zoom, globalState);
|
|
106
|
+
bucket.addFeatures(options, imageAtlas.patternPositions);
|
|
107
|
+
}
|
|
108
|
+
if (bucket.isEmpty()) {
|
|
109
|
+
continue; // Skip empty buckets
|
|
110
|
+
}
|
|
111
|
+
bucket.stateDependentLayers = [];
|
|
112
|
+
for (const layer of bucket.layers) {
|
|
113
|
+
if (painter?.style) {
|
|
114
|
+
queryPadding = Math.max(queryPadding, painter.style.getLayer(layer.id).queryRadius(bucket));
|
|
115
|
+
}
|
|
116
|
+
if (layer.isStateDependent()) {
|
|
117
|
+
bucket.stateDependentLayers.push(layer);
|
|
118
|
+
}
|
|
119
|
+
buckets.set(layer.id, bucket);
|
|
135
120
|
}
|
|
136
|
-
|
|
137
|
-
this.status = 'done';
|
|
138
|
-
return {
|
|
139
|
-
buckets: values(buckets).filter(b => !b.isEmpty()),
|
|
140
|
-
featureIndex,
|
|
141
|
-
collisionBoxArray: this.collisionBoxArray,
|
|
142
|
-
glyphAtlasImage: glyphAtlas.image,
|
|
143
|
-
imageAtlas
|
|
144
|
-
};
|
|
145
121
|
}
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
buckets,
|
|
125
|
+
featureIndex,
|
|
126
|
+
collisionBoxArray,
|
|
127
|
+
glyphAtlasImage: glyphAtlas.image,
|
|
128
|
+
imageAtlas,
|
|
129
|
+
hasSymbolBuckets,
|
|
130
|
+
queryPadding
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function makeAtlasses({ glyphDependencies, patternDependencies, iconDependencies }, resources) {
|
|
135
|
+
const stacks = mapObject(glyphDependencies, glyphs => Object.keys(glyphs).map(Number));
|
|
136
|
+
const icons = Object.keys(iconDependencies);
|
|
137
|
+
const patterns = Object.keys(patternDependencies);
|
|
138
|
+
const tasks = [
|
|
139
|
+
Object.keys(stacks).length ? resources.getGlyphs({ stacks }) : {},
|
|
140
|
+
icons.length ? resources.getImages({ icons }) : {},
|
|
141
|
+
patterns.length ? resources.getImages({ icons: patterns }) : {}
|
|
142
|
+
];
|
|
143
|
+
const [glyphMap, iconMap, patternMap] = await Promise.all(tasks);
|
|
144
|
+
const glyphAtlas = new GlyphAtlas(glyphMap);
|
|
145
|
+
const imageAtlas = new ImageAtlas(iconMap, patternMap);
|
|
146
|
+
return { glyphAtlas, imageAtlas, glyphMap, iconMap };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function createTileID({ tileID }) {
|
|
150
|
+
const { overscaledZ, wrap, canonical } = tileID;
|
|
151
|
+
const { x, y, z } = canonical;
|
|
152
|
+
return new OverscaledTileID(overscaledZ, wrap, z, x, y);
|
|
146
153
|
}
|
|
147
154
|
|
|
148
155
|
function recalculateLayers(layers, zoom, globalState) {
|
|
@@ -152,5 +159,3 @@ function recalculateLayers(layers, zoom, globalState) {
|
|
|
152
159
|
layer.recalculate(parameters);
|
|
153
160
|
}
|
|
154
161
|
}
|
|
155
|
-
|
|
156
|
-
module.exports = WorkerTile;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
import background from './style_layer/background_style_layer.js';
|
|
2
|
+
import circle from './style_layer/circle_style_layer.js';
|
|
3
|
+
import { FillExtrusionStyleLayer as fillExtrusion } from './style_layer/fill_extrusion_style_layer.js';
|
|
4
|
+
import fill from './style_layer/fill_style_layer.js';
|
|
5
|
+
import heatmap from './style_layer/heatmap_style_layer.js';
|
|
6
|
+
import hillshade from './style_layer/hillshade_style_layer.js';
|
|
7
|
+
import line from './style_layer/line_style_layer.js';
|
|
8
|
+
import raster from './style_layer/raster_style_layer.js';
|
|
9
|
+
import symbol from './style_layer/symbol_style_layer.js';
|
|
10
10
|
|
|
11
11
|
const subclasses = {
|
|
12
12
|
circle,
|
|
@@ -20,6 +20,6 @@ const subclasses = {
|
|
|
20
20
|
raster
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
export default function createStyleLayer(layer) {
|
|
24
24
|
return new subclasses[layer.type](layer);
|
|
25
|
-
}
|
|
25
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { plugin as rtlTextPlugin } from '../source/rtl_text_plugin.js';
|
|
2
|
+
import { isStringInSupportedScript } from '../util/script_detection.js';
|
|
3
|
+
import ZoomHistory from './zoom_history.js';
|
|
4
4
|
|
|
5
|
-
class EvaluationParameters {
|
|
5
|
+
export default class EvaluationParameters {
|
|
6
6
|
// "options" may also be another EvaluationParameters to copy, see CrossFadedProperty.possiblyEvaluate
|
|
7
7
|
constructor(zoom, options) {
|
|
8
8
|
this.zoom = zoom;
|
|
@@ -43,5 +43,3 @@ class EvaluationParameters {
|
|
|
43
43
|
: { fromScale: 0.5, toScale: 1, t: 1 - (1 - t) * fraction };
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
|
|
47
|
-
module.exports = EvaluationParameters;
|
package/src/style/light.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { Evented } from '@mapwhit/events';
|
|
2
|
+
import interpolate from '../util/interpolate.js';
|
|
3
|
+
import { sphericalToCartesian } from '../util/util.js';
|
|
4
4
|
|
|
5
5
|
const lightSpec = {
|
|
6
6
|
anchor: {
|
|
@@ -40,7 +40,7 @@ const lightSpec = {
|
|
|
40
40
|
}
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
import { DataConstantProperty, Properties, Transitionable } from './properties.js';
|
|
44
44
|
|
|
45
45
|
class LightPositionProperty {
|
|
46
46
|
constructor(specification) {
|
|
@@ -109,4 +109,4 @@ class Light extends Evented {
|
|
|
109
109
|
}
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
export default Light;
|
package/src/style/load_sprite.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import browser from '../util/browser.js';
|
|
2
|
+
import { RGBAImage } from '../util/image.js';
|
|
3
|
+
import loadImage from '../util/loader/image.js';
|
|
4
|
+
export default loadSprite;
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
async function loadSprite(sprite) {
|
|
6
|
+
async function loadSprite(loadingSprite) {
|
|
7
|
+
const sprite = await loadingSprite;
|
|
8
8
|
const image = await loadImage(sprite.image);
|
|
9
9
|
const { json } = sprite;
|
|
10
10
|
if (json && image) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import Protobuf from '@mapwhit/pbf';
|
|
2
|
+
import { AlphaImage } from '../util/image.js';
|
|
2
3
|
|
|
3
|
-
const
|
|
4
|
-
const border = 3;
|
|
4
|
+
export const GLYPH_PBF_BORDER = 3;
|
|
5
5
|
|
|
6
6
|
function readFontstacks(tag, glyphs, pbf) {
|
|
7
7
|
if (tag === 1) {
|
|
@@ -16,8 +16,8 @@ function readFontstack(tag, glyphs, pbf) {
|
|
|
16
16
|
id,
|
|
17
17
|
bitmap: new AlphaImage(
|
|
18
18
|
{
|
|
19
|
-
width: width + 2 *
|
|
20
|
-
height: height + 2 *
|
|
19
|
+
width: width + 2 * GLYPH_PBF_BORDER,
|
|
20
|
+
height: height + 2 * GLYPH_PBF_BORDER
|
|
21
21
|
},
|
|
22
22
|
bitmap
|
|
23
23
|
),
|
|
@@ -27,19 +27,23 @@ function readFontstack(tag, glyphs, pbf) {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
function readGlyph(tag, glyph, pbf) {
|
|
30
|
-
if (tag === 1)
|
|
31
|
-
|
|
32
|
-
else if (tag ===
|
|
33
|
-
|
|
34
|
-
else if (tag ===
|
|
35
|
-
|
|
36
|
-
else if (tag ===
|
|
30
|
+
if (tag === 1) {
|
|
31
|
+
glyph.id = pbf.readVarint();
|
|
32
|
+
} else if (tag === 2) {
|
|
33
|
+
glyph.bitmap = pbf.readBytes();
|
|
34
|
+
} else if (tag === 3) {
|
|
35
|
+
glyph.width = pbf.readVarint();
|
|
36
|
+
} else if (tag === 4) {
|
|
37
|
+
glyph.height = pbf.readVarint();
|
|
38
|
+
} else if (tag === 5) {
|
|
39
|
+
glyph.left = pbf.readSVarint();
|
|
40
|
+
} else if (tag === 6) {
|
|
41
|
+
glyph.top = pbf.readSVarint();
|
|
42
|
+
} else if (tag === 7) {
|
|
43
|
+
glyph.advance = pbf.readVarint();
|
|
44
|
+
}
|
|
37
45
|
}
|
|
38
46
|
|
|
39
|
-
function parseGlyph(data) {
|
|
47
|
+
export default function parseGlyph(data) {
|
|
40
48
|
return new Protobuf(data).readFields(readFontstacks, []);
|
|
41
49
|
}
|
|
42
|
-
|
|
43
|
-
parseGlyph.GLYPH_PBF_BORDER = border;
|
|
44
|
-
|
|
45
|
-
module.exports = parseGlyph;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { Placement } = require('../symbol/placement');
|
|
1
|
+
import { Placement } from '../symbol/placement.js';
|
|
2
|
+
import browser from '../util/browser.js';
|
|
4
3
|
|
|
5
4
|
class LayerPlacement {
|
|
6
5
|
constructor() {
|
|
@@ -22,9 +21,9 @@ class LayerPlacement {
|
|
|
22
21
|
}
|
|
23
22
|
|
|
24
23
|
class PauseablePlacement {
|
|
25
|
-
constructor(transform,
|
|
24
|
+
constructor(transform, maxIndex, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions) {
|
|
26
25
|
this.placement = new Placement(transform, fadeDuration, crossSourceCollisions);
|
|
27
|
-
this._currentPlacementIndex =
|
|
26
|
+
this._currentPlacementIndex = maxIndex;
|
|
28
27
|
this._forceFullPlacement = forceFullPlacement;
|
|
29
28
|
this._showCollisionBoxes = showCollisionBoxes;
|
|
30
29
|
this._done = false;
|
|
@@ -34,7 +33,7 @@ class PauseablePlacement {
|
|
|
34
33
|
return this._done;
|
|
35
34
|
}
|
|
36
35
|
|
|
37
|
-
continuePlacement(
|
|
36
|
+
continuePlacement(layers, layerTiles) {
|
|
38
37
|
const startTime = browser.now();
|
|
39
38
|
|
|
40
39
|
const shouldPausePlacement = () => {
|
|
@@ -43,8 +42,7 @@ class PauseablePlacement {
|
|
|
43
42
|
};
|
|
44
43
|
|
|
45
44
|
while (this._currentPlacementIndex >= 0) {
|
|
46
|
-
const
|
|
47
|
-
const layer = layers[layerId];
|
|
45
|
+
const layer = layers[this._currentPlacementIndex];
|
|
48
46
|
const placementZoom = this.placement.collisionIndex.transform.zoom;
|
|
49
47
|
if (
|
|
50
48
|
layer.type === 'symbol' &&
|
|
@@ -85,4 +83,4 @@ class PauseablePlacement {
|
|
|
85
83
|
}
|
|
86
84
|
}
|
|
87
85
|
|
|
88
|
-
|
|
86
|
+
export default PauseablePlacement;
|