@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,23 +1,100 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SourceFeatureState manages the state and
|
|
2
|
+
* SourceFeatureState manages the state and pending changes
|
|
3
3
|
* to features in a source, separated by source layer.
|
|
4
|
+
* stateChanges and deletedStates batch all changes to the tile (updates and removes, respectively)
|
|
5
|
+
* between coalesce() events. addFeatureState() and removeFeatureState() also update their counterpart's
|
|
6
|
+
* list of changes, such that coalesce() can apply the proper state changes while agnostic to the order of operations.
|
|
7
|
+
* In deletedStates, all null's denote complete removal of state at that scope
|
|
4
8
|
*
|
|
5
9
|
* @private
|
|
6
10
|
*/
|
|
7
11
|
class SourceFeatureState {
|
|
8
12
|
#state = {};
|
|
9
13
|
#stateChanges = {};
|
|
14
|
+
#deletedStates = {};
|
|
10
15
|
|
|
11
|
-
updateState(sourceLayer, feature,
|
|
16
|
+
updateState(sourceLayer, feature, newState) {
|
|
12
17
|
const changes = (this.#stateChanges[sourceLayer] ??= {});
|
|
13
18
|
const featureState = (changes[feature] ??= {});
|
|
14
|
-
Object.assign(featureState,
|
|
19
|
+
Object.assign(featureState, newState);
|
|
20
|
+
|
|
21
|
+
if (this.#deletedStates[sourceLayer] === null) {
|
|
22
|
+
this.#deletedStates[sourceLayer] = {};
|
|
23
|
+
for (const ft in this.#state[sourceLayer]) {
|
|
24
|
+
if (ft !== feature) {
|
|
25
|
+
this.#deletedStates[sourceLayer][ft] = null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
} else {
|
|
29
|
+
const featureDeletionQueued =
|
|
30
|
+
this.#deletedStates[sourceLayer] && this.#deletedStates[sourceLayer][feature] === null;
|
|
31
|
+
if (featureDeletionQueued) {
|
|
32
|
+
this.#deletedStates[sourceLayer][feature] = {};
|
|
33
|
+
for (const prop in this.state[sourceLayer][feature]) {
|
|
34
|
+
if (!newState[prop]) {
|
|
35
|
+
this.#deletedStates[sourceLayer][feature][prop] = null;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
} else {
|
|
39
|
+
for (const key in newState) {
|
|
40
|
+
const deletionInQueue = this.#deletedStates[sourceLayer]?.[feature]?.[key] === null;
|
|
41
|
+
if (deletionInQueue) {
|
|
42
|
+
delete this.#deletedStates[sourceLayer][feature][key];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
removeFeatureState(sourceLayer, featureId, key) {
|
|
50
|
+
const sourceLayerDeleted = this.#deletedStates[sourceLayer] === null;
|
|
51
|
+
if (sourceLayerDeleted) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const feature = String(featureId);
|
|
56
|
+
|
|
57
|
+
this.#deletedStates[sourceLayer] = this.#deletedStates[sourceLayer] || {};
|
|
58
|
+
|
|
59
|
+
if (key && featureId !== undefined) {
|
|
60
|
+
if (this.#deletedStates[sourceLayer][feature] !== null) {
|
|
61
|
+
this.#deletedStates[sourceLayer][feature] = this.#deletedStates[sourceLayer][feature] || {};
|
|
62
|
+
this.#deletedStates[sourceLayer][feature][key] = null;
|
|
63
|
+
}
|
|
64
|
+
} else if (featureId !== undefined) {
|
|
65
|
+
const updateInQueue = this.#stateChanges[sourceLayer]?.[feature];
|
|
66
|
+
if (updateInQueue) {
|
|
67
|
+
this.#deletedStates[sourceLayer][feature] = {};
|
|
68
|
+
for (key in this.#stateChanges[sourceLayer][feature]) {
|
|
69
|
+
this.#deletedStates[sourceLayer][feature][key] = null;
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
this.#deletedStates[sourceLayer][feature] = null;
|
|
73
|
+
}
|
|
74
|
+
} else {
|
|
75
|
+
this.#deletedStates[sourceLayer] = null;
|
|
76
|
+
}
|
|
15
77
|
}
|
|
16
78
|
|
|
17
79
|
getState(sourceLayer, feature) {
|
|
18
80
|
const base = this.#state[sourceLayer];
|
|
19
81
|
const changes = this.#stateChanges[sourceLayer];
|
|
20
|
-
|
|
82
|
+
const reconciledState = Object.assign({}, base?.[feature], changes?.[feature]);
|
|
83
|
+
|
|
84
|
+
//return empty object if the whole source layer is awaiting deletion
|
|
85
|
+
if (this.#deletedStates[sourceLayer] === null) {
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
if (this.#deletedStates[sourceLayer]) {
|
|
89
|
+
const featureDeletions = this.#deletedStates[sourceLayer][feature];
|
|
90
|
+
if (featureDeletions === null) {
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
for (const prop in featureDeletions) {
|
|
94
|
+
delete reconciledState[prop];
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return reconciledState;
|
|
21
98
|
}
|
|
22
99
|
|
|
23
100
|
initializeTileState(tile, painter) {
|
|
@@ -25,22 +102,57 @@ class SourceFeatureState {
|
|
|
25
102
|
}
|
|
26
103
|
|
|
27
104
|
coalesceChanges(tiles, painter) {
|
|
28
|
-
|
|
105
|
+
//track changes with full state objects, but only for features that got modified
|
|
106
|
+
const featuresChanged = {};
|
|
29
107
|
for (const sourceLayer in this.#stateChanges) {
|
|
30
108
|
this.#state[sourceLayer] ??= {};
|
|
31
109
|
const layerStates = {};
|
|
32
|
-
for (const
|
|
33
|
-
this.#state[sourceLayer][
|
|
34
|
-
|
|
35
|
-
|
|
110
|
+
for (const feature in this.#stateChanges[sourceLayer]) {
|
|
111
|
+
if (!this.#state[sourceLayer][feature]) {
|
|
112
|
+
this.#state[sourceLayer][feature] = {};
|
|
113
|
+
}
|
|
114
|
+
Object.assign(this.#state[sourceLayer][feature], this.#stateChanges[sourceLayer][feature]);
|
|
115
|
+
layerStates[feature] = this.#state[sourceLayer][feature];
|
|
36
116
|
}
|
|
37
|
-
|
|
117
|
+
featuresChanged[sourceLayer] = layerStates;
|
|
118
|
+
}
|
|
119
|
+
for (const sourceLayer in this.#deletedStates) {
|
|
120
|
+
this.#state[sourceLayer] = this.#state[sourceLayer] || {};
|
|
121
|
+
const layerStates = {};
|
|
122
|
+
|
|
123
|
+
if (this.#deletedStates[sourceLayer] === null) {
|
|
124
|
+
for (const ft in this.#state[sourceLayer]) {
|
|
125
|
+
layerStates[ft] = {};
|
|
126
|
+
}
|
|
127
|
+
this.#state[sourceLayer] = {};
|
|
128
|
+
} else {
|
|
129
|
+
for (const feature in this.#deletedStates[sourceLayer]) {
|
|
130
|
+
const deleteWholeFeatureState = this.#deletedStates[sourceLayer][feature] === null;
|
|
131
|
+
if (deleteWholeFeatureState) {
|
|
132
|
+
this.#state[sourceLayer][feature] = {};
|
|
133
|
+
} else {
|
|
134
|
+
for (const key of Object.keys(this.#deletedStates[sourceLayer][feature])) {
|
|
135
|
+
delete this.#state[sourceLayer][feature][key];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
layerStates[feature] = this.#state[sourceLayer][feature];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
featuresChanged[sourceLayer] = featuresChanged[sourceLayer] || {};
|
|
143
|
+
Object.assign(featuresChanged[sourceLayer], layerStates);
|
|
38
144
|
}
|
|
39
145
|
this.#stateChanges = {};
|
|
40
|
-
|
|
146
|
+
this.#deletedStates = {};
|
|
41
147
|
|
|
42
|
-
Object.
|
|
148
|
+
if (Object.keys(featuresChanged).length === 0) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
for (const tile of tiles) {
|
|
153
|
+
tile.setFeatureState(featuresChanged, painter);
|
|
154
|
+
}
|
|
43
155
|
}
|
|
44
156
|
}
|
|
45
157
|
|
|
46
|
-
|
|
158
|
+
export default SourceFeatureState;
|
package/src/source/tile.js
CHANGED
|
@@ -1,18 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const browser = require('../util/browser');
|
|
15
|
-
const EvaluationParameters = require('../style/evaluation_parameters');
|
|
1
|
+
import { CollisionBoxArray, RasterBoundsArray } from '../data/array_types.js';
|
|
2
|
+
import { updateBuckets } from '../data/bucket.js';
|
|
3
|
+
import EXTENT from '../data/extent.js';
|
|
4
|
+
import { TriangleIndexArray } from '../data/index_array_type.js';
|
|
5
|
+
import rasterBoundsAttributes from '../data/raster_bounds_attributes.js';
|
|
6
|
+
import SegmentVector from '../data/segment.js';
|
|
7
|
+
import Texture from '../render/texture.js';
|
|
8
|
+
import EvaluationParameters from '../style/evaluation_parameters.js';
|
|
9
|
+
import featureFilter from '../style-spec/feature_filter/index.js';
|
|
10
|
+
import browser from '../util/browser.js';
|
|
11
|
+
import { deepEqual } from '../util/object.js';
|
|
12
|
+
import uniqueId from '../util/unique_id.js';
|
|
13
|
+
import GeoJSONFeature from '../util/vectortile_to_geojson.js';
|
|
16
14
|
|
|
17
15
|
/**
|
|
18
16
|
* A tile object is the combination of a Coordinate, which defines
|
|
@@ -30,7 +28,7 @@ class Tile {
|
|
|
30
28
|
this.uid = uniqueId();
|
|
31
29
|
this.uses = 0;
|
|
32
30
|
this.tileSize = size;
|
|
33
|
-
this.buckets =
|
|
31
|
+
this.buckets = new Map();
|
|
34
32
|
this.queryPadding = 0;
|
|
35
33
|
this.hasSymbolBuckets = false;
|
|
36
34
|
|
|
@@ -39,8 +37,12 @@ class Tile {
|
|
|
39
37
|
|
|
40
38
|
registerFadeDuration(duration) {
|
|
41
39
|
const fadeEndTime = duration + this.timeAdded;
|
|
42
|
-
if (fadeEndTime < browser.now())
|
|
43
|
-
|
|
40
|
+
if (fadeEndTime < browser.now()) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
44
46
|
|
|
45
47
|
this.fadeEndTime = fadeEndTime;
|
|
46
48
|
}
|
|
@@ -58,7 +60,7 @@ class Tile {
|
|
|
58
60
|
* @param painter
|
|
59
61
|
* @returns {undefined}
|
|
60
62
|
*/
|
|
61
|
-
loadVectorData(data, painter
|
|
63
|
+
loadVectorData(data, painter) {
|
|
62
64
|
if (this.hasData()) {
|
|
63
65
|
this.unloadVectorData();
|
|
64
66
|
}
|
|
@@ -73,38 +75,26 @@ class Tile {
|
|
|
73
75
|
|
|
74
76
|
if (data.featureIndex) {
|
|
75
77
|
this.latestFeatureIndex = data.featureIndex;
|
|
78
|
+
if (data.vectorTile) {
|
|
79
|
+
// Only vector tiles have `vectorTile`, and they won't update it for `reloadTile`
|
|
80
|
+
this.latestVectorTile = data.vectorTile;
|
|
81
|
+
this.latestFeatureIndex.vectorTile = data.vectorTile;
|
|
82
|
+
} else if (this.latestVectorTile) {
|
|
83
|
+
// If `vectorTile` hasn't updated, hold onto a pointer to the last one we received
|
|
84
|
+
this.latestFeatureIndex.vectorTile = this.latestVectorTile;
|
|
85
|
+
}
|
|
76
86
|
if (data.rawTileData) {
|
|
77
|
-
//
|
|
78
|
-
// 'reloadTile'
|
|
87
|
+
// rawTileData is present only in vector tiles and only in debug mode
|
|
79
88
|
this.latestRawTileData = data.rawTileData;
|
|
80
|
-
this.latestFeatureIndex.rawTileData = data.rawTileData;
|
|
81
|
-
} else if (this.latestRawTileData) {
|
|
82
|
-
// If rawTileData hasn't updated, hold onto a pointer to the last
|
|
83
|
-
// one we received
|
|
84
|
-
this.latestFeatureIndex.rawTileData = this.latestRawTileData;
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
91
|
this.collisionBoxArray = data.collisionBoxArray;
|
|
88
|
-
this.buckets = deserializeBucket(data.buckets, painter.style);
|
|
89
92
|
|
|
90
|
-
|
|
91
|
-
const buckets = Object.values(this.buckets);
|
|
92
|
-
for (const bucket of buckets) {
|
|
93
|
-
if (bucket instanceof SymbolBucket) {
|
|
94
|
-
this.hasSymbolBuckets = true;
|
|
95
|
-
if (justReloaded) {
|
|
96
|
-
bucket.justReloaded = true;
|
|
97
|
-
} else {
|
|
98
|
-
break;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
93
|
+
updateBuckets(data.buckets, painter.style);
|
|
102
94
|
|
|
103
|
-
this.
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
this.queryPadding = Math.max(this.queryPadding, painter.style.getLayer(id).queryRadius(bucket));
|
|
107
|
-
}
|
|
95
|
+
this.buckets = data.buckets;
|
|
96
|
+
this.hasSymbolBuckets = data.hasSymbolBuckets;
|
|
97
|
+
this.queryPadding = data.queryPadding;
|
|
108
98
|
|
|
109
99
|
if (data.imageAtlas) {
|
|
110
100
|
this.imageAtlas = data.imageAtlas;
|
|
@@ -120,10 +110,10 @@ class Tile {
|
|
|
120
110
|
* @private
|
|
121
111
|
*/
|
|
122
112
|
unloadVectorData() {
|
|
123
|
-
for (const bucket of
|
|
113
|
+
for (const bucket of this.buckets.values()) {
|
|
124
114
|
bucket.destroy();
|
|
125
115
|
}
|
|
126
|
-
this.buckets
|
|
116
|
+
this.buckets.clear();
|
|
127
117
|
|
|
128
118
|
this.imageAtlasTexture?.destroy();
|
|
129
119
|
if (this.imageAtlas) {
|
|
@@ -141,12 +131,11 @@ class Tile {
|
|
|
141
131
|
}
|
|
142
132
|
|
|
143
133
|
getBucket(layer) {
|
|
144
|
-
return this.buckets
|
|
134
|
+
return this.buckets.get(layer.id);
|
|
145
135
|
}
|
|
146
136
|
|
|
147
137
|
upload(context) {
|
|
148
|
-
for (const
|
|
149
|
-
const bucket = this.buckets[id];
|
|
138
|
+
for (const bucket of this.buckets.values()) {
|
|
150
139
|
if (bucket.uploadPending()) {
|
|
151
140
|
bucket.upload(context);
|
|
152
141
|
}
|
|
@@ -178,7 +167,9 @@ class Tile {
|
|
|
178
167
|
maxPitchScaleFactor,
|
|
179
168
|
pixelPosMatrix
|
|
180
169
|
) {
|
|
181
|
-
if (!this.latestFeatureIndex?.
|
|
170
|
+
if (!this.latestFeatureIndex?.vectorTile) {
|
|
171
|
+
return {};
|
|
172
|
+
}
|
|
182
173
|
|
|
183
174
|
return this.latestFeatureIndex.query(
|
|
184
175
|
{
|
|
@@ -197,14 +188,18 @@ class Tile {
|
|
|
197
188
|
}
|
|
198
189
|
|
|
199
190
|
querySourceFeatures(result, params) {
|
|
200
|
-
if (!this.latestFeatureIndex?.
|
|
191
|
+
if (!this.latestFeatureIndex?.vectorTile) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
201
194
|
|
|
202
195
|
const vtLayers = this.latestFeatureIndex.loadVTLayers();
|
|
203
196
|
|
|
204
197
|
const sourceLayer = params ? params.sourceLayer : '';
|
|
205
198
|
const layer = vtLayers._geojsonTileLayer || vtLayers[sourceLayer];
|
|
206
199
|
|
|
207
|
-
if (!layer)
|
|
200
|
+
if (!layer) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
208
203
|
|
|
209
204
|
const filter = featureFilter(params?.filter);
|
|
210
205
|
const { z, x, y } = this.tileID.canonical;
|
|
@@ -237,14 +232,18 @@ class Tile {
|
|
|
237
232
|
|
|
238
233
|
setMask(mask, context) {
|
|
239
234
|
// don't redo buffer work if the mask is the same;
|
|
240
|
-
if (deepEqual(this.mask, mask))
|
|
235
|
+
if (deepEqual(this.mask, mask)) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
241
238
|
|
|
242
239
|
this.mask = mask;
|
|
243
240
|
this.clearMask();
|
|
244
241
|
|
|
245
242
|
// We want to render the full tile, and keeping the segments/vertices/indices empty means
|
|
246
243
|
// using the global shared buffers for covering the entire tile.
|
|
247
|
-
if (deepEqual(mask, { 0: true }))
|
|
244
|
+
if (deepEqual(mask, { 0: true })) {
|
|
245
|
+
return;
|
|
246
|
+
}
|
|
248
247
|
|
|
249
248
|
const maskedBoundsArray = new RasterBoundsArray();
|
|
250
249
|
const indexArray = new TriangleIndexArray();
|
|
@@ -258,16 +257,17 @@ class Tile {
|
|
|
258
257
|
for (let i = 0; i < maskArray.length; i++) {
|
|
259
258
|
const maskCoord = mask[maskArray[i]];
|
|
260
259
|
const vertexExtent = EXTENT >> maskCoord.z;
|
|
261
|
-
const
|
|
262
|
-
const
|
|
260
|
+
const tlVertexX = maskCoord.x * vertexExtent;
|
|
261
|
+
const tlVertexY = maskCoord.y * vertexExtent;
|
|
262
|
+
const brVertexX = tlVertexX + vertexExtent;
|
|
263
|
+
const brVertexY = tlVertexY + vertexExtent;
|
|
263
264
|
|
|
264
|
-
// not sure why flow is complaining here because it doesn't complain at L401
|
|
265
265
|
const segment = this.segments.prepareSegment(4, maskedBoundsArray, indexArray);
|
|
266
266
|
|
|
267
|
-
maskedBoundsArray.emplaceBack(
|
|
268
|
-
maskedBoundsArray.emplaceBack(
|
|
269
|
-
maskedBoundsArray.emplaceBack(
|
|
270
|
-
maskedBoundsArray.emplaceBack(
|
|
267
|
+
maskedBoundsArray.emplaceBack(tlVertexX, tlVertexY, tlVertexX, tlVertexY);
|
|
268
|
+
maskedBoundsArray.emplaceBack(brVertexX, tlVertexY, brVertexX, tlVertexY);
|
|
269
|
+
maskedBoundsArray.emplaceBack(tlVertexX, brVertexY, tlVertexX, brVertexY);
|
|
270
|
+
maskedBoundsArray.emplaceBack(brVertexX, brVertexY, brVertexX, brVertexY);
|
|
271
271
|
|
|
272
272
|
const offset = segment.vertexLength;
|
|
273
273
|
// 0, 1, 2
|
|
@@ -292,19 +292,20 @@ class Tile {
|
|
|
292
292
|
}
|
|
293
293
|
|
|
294
294
|
setFeatureState(states, painter) {
|
|
295
|
-
if (!this.latestFeatureIndex?.
|
|
295
|
+
if (!this.latestFeatureIndex?.vectorTile || Object.keys(states).length === 0) {
|
|
296
296
|
return;
|
|
297
297
|
}
|
|
298
298
|
|
|
299
299
|
const vtLayers = this.latestFeatureIndex.loadVTLayers();
|
|
300
300
|
|
|
301
|
-
for (const id
|
|
302
|
-
const bucket = this.buckets[id];
|
|
301
|
+
for (const [id, bucket] of this.buckets) {
|
|
303
302
|
// Buckets are grouped by common source-layer
|
|
304
303
|
const sourceLayerId = bucket.layers[0]['sourceLayer'] || '_geojsonTileLayer';
|
|
305
304
|
const sourceLayer = vtLayers[sourceLayerId];
|
|
306
305
|
const sourceLayerStates = states[sourceLayerId];
|
|
307
|
-
if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0)
|
|
306
|
+
if (!sourceLayer || !sourceLayerStates || Object.keys(sourceLayerStates).length === 0) {
|
|
307
|
+
continue;
|
|
308
|
+
}
|
|
308
309
|
|
|
309
310
|
bucket.update(sourceLayerStates, sourceLayer, this.imageAtlas?.patternPositions || {});
|
|
310
311
|
if (painter?.style) {
|
|
@@ -330,4 +331,4 @@ class Tile {
|
|
|
330
331
|
}
|
|
331
332
|
}
|
|
332
333
|
|
|
333
|
-
|
|
334
|
+
export default Tile;
|
|
@@ -1,40 +1,47 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const { clamp } = require('../util/util');
|
|
1
|
+
import LngLatBounds from '../geo/lng_lat_bounds.js';
|
|
2
|
+
import { clamp } from '../util/util.js';
|
|
4
3
|
|
|
5
4
|
class TileBounds {
|
|
6
|
-
constructor(bounds, minzoom, maxzoom) {
|
|
7
|
-
this.bounds = LngLatBounds
|
|
8
|
-
this.minzoom = minzoom
|
|
9
|
-
this.maxzoom = maxzoom
|
|
5
|
+
constructor(bounds, minzoom = 0, maxzoom = 24) {
|
|
6
|
+
this.bounds = new LngLatBounds(validateBounds(bounds));
|
|
7
|
+
this.minzoom = minzoom;
|
|
8
|
+
this.maxzoom = maxzoom;
|
|
10
9
|
}
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
|
|
11
|
+
contains({ x, y, z }) {
|
|
12
|
+
const minX = Math.floor(lngX(this.bounds.getWest(), z));
|
|
13
|
+
if (x < minX) {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
const maxX = Math.ceil(lngX(this.bounds.getEast(), z));
|
|
17
|
+
if (x >= maxX) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const minY = Math.floor(latY(this.bounds.getNorth(), z));
|
|
21
|
+
if (y < minY) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const maxY = Math.ceil(latY(this.bounds.getSouth(), z));
|
|
25
|
+
return y < maxY;
|
|
16
26
|
}
|
|
27
|
+
}
|
|
17
28
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
maxX: Math.ceil(this.lngX(this.bounds.getEast(), tileID.z)),
|
|
23
|
-
maxY: Math.ceil(this.latY(this.bounds.getSouth(), tileID.z))
|
|
24
|
-
};
|
|
25
|
-
const hit = tileID.x >= level.minX && tileID.x < level.maxX && tileID.y >= level.minY && tileID.y < level.maxY;
|
|
26
|
-
return hit;
|
|
29
|
+
function validateBounds(bounds) {
|
|
30
|
+
// make sure the bounds property contains valid longitude and latitudes
|
|
31
|
+
if (!Array.isArray(bounds) || bounds.length !== 4) {
|
|
32
|
+
return [-180, -90, 180, 90];
|
|
27
33
|
}
|
|
34
|
+
return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])];
|
|
35
|
+
}
|
|
28
36
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
37
|
+
function lngX(lng, zoom) {
|
|
38
|
+
return (lng + 180) * (2 ** zoom / 360);
|
|
39
|
+
}
|
|
32
40
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
41
|
+
function latY(lat, zoom) {
|
|
42
|
+
const f = clamp(Math.sin((Math.PI / 180) * lat), -0.9999, 0.9999);
|
|
43
|
+
const scale = 2 ** zoom / (2 * Math.PI);
|
|
44
|
+
return 2 ** (zoom - 1) + 0.5 * Math.log((1 + f) / (1 - f)) * -scale;
|
|
38
45
|
}
|
|
39
46
|
|
|
40
|
-
|
|
47
|
+
export default TileBounds;
|
package/src/source/tile_cache.js
CHANGED
package/src/source/tile_id.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
import Coordinate from '../geo/coordinate.js';
|
|
2
3
|
|
|
3
|
-
|
|
4
|
-
const { register } = require('../util/transfer_registry');
|
|
5
|
-
const Coordinate = require('../geo/coordinate');
|
|
6
|
-
|
|
7
|
-
class CanonicalTileID {
|
|
4
|
+
export class CanonicalTileID {
|
|
8
5
|
constructor(z, x, y) {
|
|
9
6
|
assert(z >= 0 && z <= 25);
|
|
10
7
|
assert(x >= 0 && x < 2 ** z);
|
|
@@ -24,7 +21,7 @@ class CanonicalTileID {
|
|
|
24
21
|
}
|
|
25
22
|
}
|
|
26
23
|
|
|
27
|
-
class UnwrappedTileID {
|
|
24
|
+
export class UnwrappedTileID {
|
|
28
25
|
constructor(wrap, canonical) {
|
|
29
26
|
this.wrap = wrap;
|
|
30
27
|
this.canonical = canonical;
|
|
@@ -32,7 +29,7 @@ class UnwrappedTileID {
|
|
|
32
29
|
}
|
|
33
30
|
}
|
|
34
31
|
|
|
35
|
-
class OverscaledTileID {
|
|
32
|
+
export class OverscaledTileID {
|
|
36
33
|
constructor(overscaledZ, wrap, z, x, y) {
|
|
37
34
|
assert(overscaledZ >= z);
|
|
38
35
|
this.overscaledZ = overscaledZ;
|
|
@@ -91,16 +88,30 @@ class OverscaledTileID {
|
|
|
91
88
|
}
|
|
92
89
|
|
|
93
90
|
isLessThan(rhs) {
|
|
94
|
-
if (this.wrap < rhs.wrap)
|
|
95
|
-
|
|
91
|
+
if (this.wrap < rhs.wrap) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
if (this.wrap > rhs.wrap) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
96
97
|
|
|
97
|
-
if (this.overscaledZ < rhs.overscaledZ)
|
|
98
|
-
|
|
98
|
+
if (this.overscaledZ < rhs.overscaledZ) {
|
|
99
|
+
return true;
|
|
100
|
+
}
|
|
101
|
+
if (this.overscaledZ > rhs.overscaledZ) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
99
104
|
|
|
100
|
-
if (this.canonical.x < rhs.canonical.x)
|
|
101
|
-
|
|
105
|
+
if (this.canonical.x < rhs.canonical.x) {
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
if (this.canonical.x > rhs.canonical.x) {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
102
111
|
|
|
103
|
-
if (this.canonical.y < rhs.canonical.y)
|
|
112
|
+
if (this.canonical.y < rhs.canonical.y) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
104
115
|
return false;
|
|
105
116
|
}
|
|
106
117
|
|
|
@@ -133,18 +144,11 @@ class OverscaledTileID {
|
|
|
133
144
|
}
|
|
134
145
|
}
|
|
135
146
|
|
|
136
|
-
function calculateKey(wrap, z, x, y) {
|
|
147
|
+
export function calculateKey(wrap, z, x, y) {
|
|
137
148
|
wrap *= 2;
|
|
138
|
-
if (wrap < 0)
|
|
149
|
+
if (wrap < 0) {
|
|
150
|
+
wrap = wrap * -1 - 1;
|
|
151
|
+
}
|
|
139
152
|
const dim = 1 << z;
|
|
140
153
|
return (dim * dim * wrap + dim * y + x) * 32 + z;
|
|
141
154
|
}
|
|
142
|
-
|
|
143
|
-
register('CanonicalTileID', CanonicalTileID);
|
|
144
|
-
register('OverscaledTileID', OverscaledTileID, { omit: ['posMatrix'] });
|
|
145
|
-
|
|
146
|
-
module.exports = {
|
|
147
|
-
CanonicalTileID,
|
|
148
|
-
UnwrappedTileID,
|
|
149
|
-
OverscaledTileID
|
|
150
|
-
};
|