@mapwhit/tilerenderer 0.52.0 → 1.0.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 (142) hide show
  1. package/README.md +7 -0
  2. package/build/min/package.json +1 -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 +3 -3
  54. package/src/data/array_types.js +1 -36
  55. package/src/data/bucket/circle_bucket.js +8 -5
  56. package/src/data/bucket/fill_bucket.js +8 -5
  57. package/src/data/bucket/fill_extrusion_bucket.js +8 -5
  58. package/src/data/bucket/heatmap_bucket.js +0 -4
  59. package/src/data/bucket/line_bucket.js +9 -6
  60. package/src/data/bucket/pattern_bucket_features.js +2 -2
  61. package/src/data/bucket/symbol_bucket.js +99 -129
  62. package/src/data/bucket.js +26 -21
  63. package/src/data/dem_data.js +0 -3
  64. package/src/data/feature_index.js +3 -8
  65. package/src/data/program_configuration.js +24 -33
  66. package/src/data/segment.js +0 -4
  67. package/src/render/draw_background.js +3 -3
  68. package/src/render/draw_circle.js +4 -4
  69. package/src/render/draw_fill.js +8 -8
  70. package/src/render/draw_fill_extrusion.js +8 -8
  71. package/src/render/draw_heatmap.js +4 -4
  72. package/src/render/draw_line.js +6 -6
  73. package/src/render/draw_raster.js +6 -6
  74. package/src/render/draw_symbol.js +16 -16
  75. package/src/render/glyph_atlas.js +0 -3
  76. package/src/render/glyph_manager.js +1 -2
  77. package/src/render/image_atlas.js +0 -4
  78. package/src/render/image_manager.js +33 -19
  79. package/src/render/painter.js +13 -14
  80. package/src/render/program/circle_program.js +4 -4
  81. package/src/render/program/fill_extrusion_program.js +1 -1
  82. package/src/render/program/heatmap_program.js +1 -1
  83. package/src/render/program/hillshade_program.js +6 -6
  84. package/src/render/program/line_program.js +3 -3
  85. package/src/render/program/raster_program.js +6 -6
  86. package/src/source/geojson_source.js +15 -24
  87. package/src/source/geojson_worker_source.js +40 -68
  88. package/src/source/geojson_wrapper.js +9 -1
  89. package/src/source/image_source.js +6 -16
  90. package/src/source/query_features.js +4 -5
  91. package/src/source/raster_dem_tile_source.js +45 -64
  92. package/src/source/raster_tile_source.js +1 -6
  93. package/src/source/resources/glyphs.js +2 -2
  94. package/src/source/resources/index.js +3 -9
  95. package/src/source/rtl_text_plugin.js +58 -31
  96. package/src/source/source.js +11 -13
  97. package/src/source/source_cache.js +135 -151
  98. package/src/source/source_state.js +101 -12
  99. package/src/source/tile.js +32 -46
  100. package/src/source/tile_bounds.js +26 -26
  101. package/src/source/tile_id.js +2 -5
  102. package/src/source/vector_tile_source.js +14 -14
  103. package/src/source/vector_tile_worker_source.js +19 -23
  104. package/src/source/worker_tile.js +122 -119
  105. package/src/style/create_style_layer.js +1 -1
  106. package/src/style/pauseable_placement.js +4 -5
  107. package/src/style/properties.js +1 -8
  108. package/src/style/query_utils.js +3 -3
  109. package/src/style/style.js +286 -216
  110. package/src/style/style_layer/circle_style_layer.js +13 -11
  111. package/src/style/style_layer/fill_extrusion_style_layer.js +42 -27
  112. package/src/style/style_layer/fill_style_layer.js +5 -5
  113. package/src/style/style_layer/heatmap_style_layer.js +1 -1
  114. package/src/style/style_layer/hillshade_style_layer.js +1 -1
  115. package/src/style/style_layer/line_style_layer.js +23 -19
  116. package/src/style/style_layer/symbol_style_layer.js +13 -13
  117. package/src/style/style_layer.js +71 -30
  118. package/src/style/style_layer_index.js +16 -41
  119. package/src/symbol/anchor.js +0 -4
  120. package/src/symbol/cross_tile_symbol_index.js +2 -5
  121. package/src/symbol/opacity_state.js +0 -4
  122. package/src/symbol/placement.js +3 -3
  123. package/src/symbol/quads.js +4 -4
  124. package/src/symbol/symbol_layout.js +7 -7
  125. package/src/symbol/transform_text.js +1 -1
  126. package/src/ui/map.js +52 -15
  127. package/src/util/group_layers.js +41 -0
  128. package/src/util/image.js +0 -5
  129. package/src/util/key.js +21 -0
  130. package/src/util/object.js +8 -53
  131. package/src/worker.js +1 -4
  132. package/src/source/resources/images.js +0 -68
  133. package/src/source/worker.js +0 -110
  134. package/src/source/worker_source.js +0 -14
  135. package/src/style-spec/deref.js +0 -51
  136. package/src/style-spec/group_by_layout.js +0 -46
  137. package/src/util/actor.js +0 -108
  138. package/src/util/dispatcher.js +0 -65
  139. package/src/util/global_worker_pool.js +0 -15
  140. package/src/util/transfer_registry.js +0 -168
  141. package/src/util/web_worker_transfer.js +0 -43
  142. package/src/util/worker_pool.js +0 -41
