@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.
Files changed (249) hide show
  1. package/README.md +7 -0
  2. package/build/min/package.json +2 -1
  3. package/build/min/src/shaders/_prelude.fragment.glsl.js +2 -2
  4. package/build/min/src/shaders/_prelude.vertex.glsl.js +2 -2
  5. package/build/min/src/shaders/background.fragment.glsl.js +2 -2
  6. package/build/min/src/shaders/background.vertex.glsl.js +1 -1
  7. package/build/min/src/shaders/background_pattern.fragment.glsl.js +2 -2
  8. package/build/min/src/shaders/background_pattern.vertex.glsl.js +1 -1
  9. package/build/min/src/shaders/circle.fragment.glsl.js +2 -2
  10. package/build/min/src/shaders/circle.vertex.glsl.js +2 -2
  11. package/build/min/src/shaders/clipping_mask.fragment.glsl.js +1 -1
  12. package/build/min/src/shaders/clipping_mask.vertex.glsl.js +1 -1
  13. package/build/min/src/shaders/collision_box.fragment.glsl.js +1 -1
  14. package/build/min/src/shaders/collision_box.vertex.glsl.js +1 -1
  15. package/build/min/src/shaders/collision_circle.fragment.glsl.js +1 -1
  16. package/build/min/src/shaders/collision_circle.vertex.glsl.js +1 -1
  17. package/build/min/src/shaders/debug.fragment.glsl.js +1 -1
  18. package/build/min/src/shaders/debug.vertex.glsl.js +1 -1
  19. package/build/min/src/shaders/fill.fragment.glsl.js +2 -2
  20. package/build/min/src/shaders/fill.vertex.glsl.js +2 -2
  21. package/build/min/src/shaders/fill_extrusion.fragment.glsl.js +2 -2
  22. package/build/min/src/shaders/fill_extrusion.vertex.glsl.js +2 -2
  23. package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.js +2 -2
  24. package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.js +2 -2
  25. package/build/min/src/shaders/fill_outline.fragment.glsl.js +2 -2
  26. package/build/min/src/shaders/fill_outline.vertex.glsl.js +2 -2
  27. package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.js +2 -2
  28. package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.js +2 -2
  29. package/build/min/src/shaders/fill_pattern.fragment.glsl.js +2 -2
  30. package/build/min/src/shaders/fill_pattern.vertex.glsl.js +2 -2
  31. package/build/min/src/shaders/heatmap.fragment.glsl.js +2 -2
  32. package/build/min/src/shaders/heatmap.vertex.glsl.js +2 -2
  33. package/build/min/src/shaders/heatmap_texture.fragment.glsl.js +2 -2
  34. package/build/min/src/shaders/heatmap_texture.vertex.glsl.js +1 -1
  35. package/build/min/src/shaders/hillshade.fragment.glsl.js +2 -2
  36. package/build/min/src/shaders/hillshade.vertex.glsl.js +1 -1
  37. package/build/min/src/shaders/hillshade_prepare.fragment.glsl.js +2 -2
  38. package/build/min/src/shaders/hillshade_prepare.vertex.glsl.js +1 -1
  39. package/build/min/src/shaders/line.fragment.glsl.js +2 -2
  40. package/build/min/src/shaders/line.vertex.glsl.js +2 -2
  41. package/build/min/src/shaders/line_gradient.fragment.glsl.js +2 -2
  42. package/build/min/src/shaders/line_gradient.vertex.glsl.js +2 -2
  43. package/build/min/src/shaders/line_pattern.fragment.glsl.js +2 -2
  44. package/build/min/src/shaders/line_pattern.vertex.glsl.js +2 -2
  45. package/build/min/src/shaders/line_sdf.fragment.glsl.js +2 -2
  46. package/build/min/src/shaders/line_sdf.vertex.glsl.js +2 -2
  47. package/build/min/src/shaders/raster.fragment.glsl.js +2 -2
  48. package/build/min/src/shaders/raster.vertex.glsl.js +1 -1
  49. package/build/min/src/shaders/symbol_icon.fragment.glsl.js +2 -2
  50. package/build/min/src/shaders/symbol_icon.vertex.glsl.js +2 -2
  51. package/build/min/src/shaders/symbol_sdf.fragment.glsl.js +2 -2
  52. package/build/min/src/shaders/symbol_sdf.vertex.glsl.js +2 -2
  53. package/package.json +5 -4
  54. package/src/data/array_types.js +55 -117
  55. package/src/data/bucket/circle_attributes.js +2 -4
  56. package/src/data/bucket/circle_bucket.js +19 -16
  57. package/src/data/bucket/fill_attributes.js +2 -4
  58. package/src/data/bucket/fill_bucket.js +38 -27
  59. package/src/data/bucket/fill_extrusion_attributes.js +2 -4
  60. package/src/data/bucket/fill_extrusion_bucket.js +56 -37
  61. package/src/data/bucket/heatmap_bucket.js +2 -11
  62. package/src/data/bucket/line_attributes.js +2 -4
  63. package/src/data/bucket/line_bucket.js +208 -163
  64. package/src/data/bucket/pattern_attributes.js +2 -4
  65. package/src/data/bucket/pattern_bucket_features.js +7 -9
  66. package/src/data/bucket/symbol_attributes.js +12 -26
  67. package/src/data/bucket/symbol_bucket.js +174 -323
  68. package/src/data/bucket/symbol_buffers.js +62 -0
  69. package/src/data/bucket/symbol_collision_buffers.js +33 -0
  70. package/src/data/bucket.js +26 -25
  71. package/src/data/dem_data.js +11 -10
  72. package/src/data/extent.js +1 -1
  73. package/src/data/feature_index.js +38 -28
  74. package/src/data/index_array_type.js +1 -6
  75. package/src/data/load_geometry.js +6 -9
  76. package/src/data/pos_attributes.js +2 -3
  77. package/src/data/program_configuration.js +47 -38
  78. package/src/data/raster_bounds_attributes.js +2 -2
  79. package/src/data/segment.js +4 -7
  80. package/src/geo/coordinate.js +1 -1
  81. package/src/geo/lng_lat.js +3 -3
  82. package/src/geo/lng_lat_bounds.js +8 -4
  83. package/src/geo/transform.js +69 -30
  84. package/src/gl/color_mode.js +2 -2
  85. package/src/gl/context.js +28 -29
  86. package/src/gl/cull_face_mode.js +1 -1
  87. package/src/gl/depth_mode.js +1 -1
  88. package/src/gl/framebuffer.js +8 -4
  89. package/src/gl/index_buffer.js +2 -2
  90. package/src/gl/stencil_mode.js +1 -1
  91. package/src/gl/value.js +33 -68
  92. package/src/gl/vertex_buffer.js +2 -2
  93. package/src/index.js +49 -25
  94. package/src/render/draw_background.js +17 -12
  95. package/src/render/draw_circle.js +15 -12
  96. package/src/render/draw_collision_debug.js +11 -8
  97. package/src/render/draw_debug.js +16 -14
  98. package/src/render/draw_fill.js +27 -20
  99. package/src/render/draw_fill_extrusion.js +20 -17
  100. package/src/render/draw_heatmap.js +21 -16
  101. package/src/render/draw_hillshade.js +12 -9
  102. package/src/render/draw_line.js +36 -22
  103. package/src/render/draw_raster.js +22 -18
  104. package/src/render/draw_symbol.js +38 -33
  105. package/src/render/glyph_atlas.js +9 -8
  106. package/src/render/glyph_manager.js +2 -3
  107. package/src/render/image_atlas.js +4 -11
  108. package/src/render/image_manager.js +39 -28
  109. package/src/render/line_atlas.js +2 -2
  110. package/src/render/painter.js +78 -61
  111. package/src/render/program/background_program.js +6 -13
  112. package/src/render/program/circle_program.js +8 -10
  113. package/src/render/program/clipping_mask_program.js +3 -5
  114. package/src/render/program/collision_program.js +4 -6
  115. package/src/render/program/debug_program.js +3 -5
  116. package/src/render/program/fill_extrusion_program.js +9 -15
  117. package/src/render/program/fill_program.js +10 -21
  118. package/src/render/program/heatmap_program.js +9 -15
  119. package/src/render/program/hillshade_program.js +16 -22
  120. package/src/render/program/line_program.js +14 -25
  121. package/src/render/program/pattern.js +5 -7
  122. package/src/render/program/program_uniforms.js +13 -20
  123. package/src/render/program/raster_program.js +9 -11
  124. package/src/render/program/symbol_program.js +5 -7
  125. package/src/render/program.js +5 -6
  126. package/src/render/texture.js +1 -1
  127. package/src/render/tile_mask.js +6 -4
  128. package/src/render/uniform_binding.js +9 -20
  129. package/src/render/vertex_array_object.js +5 -3
  130. package/src/shaders/encode_attribute.js +2 -6
  131. package/src/shaders/index.js +103 -51
  132. package/src/source/geojson_source.js +25 -30
  133. package/src/source/geojson_worker_source.js +46 -74
  134. package/src/source/geojson_wrapper.js +13 -5
  135. package/src/source/image_source.js +17 -28
  136. package/src/source/load_tilejson.js +3 -3
  137. package/src/source/pixels_to_tile_units.js +3 -3
  138. package/src/source/query_features.js +17 -15
  139. package/src/source/raster_dem_tile_source.js +54 -71
  140. package/src/source/raster_tile_source.js +14 -15
  141. package/src/source/resources/glyphs.js +4 -5
  142. package/src/source/resources/index.js +4 -12
  143. package/src/source/rtl_text_plugin.js +62 -35
  144. package/src/source/source.js +14 -22
  145. package/src/source/source_cache.js +221 -179
  146. package/src/source/source_state.js +125 -13
  147. package/src/source/tile.js +67 -66
  148. package/src/source/tile_bounds.js +36 -29
  149. package/src/source/tile_cache.js +2 -2
  150. package/src/source/tile_id.js +30 -26
  151. package/src/source/vector_tile_source.js +23 -21
  152. package/src/source/vector_tile_worker_source.js +22 -26
  153. package/src/source/worker_tile.js +139 -134
  154. package/src/style/create_style_layer.js +11 -11
  155. package/src/style/evaluation_parameters.js +4 -6
  156. package/src/style/light.js +5 -5
  157. package/src/style/load_sprite.js +6 -6
  158. package/src/style/parse_glyph_pbf.js +21 -17
  159. package/src/style/pauseable_placement.js +7 -9
  160. package/src/style/properties.js +21 -51
  161. package/src/style/query_utils.js +7 -13
  162. package/src/style/style.js +314 -221
  163. package/src/style/style_layer/background_style_layer.js +3 -4
  164. package/src/style/style_layer/background_style_layer_properties.js +2 -2
  165. package/src/style/style_layer/circle_style_layer.js +25 -20
  166. package/src/style/style_layer/circle_style_layer_properties.js +2 -2
  167. package/src/style/style_layer/fill_extrusion_style_layer.js +55 -37
  168. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +2 -2
  169. package/src/style/style_layer/fill_style_layer.js +11 -12
  170. package/src/style/style_layer/fill_style_layer_properties.js +2 -2
  171. package/src/style/style_layer/heatmap_style_layer.js +6 -7
  172. package/src/style/style_layer/heatmap_style_layer_properties.js +2 -2
  173. package/src/style/style_layer/hillshade_style_layer.js +4 -5
  174. package/src/style/style_layer/hillshade_style_layer_properties.js +2 -2
  175. package/src/style/style_layer/line_style_layer.js +33 -30
  176. package/src/style/style_layer/line_style_layer_properties.js +5 -5
  177. package/src/style/style_layer/raster_style_layer.js +3 -4
  178. package/src/style/style_layer/raster_style_layer_properties.js +2 -2
  179. package/src/style/style_layer/symbol_style_layer.js +20 -21
  180. package/src/style/style_layer/symbol_style_layer_properties.js +2 -2
  181. package/src/style/style_layer.js +66 -47
  182. package/src/style/style_layer_index.js +17 -42
  183. package/src/style/zoom_history.js +1 -1
  184. package/src/style-spec/error/parsing_error.js +1 -1
  185. package/src/style-spec/error/validation_error.js +5 -3
  186. package/src/style-spec/feature_filter/convert.js +17 -9
  187. package/src/style-spec/feature_filter/index.js +13 -9
  188. package/src/style-spec/util/eval_support.js +2 -2
  189. package/src/style-spec/util/ref_properties.js +1 -1
  190. package/src/symbol/anchor.js +2 -6
  191. package/src/symbol/check_max_angle.js +13 -5
  192. package/src/symbol/clip_line.js +2 -3
  193. package/src/symbol/collision_feature.js +8 -4
  194. package/src/symbol/collision_index.js +5 -7
  195. package/src/symbol/cross_tile_symbol_index.js +7 -10
  196. package/src/symbol/get_anchors.js +15 -8
  197. package/src/symbol/grid_index.js +5 -3
  198. package/src/symbol/mergelines.js +2 -2
  199. package/src/symbol/opacity_state.js +1 -5
  200. package/src/symbol/placement.js +28 -23
  201. package/src/symbol/projection.js +29 -28
  202. package/src/symbol/quads.js +14 -16
  203. package/src/symbol/shaping.js +27 -19
  204. package/src/symbol/symbol_layout.js +24 -28
  205. package/src/symbol/symbol_size.js +13 -12
  206. package/src/symbol/transform_text.js +4 -4
  207. package/src/ui/camera.js +34 -18
  208. package/src/ui/map.js +102 -44
  209. package/src/util/async.js +11 -5
  210. package/src/util/browser.js +1 -1
  211. package/src/util/callback.js +3 -9
  212. package/src/util/classify_rings.js +13 -8
  213. package/src/util/color_ramp.js +3 -3
  214. package/src/util/config.js +4 -4
  215. package/src/util/dictionary_coder.js +2 -3
  216. package/src/util/dom.js +7 -3
  217. package/src/util/find_pole_of_inaccessibility.js +29 -14
  218. package/src/util/group_layers.js +41 -0
  219. package/src/util/image.js +3 -13
  220. package/src/util/interpolate.js +1 -1
  221. package/src/util/intersection_tests.js +80 -42
  222. package/src/util/is_char_in_unicode_block.js +1 -1
  223. package/src/util/key.js +25 -0
  224. package/src/util/loader/image.js +1 -1
  225. package/src/util/object.js +33 -76
  226. package/src/util/script_detection.js +212 -91
  227. package/src/util/struct_array.js +8 -40
  228. package/src/util/task_queue.js +11 -7
  229. package/src/util/throttle.js +2 -2
  230. package/src/util/tile_cover.js +8 -5
  231. package/src/util/token.js +1 -1
  232. package/src/util/unique_id.js +2 -2
  233. package/src/util/util.js +21 -29
  234. package/src/util/vectortile_to_geojson.js +4 -2
  235. package/src/util/verticalize_punctuation.js +3 -7
  236. package/src/util/warn.js +4 -4
  237. package/src/util/web_worker.js +3 -3
  238. package/src/worker.js +1 -4
  239. package/src/source/resources/images.js +0 -68
  240. package/src/source/worker.js +0 -110
  241. package/src/source/worker_source.js +0 -14
  242. package/src/style-spec/deref.js +0 -51
  243. package/src/style-spec/group_by_layout.js +0 -46
  244. package/src/util/actor.js +0 -108
  245. package/src/util/dispatcher.js +0 -65
  246. package/src/util/global_worker_pool.js +0 -15
  247. package/src/util/transfer_registry.js +0 -168
  248. package/src/util/web_worker_transfer.js +0 -43
  249. package/src/util/worker_pool.js +0 -41
