@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,17 +1,16 @@
1
- const { Event, ErrorEvent, Evented } = require('@mapwhit/events');
2
- const { pick } = require('../util/object');
3
- const loadTileJSON = require('./load_tilejson');
4
- const TileBounds = require('./tile_bounds');
5
- const browser = require('../util/browser');
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
- constructor(id, options, dispatcher, eventedParent) {
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) this.tileBounds = new TileBounds(tileJSON.bounds, this.minzoom, this.maxzoom);
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.slice() },
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 ??= this.dispatcher.nextWorkerId();
101
- const data = await this.dispatcher.send('loadTile', params, tile.workerID);
102
- data.rawTileData = rawData;
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
- module.exports = VectorTileSource;
130
+ export default VectorTileSource;
@@ -1,19 +1,6 @@
1
- const { VectorTile } = require('@mapwhit/vector-tile');
2
- const Protobuf = require('@mapwhit/pbf');
3
- const WorkerTile = require('./worker_tile');
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, loadVectorData = loadVectorTile) {
21
+ constructor(resources, layerIndex) {
35
22
  this.resources = resources;
36
23
  this.layerIndex = layerIndex;
37
- this.loadVectorData = loadVectorData;
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, rawData } = response;
51
- const workerTile = new WorkerTile(params);
52
- workerTile.globalState = params.globalState;
53
- workerTile.vectorTile = vectorTile;
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
- module.exports = VectorTileWorkerSource;
58
+ export default VectorTileWorkerSource;
@@ -1,148 +1,155 @@
1
- const FeatureIndex = require('../data/feature_index');
2
-
3
- const { performSymbolLayout } = require('../symbol/symbol_layout');
4
- const { CollisionBoxArray } = require('../data/array_types');
5
- const dictionaryCoder = require('../util/dictionary_coder');
6
- const SymbolBucket = require('../data/bucket/symbol_bucket');
7
- const LineBucket = require('../data/bucket/line_bucket');
8
- const FillBucket = require('../data/bucket/fill_bucket');
9
- const FillExtrusionBucket = require('../data/bucket/fill_extrusion_bucket');
10
- const { mapObject, values } = require('../util/object');
11
- const warn = require('../util/warn');
12
- const assert = require('assert');
13
- const ImageAtlas = require('../render/image_atlas');
14
- const GlyphAtlas = require('../render/glyph_atlas');
15
- const EvaluationParameters = require('../style/evaluation_parameters');
16
- const { OverscaledTileID } = require('./tile_id');
17
-
18
- class WorkerTile {
19
- constructor(params) {
20
- this.tileID = new OverscaledTileID(
21
- params.tileID.overscaledZ,
22
- params.tileID.wrap,
23
- params.tileID.canonical.z,
24
- params.tileID.canonical.x,
25
- params.tileID.canonical.y
26
- );
27
- this.uid = params.uid;
28
- this.zoom = params.zoom;
29
- this.pixelRatio = params.pixelRatio;
30
- this.tileSize = params.tileSize;
31
- this.source = params.source;
32
- this.overscaling = this.tileID.overscaleFactor();
33
- this.showCollisionBoxes = params.showCollisionBoxes;
34
- this.globalState = params.globalState;
35
- }
36
-
37
- async parse(data, layerIndex, resources) {
38
- this.status = 'parsing';
39
- this.data = data;
40
-
41
- this.collisionBoxArray = new CollisionBoxArray();
42
- const sourceLayerCoder = dictionaryCoder(Object.keys(data.layers));
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 buckets = {};
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 options = {
50
- featureIndex,
51
- iconDependencies: {},
52
- patternDependencies: {},
53
- glyphDependencies: {}
54
- };
50
+ for (const layers of sourceLayerFamilies.values()) {
51
+ const layer = layers[0];
55
52
 
56
- const layerFamilies = layerIndex.familiesBySource[this.source];
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
- if (sourceLayer.version === 1) {
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
- const sourceLayerIndex = sourceLayerCoder.encode(sourceLayerId);
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
- for (const family of layerFamilies[sourceLayerId]) {
78
- const layer = family[0];
79
-
80
- assert(layer.source === this.source);
81
- if (layer.minzoom && this.zoom < Math.floor(layer.minzoom)) continue;
82
- if (layer.maxzoom && this.zoom >= layer.maxzoom) continue;
83
- if (layer.visibility === 'none') continue;
84
-
85
- recalculateLayers(family, this.zoom, this.globalState);
86
-
87
- const bucket = (buckets[layer.id] = layer.createBucket({
88
- index: featureIndex.bucketLayerIDs.length,
89
- layers: family,
90
- zoom: this.zoom,
91
- pixelRatio: this.pixelRatio,
92
- overscaling: this.overscaling,
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
- const stacks = mapObject(options.glyphDependencies, glyphs => Object.keys(glyphs).map(Number));
105
- const icons = Object.keys(options.iconDependencies);
106
- const patterns = Object.keys(options.patternDependencies);
107
- const tasks = [
108
- Object.keys(stacks).length ? resources.getGlyphs({ uid: this.uid, stacks }) : {},
109
- icons.length ? resources.getImages({ icons }) : {},
110
- patterns.length ? resources.getImages({ icons: patterns }) : {}
111
- ];
112
- const [glyphMap, iconMap, patternMap] = await Promise.all(tasks);
113
- const glyphAtlas = new GlyphAtlas(glyphMap);
114
- const imageAtlas = new ImageAtlas(iconMap, patternMap);
115
-
116
- for (const key in buckets) {
117
- const bucket = buckets[key];
118
- if (bucket instanceof SymbolBucket) {
119
- recalculateLayers(bucket.layers, this.zoom, this.globalState);
120
- performSymbolLayout(
121
- bucket,
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
- const circle = require('./style_layer/circle_style_layer');
2
- const heatmap = require('./style_layer/heatmap_style_layer');
3
- const hillshade = require('./style_layer/hillshade_style_layer');
4
- const fill = require('./style_layer/fill_style_layer');
5
- const fillExtrusion = require('./style_layer/fill_extrusion_style_layer');
6
- const line = require('./style_layer/line_style_layer');
7
- const symbol = require('./style_layer/symbol_style_layer');
8
- const background = require('./style_layer/background_style_layer');
9
- const raster = require('./style_layer/raster_style_layer');
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
- module.exports = function createStyleLayer(layer) {
23
+ export default function createStyleLayer(layer) {
24
24
  return new subclasses[layer.type](layer);
25
- };
25
+ }
@@ -1,8 +1,8 @@
1
- const ZoomHistory = require('./zoom_history');
2
- const { isStringInSupportedScript } = require('../util/script_detection');
3
- const { plugin: rtlTextPlugin } = require('../source/rtl_text_plugin');
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;
@@ -1,6 +1,6 @@
1
- const { sphericalToCartesian } = require('../util/util');
2
- const { Evented } = require('@mapwhit/events');
3
- const interpolate = require('../util/interpolate');
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
- const { Properties, Transitionable, DataConstantProperty } = require('./properties');
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
- module.exports = Light;
112
+ export default Light;
@@ -1,10 +1,10 @@
1
- const browser = require('../util/browser');
2
- const { RGBAImage } = require('../util/image');
3
- const loadImage = require('../util/loader/image');
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
- module.exports = loadSprite;
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
- const { AlphaImage } = require('../util/image');
1
+ import Protobuf from '@mapwhit/pbf';
2
+ import { AlphaImage } from '../util/image.js';
2
3
 
3
- const Protobuf = require('@mapwhit/pbf');
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 * border,
20
- height: height + 2 * border
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) glyph.id = pbf.readVarint();
31
- else if (tag === 2) glyph.bitmap = pbf.readBytes();
32
- else if (tag === 3) glyph.width = pbf.readVarint();
33
- else if (tag === 4) glyph.height = pbf.readVarint();
34
- else if (tag === 5) glyph.left = pbf.readSVarint();
35
- else if (tag === 6) glyph.top = pbf.readSVarint();
36
- else if (tag === 7) glyph.advance = pbf.readVarint();
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
- const browser = require('../util/browser');
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, order, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions) {
24
+ constructor(transform, maxIndex, forceFullPlacement, showCollisionBoxes, fadeDuration, crossSourceCollisions) {
26
25
  this.placement = new Placement(transform, fadeDuration, crossSourceCollisions);
27
- this._currentPlacementIndex = order.length - 1;
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(order, layers, layerTiles) {
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 layerId = order[this._currentPlacementIndex];
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
- module.exports = PauseablePlacement;
86
+ export default PauseablePlacement;