@@ -11,8 +11,8 @@ const {
11
11
  module.exports = drawFill;
12
12
 
13
13
  function drawFill(painter, sourceCache, layer, coords) {
14
- const color = layer.paint.get('fill-color');
15
- const opacity = layer.paint.get('fill-opacity');
14
+ const color = layer._paint.get('fill-color');
15
+ const opacity = layer._paint.get('fill-opacity');
16
16
 
17
17
  if (opacity.constantOr(1) === 0) {
18
18
  return;
@@ -20,7 +20,7 @@ function drawFill(painter, sourceCache, layer, coords) {
20
20
 
21
21
  const colorMode = painter.colorModeForRenderPass();
22
22
 
23
- const pattern = layer.paint.get('fill-pattern');
23
+ const pattern = layer._paint.get('fill-pattern');
24
24
  const pass =
25
25
  painter.opaquePassEnabledForLayer() &&
26
26
  !pattern.constantOr(1) &&
@@ -39,7 +39,7 @@ function drawFill(painter, sourceCache, layer, coords) {
39
39
  }
40
40
 
41
41
  // Draw stroke
42
- if (painter.renderPass === 'translucent' && layer.paint.get('fill-antialias')) {
42
+ if (painter.renderPass === 'translucent' && layer._paint.get('fill-antialias')) {
43
43
  // If we defined a different color for the fill outline, we are
44
44
  // going to ignore the bits in 0x07 and just care about the global
45
45
  // clipping mask.
@@ -59,7 +59,7 @@ function drawFill(painter, sourceCache, layer, coords) {
59
59
  function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode, isOutline) {
60
60
  const gl = painter.context.gl;
61
61
 
62
- const patternProperty = layer.paint.get('fill-pattern');
62
+ const patternProperty = layer._paint.get('fill-pattern');
63
63
  const image = patternProperty?.constantOr(1);
64
64
  const crossfade = layer.getCrossfadeParameters();
65
65
 
@@ -103,8 +103,8 @@ function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode
103
103
  const tileMatrix = painter.translatePosMatrix(
104
104
  coord.posMatrix,
105
105
  tile,
106
- layer.paint.get('fill-translate'),
107
- layer.paint.get('fill-translate-anchor')
106
+ layer._paint.get('fill-translate'),
107
+ layer._paint.get('fill-translate-anchor')
108
108
  );
109
109
 
110
110
  if (!isOutline) {
@@ -135,7 +135,7 @@ function drawFillTiles(painter, sourceCache, layer, coords, depthMode, colorMode
135
135
  bucket.layoutVertexBuffer,
136
136
  indexBuffer,
137
137
  segments,
138
- layer.paint,
138
+ layer._paint,
139
139
  painter.transform.zoom,
140
140
  programConfiguration
141
141
  );
@@ -7,7 +7,7 @@ const { fillExtrusionUniformValues, fillExtrusionPatternUniformValues } = requir
7
7
  module.exports = draw;
8
8
 
9
9
  function draw(painter, source, layer, coords) {
10
- const opacity = layer.paint.get('fill-extrusion-opacity');
10
+ const opacity = layer._paint.get('fill-extrusion-opacity');
11
11
  if (opacity === 0) {
12
12
  return;
13
13
  }
@@ -15,7 +15,7 @@ function draw(painter, source, layer, coords) {
15
15
  if (painter.renderPass === 'translucent') {
16
16
  const depthMode = new DepthMode(painter.context.gl.LEQUAL, DepthMode.ReadWrite, painter.depthRangeFor3D);
17
17
 
18
- if (opacity === 1 && !layer.paint.get('fill-extrusion-pattern').constantOr(1)) {
18
+ if (opacity === 1 && !layer._paint.get('fill-extrusion-pattern').constantOr(1)) {
19
19
  const colorMode = painter.colorModeForRenderPass();
20
20
  drawExtrusionTiles(painter, source, layer, coords, depthMode, StencilMode.disabled, colorMode);
21
21
  } else {
@@ -43,10 +43,10 @@ function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMo
43
43
  const context = painter.context;
44
44
  const gl = context.gl;
45
45
 
46
- const patternProperty = layer.paint.get('fill-extrusion-pattern');
46
+ const patternProperty = layer._paint.get('fill-extrusion-pattern');
47
47
  const image = patternProperty.constantOr(1);
48
48
  const crossfade = layer.getCrossfadeParameters();
49
- const opacity = layer.paint.get('fill-extrusion-opacity');
49
+ const opacity = layer._paint.get('fill-extrusion-opacity');
50
50
 
51
51
  for (const coord of coords) {
52
52
  const tile = source.getTile(coord);
@@ -72,11 +72,11 @@ function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMo
72
72
  const matrix = painter.translatePosMatrix(
73
73
  coord.posMatrix,
74
74
  tile,
75
- layer.paint.get('fill-extrusion-translate'),
76
- layer.paint.get('fill-extrusion-translate-anchor')
75
+ layer._paint.get('fill-extrusion-translate'),
76
+ layer._paint.get('fill-extrusion-translate-anchor')
77
77
  );
78
78
 
79
- const shouldUseVerticalGradient = layer.paint.get('fill-extrusion-vertical-gradient');
79
+ const shouldUseVerticalGradient = layer._paint.get('fill-extrusion-vertical-gradient');
80
80
  const uniformValues = image
81
81
  ? fillExtrusionPatternUniformValues(matrix, painter, shouldUseVerticalGradient, opacity, coord, crossfade, tile)
82
82
  : fillExtrusionUniformValues(matrix, painter, shouldUseVerticalGradient, opacity);
@@ -93,7 +93,7 @@ function drawExtrusionTiles(painter, source, layer, coords, depthMode, stencilMo
93
93
  bucket.layoutVertexBuffer,
94
94
  bucket.indexBuffer,
95
95
  bucket.segments,
96
- layer.paint,
96
+ layer._paint,
97
97
  painter.transform.zoom,
98
98
  programConfiguration
99
99
  );
@@ -9,7 +9,7 @@ const { heatmapUniformValues, heatmapTextureUniformValues } = require('./program
9
9
  module.exports = drawHeatmap;
10
10
 
11
11
  function drawHeatmap(painter, sourceCache, layer, coords) {
12
- if (layer.paint.get('heatmap-opacity') === 0) {
12
+ if (layer._paint.get('heatmap-opacity') === 0) {
13
13
  return;
14
14
  }
15
15
 
@@ -51,12 +51,12 @@ function drawHeatmap(painter, sourceCache, layer, coords) {
51
51
  stencilMode,
52
52
  colorMode,
53
53
  CullFaceMode.disabled,
54
- heatmapUniformValues(coord.posMatrix, tile, zoom, layer.paint.get('heatmap-intensity')),
54
+ heatmapUniformValues(coord.posMatrix, tile, zoom, layer._paint.get('heatmap-intensity')),
55
55
  layer.id,
56
56
  bucket.layoutVertexBuffer,
57
57
  bucket.indexBuffer,
58
58
  bucket.segments,
59
- layer.paint,
59
+ layer._paint,
60
60
  painter.transform.zoom,
61
61
  programConfiguration
62
62
  );
@@ -153,7 +153,7 @@ function renderTextureToMap(painter, layer) {
153
153
  painter.viewportBuffer,
154
154
  painter.quadTriangleIndexBuffer,
155
155
  painter.viewportSegments,
156
- layer.paint,
156
+ layer._paint,
157
157
  painter.transform.zoom
158
158
  );
159
159
  }
@@ -11,17 +11,17 @@ const {
11
11
  module.exports = function drawLine(painter, sourceCache, layer, coords) {
12
12
  if (painter.renderPass !== 'translucent') return;
13
13
 
14
- const opacity = layer.paint.get('line-opacity');
15
- const width = layer.paint.get('line-width');
14
+ const opacity = layer._paint.get('line-opacity');
15
+ const width = layer._paint.get('line-width');
16
16
  if (opacity.constantOr(1) === 0 || width.constantOr(1) === 0) return;
17
17
 
18
18
  const depthMode = painter.depthModeForSublayer(0, DepthMode.ReadOnly);
19
19
  const colorMode = painter.colorModeForRenderPass();
20
20
 
21
- const dasharray = layer.paint.get('line-dasharray');
22
- const patternProperty = layer.paint.get('line-pattern');
21
+ const dasharray = layer._paint.get('line-dasharray');
22
+ const patternProperty = layer._paint.get('line-pattern');
23
23
  const image = patternProperty.constantOr(1);
24
- const gradient = layer.paint.get('line-gradient');
24
+ const gradient = layer._paint.get('line-gradient');
25
25
  const crossfade = layer.getCrossfadeParameters();
26
26
 
27
27
  const programId = dasharray ? 'lineSDF' : image ? 'linePattern' : gradient ? 'lineGradient' : 'line';
@@ -88,7 +88,7 @@ module.exports = function drawLine(painter, sourceCache, layer, coords) {
88
88
  bucket.layoutVertexBuffer,
89
89
  bucket.indexBuffer,
90
90
  bucket.segments,
91
- layer.paint,
91
+ layer._paint,
92
92
  painter.transform.zoom,
93
93
  programConfiguration
94
94
  );
@@ -11,7 +11,7 @@ module.exports = drawRaster;
11
11
 
12
12
  function drawRaster(painter, sourceCache, layer, coords) {
13
13
  if (painter.renderPass !== 'translucent') return;
14
- if (layer.paint.get('raster-opacity') === 0) return;
14
+ if (layer._paint.get('raster-opacity') === 0) return;
15
15
 
16
16
  const context = painter.context;
17
17
  const gl = context.gl;
@@ -27,14 +27,14 @@ function drawRaster(painter, sourceCache, layer, coords) {
27
27
  // Use gl.LESS to prevent double drawing in areas where tiles overlap.
28
28
  const depthMode = painter.depthModeForSublayer(
29
29
  coord.overscaledZ - minTileZ,
30
- layer.paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly,
30
+ layer._paint.get('raster-opacity') === 1 ? DepthMode.ReadWrite : DepthMode.ReadOnly,
31
31
  gl.LESS
32
32
  );
33
33
 
34
34
  const tile = sourceCache.getTile(coord);
35
35
  const posMatrix = painter.transform.calculatePosMatrix(coord.toUnwrapped(), align);
36
36
 
37
- tile.registerFadeDuration(layer.paint.get('raster-fade-duration'));
37
+ tile.registerFadeDuration(layer._paint.get('raster-fade-duration'));
38
38
 
39
39
  const parentTile = sourceCache.findLoadedParent(coord, 0);
40
40
  const fade = getFadeValues(tile, parentTile, sourceCache, layer, painter.transform);
@@ -42,7 +42,7 @@ function drawRaster(painter, sourceCache, layer, coords) {
42
42
  let parentScaleBy;
43
43
  let parentTL;
44
44
 
45
- const textureFilter = layer.paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR;
45
+ const textureFilter = layer._paint.get('raster-resampling') === 'nearest' ? gl.NEAREST : gl.LINEAR;
46
46
 
47
47
  context.activeTexture.set(gl.TEXTURE0);
48
48
  tile.texture.bind(textureFilter, gl.CLAMP_TO_EDGE, gl.LINEAR_MIPMAP_NEAREST);
@@ -86,7 +86,7 @@ function drawRaster(painter, sourceCache, layer, coords) {
86
86
  tile.maskedBoundsBuffer,
87
87
  tile.maskedIndexBuffer,
88
88
  tile.segments,
89
- layer.paint,
89
+ layer._paint,
90
90
  painter.transform.zoom
91
91
  );
92
92
  } else {
@@ -108,7 +108,7 @@ function drawRaster(painter, sourceCache, layer, coords) {
108
108
  }
109
109
 
110
110
  function getFadeValues(tile, parentTile, sourceCache, layer, transform) {
111
- const fadeDuration = layer.paint.get('raster-fade-duration');
111
+ const fadeDuration = layer._paint.get('raster-fade-duration');
112
112
 
113
113
  if (fadeDuration > 0) {
114
114
  const now = browser.now();
@@ -21,35 +21,35 @@ function drawSymbols(painter, sourceCache, layer, coords) {
21
21
  const stencilMode = StencilMode.disabled;
22
22
  const colorMode = painter.colorModeForRenderPass();
23
23
 
24
- if (layer.paint.get('icon-opacity').constantOr(1) !== 0) {
24
+ if (layer._paint.get('icon-opacity').constantOr(1) !== 0) {
25
25
  drawLayerSymbols(
26
26
  painter,
27
27
  sourceCache,
28
28
  layer,
29
29
  coords,
30
30
  false,
31
- layer.paint.get('icon-translate'),
32
- layer.paint.get('icon-translate-anchor'),
33
- layer.layout.get('icon-rotation-alignment'),
34
- layer.layout.get('icon-pitch-alignment'),
35
- layer.layout.get('icon-keep-upright'),
31
+ layer._paint.get('icon-translate'),
32
+ layer._paint.get('icon-translate-anchor'),
33
+ layer._layout.get('icon-rotation-alignment'),
34
+ layer._layout.get('icon-pitch-alignment'),
35
+ layer._layout.get('icon-keep-upright'),
36
36
  stencilMode,
37
37
  colorMode
38
38
  );
39
39
  }
40
40
 
41
- if (layer.paint.get('text-opacity').constantOr(1) !== 0) {
41
+ if (layer._paint.get('text-opacity').constantOr(1) !== 0) {
42
42
  drawLayerSymbols(
43
43
  painter,
44
44
  sourceCache,
45
45
  layer,
46
46
  coords,
47
47
  true,
48
- layer.paint.get('text-translate'),
49
- layer.paint.get('text-translate-anchor'),
50
- layer.layout.get('text-rotation-alignment'),
51
- layer.layout.get('text-pitch-alignment'),
52
- layer.layout.get('text-keep-upright'),
48
+ layer._paint.get('text-translate'),
49
+ layer._paint.get('text-translate-anchor'),
50
+ layer._layout.get('text-rotation-alignment'),
51
+ layer._layout.get('text-pitch-alignment'),
52
+ layer._layout.get('text-keep-upright'),
53
53
  stencilMode,
54
54
  colorMode
55
55
  );
@@ -80,7 +80,7 @@ function drawLayerSymbols(
80
80
 
81
81
  const rotateWithMap = rotationAlignment === 'map';
82
82
  const pitchWithMap = pitchAlignment === 'map';
83
- const alongLine = rotateWithMap && layer.layout.get('symbol-placement') !== 'point';
83
+ const alongLine = rotateWithMap && layer._layout.get('symbol-placement') !== 'point';
84
84
  // Line label rotation happens in `updateLineLabels`
85
85
  // Pitched point labels are automatically rotated by the labelPlaneMatrix projection
86
86
  // Unpitched point labels need to have their rotation applied after projection
@@ -119,7 +119,7 @@ function drawLayerSymbols(
119
119
  tile.glyphAtlasTexture.bind(gl.LINEAR, gl.CLAMP_TO_EDGE);
120
120
  texSize = tile.glyphAtlasTexture.size;
121
121
  } else {
122
- const iconScaled = layer.layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear;
122
+ const iconScaled = layer._layout.get('icon-size').constantOr(0) !== 1 || bucket.iconsNeedLinear;
123
123
  const iconTransformed = pitchWithMap || tr.pitch !== 0;
124
124
 
125
125
  tile.imageAtlasTexture.bind(
@@ -167,7 +167,7 @@ function drawLayerSymbols(
167
167
 
168
168
  let uniformValues;
169
169
  if (isSDF) {
170
- const hasHalo = layer.paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0;
170
+ const hasHalo = layer._paint.get(isText ? 'text-halo-width' : 'icon-halo-width').constantOr(1) !== 0;
171
171
 
172
172
  uniformValues = symbolSDFUniformValues(
173
173
  sizeData.functionType,
@@ -222,7 +222,7 @@ function drawSymbolElements(buffers, layer, painter, program, depthMode, stencil
222
222
  buffers.layoutVertexBuffer,
223
223
  buffers.indexBuffer,
224
224
  buffers.segments,
225
- layer.paint,
225
+ layer._paint,
226
226
  painter.transform.zoom,
227
227
  buffers.programConfigurations.get(layer.id),
228
228
  buffers.dynamicLayoutVertexBuffer,
@@ -1,5 +1,4 @@
1
1
  const { AlphaImage } = require('../util/image');
2
- const { register } = require('../util/transfer_registry');
3
2
  const { default: potpack } = require('potpack');
4
3
 
5
4
  const padding = 1;
@@ -47,6 +46,4 @@ class GlyphAtlas {
47
46
  }
48
47
  }
49
48
 
50
- register('GlyphAtlas', GlyphAtlas);
51
-
52
49
  module.exports = GlyphAtlas;
@@ -8,8 +8,7 @@ class GlyphManager {
8
8
  async loadGlyphRange(stack, range) {
9
9
  this.#cache[stack] ??= {};
10
10
  const promise = (this.#cache[stack][range] ??= this.loader(stack, range));
11
- const response = await promise;
12
- return response.slice();
11
+ return await promise;
13
12
  }
14
13
  }
15
14
 
@@ -1,5 +1,4 @@
1
1
  const { RGBAImage } = require('../util/image');
2
- const { register } = require('../util/transfer_registry');
3
2
  const { default: potpack } = require('potpack');
4
3
 
5
4
  const padding = 1;
@@ -89,6 +88,3 @@ class ImageAtlas {
89
88
 
90
89
  ImageAtlas.ImagePosition = ImagePosition;
91
90
  module.exports = ImageAtlas;
92
-
93
- register('ImagePosition', ImagePosition);
94
- register('ImageAtlas', ImageAtlas);
@@ -23,10 +23,11 @@ const padding = 1;
23
23
  */
24
24
  class ImageManager {
25
25
  #loadedState = Promise.withResolvers();
26
+ #imageQueue = new Map();
26
27
  constructor() {
27
- this.images = {};
28
+ this.images = new Map();
28
29
 
29
- this.patterns = {};
30
+ this.patterns = new Map();
30
31
  this.atlasImage = new RGBAImage({ width: 1, height: 1 });
31
32
  this.dirty = true;
32
33
  }
@@ -44,22 +45,31 @@ class ImageManager {
44
45
  }
45
46
 
46
47
  getImage(id) {
47
- return this.images[id];
48
+ return this.images.get(id);
48
49
  }
49
50
 
50
51
  addImage(id, image) {
51
- assert(!this.images[id]);
52
- this.images[id] = image;
52
+ assert(!(this.images.has(id) || this.#imageQueue.has(id)));
53
+ if (image.promise) {
54
+ this.#imageQueue.set(id, image.promise);
55
+ image.promise.then(image => {
56
+ this.#imageQueue.delete(id);
57
+ this.images.set(id, image);
58
+ });
59
+ return;
60
+ }
61
+ this.images.set(id, image);
53
62
  }
54
63
 
55
64
  removeImage(id) {
56
- assert(this.images[id]);
57
- delete this.images[id];
58
- delete this.patterns[id];
65
+ assert(this.images.has(id) || this.#imageQueue.has(id));
66
+ this.images.delete(id);
67
+ this.#imageQueue.delete(id);
68
+ this.patterns.delete(id);
59
69
  }
60
70
 
61
71
  listImages() {
62
- return Object.keys(this.images);
72
+ return Array.from(this.images.keys());
63
73
  }
64
74
 
65
75
  async getImages(ids) {
@@ -67,11 +77,16 @@ class ImageManager {
67
77
 
68
78
  const response = {};
69
79
  for (const id of ids) {
70
- const image = this.images[id];
80
+ let image = this.images.get(id);
81
+ if (!image) {
82
+ if (!this.#imageQueue.has(id)) {
83
+ continue;
84
+ }
85
+ image = await this.#imageQueue.get(id);
86
+ }
71
87
  if (image) {
72
- // Clone the image so that our own copy of its ArrayBuffer doesn't get transferred.
73
88
  response[id] = {
74
- data: image.data.clone(),
89
+ data: image.data,
75
90
  pixelRatio: image.pixelRatio,
76
91
  sdf: image.sdf
77
92
  };
@@ -88,7 +103,7 @@ class ImageManager {
88
103
  }
89
104
 
90
105
  getPattern(id) {
91
- const pattern = this.patterns[id];
106
+ const pattern = this.patterns.get(id);
92
107
  if (pattern) {
93
108
  return pattern.position;
94
109
  }
@@ -102,7 +117,7 @@ class ImageManager {
102
117
  const h = image.data.height + padding * 2;
103
118
  const bin = { w, h, x: 0, y: 0 };
104
119
  const position = new ImagePosition(bin, image);
105
- this.patterns[id] = { bin, position };
120
+ this.patterns.set(id, { bin, position });
106
121
  this._updatePatternAtlas();
107
122
 
108
123
  return position;
@@ -122,8 +137,8 @@ class ImageManager {
122
137
 
123
138
  _updatePatternAtlas() {
124
139
  const bins = [];
125
- for (const id in this.patterns) {
126
- bins.push(this.patterns[id].bin);
140
+ for (const { bin } of this.patterns.values()) {
141
+ bins.push(bin);
127
142
  }
128
143
 
129
144
  const { w, h } = potpack(bins);
@@ -131,11 +146,10 @@ class ImageManager {
131
146
  const dst = this.atlasImage;
132
147
  dst.resize({ width: w ?? 1, height: h ?? 1 });
133
148
 
134
- for (const id in this.patterns) {
135
- const { bin } = this.patterns[id];
149
+ for (const [id, { bin }] of this.patterns) {
136
150
  const x = bin.x + padding;
137
151
  const y = bin.y + padding;
138
- const src = this.images[id].data;
152
+ const src = this.images.get(id).data;
139
153
  const w = src.width;
140
154
  const h = src.height;
141
155
 
@@ -83,8 +83,8 @@ class Painter {
83
83
  this.context.viewport.set([0, 0, this.width, this.height]);
84
84
 
85
85
  if (this.style) {
86
- for (const layerId of this.style._order) {
87
- this.style._layers[layerId].resize();
86
+ for (const layer of this.style._layers.values()) {
87
+ layer.resize();
88
88
  }
89
89
  }
90
90
 
@@ -284,8 +284,7 @@ class Painter {
284
284
 
285
285
  this.symbolFadeChange = style.placement.symbolFadeChange(browser.now());
286
286
 
287
- const layerIds = this.style._order;
288
- const sourceCaches = this.style.sourceCaches;
287
+ const sourceCaches = style._sources;
289
288
 
290
289
  for (const id in sourceCaches) {
291
290
  const sourceCache = sourceCaches[id];
@@ -314,10 +313,11 @@ class Painter {
314
313
  updateTileMasks(visibleTiles, this.context);
315
314
  }
316
315
 
316
+ const layers = Array.from(style._layers.values());
317
+
317
318
  this.opaquePassCutoff = Number.POSITIVE_INFINITY;
318
- for (let i = 0; i < layerIds.length; i++) {
319
- const layerId = layerIds[i];
320
- if (this.style._layers[layerId].is3D()) {
319
+ for (let i = 0; i < layers.length; i++) {
320
+ if (layers[i].is3D()) {
321
321
  this.opaquePassCutoff = i;
322
322
  break;
323
323
  }
@@ -330,8 +330,7 @@ class Painter {
330
330
  this.renderPass = 'offscreen';
331
331
  this.depthRboNeedsClear = true;
332
332
 
333
- for (const layerId of layerIds) {
334
- const layer = this.style._layers[layerId];
333
+ for (const layer of layers) {
335
334
  if (!layer.hasOffscreenPass() || layer.isHidden(this.transform.zoom)) continue;
336
335
 
337
336
  const coords = coordsDescending[layer.source];
@@ -349,14 +348,14 @@ class Painter {
349
348
  this.clearStencil();
350
349
 
351
350
  this._showOverdrawInspector = options.showOverdrawInspector;
352
- this.depthRangeFor3D = [0, 1 - (style._order.length + 2) * this.numSublayers * this.depthEpsilon];
351
+ this.depthRangeFor3D = [0, 1 - (style._layers.size + 2) * this.numSublayers * this.depthEpsilon];
353
352
 
354
353
  // Opaque pass ===============================================
355
354
  // Draw opaque layers top-to-bottom first.
356
355
  this.renderPass = 'opaque';
357
356
 
358
- for (this.currentLayer = layerIds.length - 1; this.currentLayer >= 0; this.currentLayer--) {
359
- const layer = this.style._layers[layerIds[this.currentLayer]];
357
+ for (this.currentLayer = layers.length - 1; this.currentLayer >= 0; this.currentLayer--) {
358
+ const layer = layers[this.currentLayer];
360
359
  const sourceCache = sourceCaches[layer.source];
361
360
  const coords = coordsAscending[layer.source];
362
361
 
@@ -368,8 +367,8 @@ class Painter {
368
367
  // Draw all other layers bottom-to-top.
369
368
  this.renderPass = 'translucent';
370
369
 
371
- for (this.currentLayer = 0; this.currentLayer < layerIds.length; this.currentLayer++) {
372
- const layer = this.style._layers[layerIds[this.currentLayer]];
370
+ for (this.currentLayer = 0; this.currentLayer < layers.length; this.currentLayer++) {
371
+ const layer = layers[this.currentLayer];
373
372
  const sourceCache = sourceCaches[layer.source];
374
373
 
375
374
  // For symbol layers in the translucent pass, we add extra tiles to the renderable set
@@ -14,7 +14,7 @@ const circleUniformValues = (painter, coord, tile, layer) => {
14
14
 
15
15
  let pitchWithMap;
16
16
  let extrudeScale;
17
- if (layer.paint.get('circle-pitch-alignment') === 'map') {
17
+ if (layer._paint.get('circle-pitch-alignment') === 'map') {
18
18
  const pixelRatio = pixelsToTileUnits(tile, 1, transform.zoom);
19
19
  pitchWithMap = true;
20
20
  extrudeScale = [pixelRatio, pixelRatio];
@@ -25,12 +25,12 @@ const circleUniformValues = (painter, coord, tile, layer) => {
25
25
 
26
26
  return {
27
27
  u_camera_to_center_distance: transform.cameraToCenterDistance,
28
- u_scale_with_map: +(layer.paint.get('circle-pitch-scale') === 'map'),
28
+ u_scale_with_map: +(layer._paint.get('circle-pitch-scale') === 'map'),
29
29
  u_matrix: painter.translatePosMatrix(
30
30
  coord.posMatrix,
31
31
  tile,
32
- layer.paint.get('circle-translate'),
33
- layer.paint.get('circle-translate-anchor')
32
+ layer._paint.get('circle-translate'),
33
+ layer._paint.get('circle-translate-anchor')
34
34
  ),
35
35
  u_pitch_with_map: +pitchWithMap,
36
36
  u_extrude_scale: extrudeScale
@@ -29,7 +29,7 @@ const fillExtrusionPatternUniforms = (context, locations) => ({
29
29
  });
30
30
 
31
31
  const fillExtrusionUniformValues = (matrix, painter, shouldUseVerticalGradient, opacity) => {
32
- const light = painter.style.light;
32
+ const light = painter.style._light;
33
33
  const _lp = light.properties.get('position');
34
34
  const lightPos = [_lp.x, _lp.y, _lp.z];
35
35
  const lightMat = mat3.create();
@@ -34,7 +34,7 @@ const heatmapTextureUniformValues = (painter, layer, textureUnit, colorRampUnit)
34
34
  u_world: [gl.drawingBufferWidth, gl.drawingBufferHeight],
35
35
  u_image: textureUnit,
36
36
  u_color_ramp: colorRampUnit,
37
- u_opacity: layer.paint.get('heatmap-opacity')
37
+ u_opacity: layer._paint.get('heatmap-opacity')
38
38
  };
39
39
  };
40
40
 
@@ -24,13 +24,13 @@ const hillshadePrepareUniforms = (context, locations) => ({
24
24
  });
25
25
 
26
26
  const hillshadeUniformValues = (painter, tile, layer) => {
27
- const shadow = layer.paint.get('hillshade-shadow-color');
28
- const highlight = layer.paint.get('hillshade-highlight-color');
29
- const accent = layer.paint.get('hillshade-accent-color');
27
+ const shadow = layer._paint.get('hillshade-shadow-color');
28
+ const highlight = layer._paint.get('hillshade-highlight-color');
29
+ const accent = layer._paint.get('hillshade-accent-color');
30
30
 
31
- let azimuthal = layer.paint.get('hillshade-illumination-direction') * (Math.PI / 180);
31
+ let azimuthal = layer._paint.get('hillshade-illumination-direction') * (Math.PI / 180);
32
32
  // modify azimuthal angle by map rotation if light is anchored at the viewport
33
- if (layer.paint.get('hillshade-illumination-anchor') === 'viewport') {
33
+ if (layer._paint.get('hillshade-illumination-anchor') === 'viewport') {
34
34
  azimuthal -= painter.transform.angle;
35
35
  }
36
36
  const align = !painter.options.moving;
@@ -38,7 +38,7 @@ const hillshadeUniformValues = (painter, tile, layer) => {
38
38
  u_matrix: painter.transform.calculatePosMatrix(tile.tileID.toUnwrapped(), align),
39
39
  u_image: 0,
40
40
  u_latrange: getTileLatRange(painter, tile.tileID),
41
- u_light: [layer.paint.get('hillshade-exaggeration'), azimuthal],
41
+ u_light: [layer._paint.get('hillshade-exaggeration'), azimuthal],
42
42
  u_shadow: shadow,
43
43
  u_highlight: highlight,
44
44
  u_accent: accent
@@ -75,7 +75,7 @@ const lineSDFUniformValues = (painter, tile, layer, dasharray, crossfade) => {
75
75
  const lineAtlas = painter.lineAtlas;
76
76
  const tileRatio = calculateTileRatio(tile, transform);
77
77
 
78
- const round = layer.layout.get('line-cap') === 'round';
78
+ const round = layer._layout.get('line-cap') === 'round';
79
79
 
80
80
  const posA = lineAtlas.getDash(dasharray.from, round);
81
81
  const posB = lineAtlas.getDash(dasharray.to, round);
@@ -102,8 +102,8 @@ function calculateMatrix(painter, tile, layer) {
102
102
  return painter.translatePosMatrix(
103
103
  tile.tileID.posMatrix,
104
104
  tile,
105
- layer.paint.get('line-translate'),
106
- layer.paint.get('line-translate-anchor')
105
+ layer._paint.get('line-translate'),
106
+ layer._paint.get('line-translate-anchor')
107
107
  );
108
108
  }
109
109
 
@@ -22,14 +22,14 @@ const rasterUniformValues = (matrix, parentTL, parentScaleBy, fade, layer) => ({
22
22
  u_scale_parent: parentScaleBy,
23
23
  u_buffer_scale: 1,
24
24
  u_fade_t: fade.mix,
25
- u_opacity: fade.opacity * layer.paint.get('raster-opacity'),
25
+ u_opacity: fade.opacity * layer._paint.get('raster-opacity'),
26
26
  u_image0: 0,
27
27
  u_image1: 1,
28
- u_brightness_low: layer.paint.get('raster-brightness-min'),
29
- u_brightness_high: layer.paint.get('raster-brightness-max'),
30
- u_saturation_factor: saturationFactor(layer.paint.get('raster-saturation')),
31
- u_contrast_factor: contrastFactor(layer.paint.get('raster-contrast')),
32
- u_spin_weights: spinWeights(layer.paint.get('raster-hue-rotate'))
28
+ u_brightness_low: layer._paint.get('raster-brightness-min'),
29
+ u_brightness_high: layer._paint.get('raster-brightness-max'),
30
+ u_saturation_factor: saturationFactor(layer._paint.get('raster-saturation')),
31
+ u_contrast_factor: contrastFactor(layer._paint.get('raster-contrast')),
32
+ u_spin_weights: spinWeights(layer._paint.get('raster-hue-rotate'))
33
33
  });
34
34
 
35
35
  function spinWeights(angle) {