@@ -1,23 +1,100 @@
1
1
  /**
2
- * SourceFeatureState manages the state and state changes
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, state) {
16
+ updateState(sourceLayer, feature, newState) {
12
17
  const changes = (this.#stateChanges[sourceLayer] ??= {});
13
18
  const featureState = (changes[feature] ??= {});
14
- Object.assign(featureState, state);
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
- return Object.assign({}, base?.[feature], changes?.[feature]);
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
- const changes = {};
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 id in this.#stateChanges[sourceLayer]) {
33
- this.#state[sourceLayer][id] ??= {};
34
- Object.assign(this.#state[sourceLayer][id], this.#stateChanges[sourceLayer][id]);
35
- layerStates[id] = this.#state[sourceLayer][id];
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
- changes[sourceLayer] = layerStates;
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
- if (Object.keys(changes).length === 0) return;
146
+ this.#deletedStates = {};
41
147
 
42
- Object.values(tiles).forEach(tile => tile.setFeatureState(changes, painter));
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
- module.exports = SourceFeatureState;
158
+ export default SourceFeatureState;
@@ -1,18 +1,16 @@
1
- const { deepEqual } = require('../util/object');
2
- const uniqueId = require('../util/unique_id');
3
- const { deserialize: deserializeBucket } = require('../data/bucket');
4
- const GeoJSONFeature = require('../util/vectortile_to_geojson');
5
- const featureFilter = require('../style-spec/feature_filter');
6
- const SymbolBucket = require('../data/bucket/symbol_bucket');
7
- const { RasterBoundsArray, CollisionBoxArray } = require('../data/array_types');
8
- const rasterBoundsAttributes = require('../data/raster_bounds_attributes');
9
- const EXTENT = require('../data/extent');
10
- const { default: Point } = require('@mapbox/point-geometry');
11
- const Texture = require('../render/texture');
12
- const SegmentVector = require('../data/segment');
13
- const { TriangleIndexArray } = require('../data/index_array_type');
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()) return;
43
- if (this.fadeEndTime && fadeEndTime < this.fadeEndTime) return;
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, justReloaded) {
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
- // Only vector tiles have rawTileData, and they won't update it for
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
- this.hasSymbolBuckets = false;
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.queryPadding = 0;
104
- for (const id in this.buckets) {
105
- const bucket = this.buckets[id];
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 Object.values(this.buckets)) {
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[layer.id];
134
+ return this.buckets.get(layer.id);
145
135
  }
146
136
 
147
137
  upload(context) {
148
- for (const id in this.buckets) {
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?.rawTileData) return {};
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?.rawTileData) return;
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) return;
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)) return;
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 })) return;
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 tlVertex = new Point(maskCoord.x * vertexExtent, maskCoord.y * vertexExtent);
262
- const brVertex = new Point(tlVertex.x + vertexExtent, tlVertex.y + vertexExtent);
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(tlVertex.x, tlVertex.y, tlVertex.x, tlVertex.y);
268
- maskedBoundsArray.emplaceBack(brVertex.x, tlVertex.y, brVertex.x, tlVertex.y);
269
- maskedBoundsArray.emplaceBack(tlVertex.x, brVertex.y, tlVertex.x, brVertex.y);
270
- maskedBoundsArray.emplaceBack(brVertex.x, brVertex.y, brVertex.x, brVertex.y);
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?.rawTileData || Object.keys(states).length === 0) {
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 in this.buckets) {
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) continue;
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
- module.exports = Tile;
334
+ export default Tile;
@@ -1,40 +1,47 @@
1
- const LngLatBounds = require('../geo/lng_lat_bounds');
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.convert(this.validateBounds(bounds));
8
- this.minzoom = minzoom || 0;
9
- this.maxzoom = maxzoom || 24;
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
- validateBounds(bounds) {
13
- // make sure the bounds property contains valid longitude and latitudes
14
- if (!Array.isArray(bounds) || bounds.length !== 4) return [-180, -90, 180, 90];
15
- return [Math.max(-180, bounds[0]), Math.max(-90, bounds[1]), Math.min(180, bounds[2]), Math.min(90, bounds[3])];
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
- contains(tileID) {
19
- const level = {
20
- minX: Math.floor(this.lngX(this.bounds.getWest(), tileID.z)),
21
- minY: Math.floor(this.latY(this.bounds.getNorth(), tileID.z)),
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
- lngX(lng, zoom) {
30
- return (lng + 180) * (2 ** zoom / 360);
31
- }
37
+ function lngX(lng, zoom) {
38
+ return (lng + 180) * (2 ** zoom / 360);
39
+ }
32
40
 
33
- latY(lat, zoom) {
34
- const f = clamp(Math.sin((Math.PI / 180) * lat), -0.9999, 0.9999);
35
- const scale = 2 ** zoom / (2 * Math.PI);
36
- return 2 ** (zoom - 1) + 0.5 * Math.log((1 + f) / (1 - f)) * -scale;
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
- module.exports = TileBounds;
47
+ export default TileBounds;
@@ -1,4 +1,4 @@
1
- const assert = require('assert');
1
+ import assert from 'assert';
2
2
 
3
3
  /**
4
4
  * A [fifo cache](http://en.wikipedia.org/wiki/Cache_algorithms)
@@ -119,4 +119,4 @@ class TileCache {
119
119
  }
120
120
  }
121
121
 
122
- module.exports = TileCache;
122
+ export default TileCache;
@@ -1,10 +1,7 @@
1
- const { getTileBBox } = require('@mapbox/whoots-js');
1
+ import assert from 'assert';
2
+ import Coordinate from '../geo/coordinate.js';
2
3
 
3
- const assert = require('assert');
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) return true;
95
- if (this.wrap > rhs.wrap) return false;
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) return true;
98
- if (this.overscaledZ > rhs.overscaledZ) return false;
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) return true;
101
- if (this.canonical.x > rhs.canonical.x) return false;
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) return true;
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) wrap = wrap * -1 - 1;
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
- };