maplibre-gl 2.0.4 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/{banner.js → banner.ts} +1 -1
- package/build/generate-query-test-fixtures.ts +123 -0
- package/build/generate-shaders.ts +35 -0
- package/build/generate-struct-arrays.ts +7 -7
- package/build/generate-style-code.ts +8 -8
- package/build/generate-style-spec.ts +5 -4
- package/build/generate-typings.ts +16 -0
- package/build/readme.md +8 -18
- package/build/release-notes.js +9 -13
- package/build/{rollup_plugin_minify_style_spec.js → rollup_plugin_minify_style_spec.ts} +4 -3
- package/build/{rollup_plugins.js → rollup_plugins.ts} +12 -26
- package/dist/maplibre-gl-dev.js +54885 -0
- package/dist/maplibre-gl.css +1 -1
- package/dist/maplibre-gl.d.ts +1583 -1023
- package/dist/maplibre-gl.js +3 -3
- package/dist/maplibre-gl.js.map +1 -1
- package/package.json +99 -141
- package/src/css/maplibre-gl.css +36 -36
- package/src/data/{array_types.ts → array_types.g.ts} +0 -0
- package/src/data/bucket/circle_bucket.ts +1 -1
- package/src/data/bucket/fill_bucket.test.ts +1 -1
- package/src/data/bucket/fill_bucket.ts +4 -4
- package/src/data/bucket/fill_extrusion_bucket.ts +1 -1
- package/src/data/bucket/line_bucket.test.ts +1 -1
- package/src/data/bucket/line_bucket.ts +6 -6
- package/src/data/bucket/symbol_bucket.test.ts +16 -16
- package/src/data/bucket/symbol_bucket.ts +56 -56
- package/src/data/bucket.ts +43 -43
- package/src/data/dem_data.ts +12 -12
- package/src/data/evaluation_feature.ts +10 -10
- package/src/data/feature_index.ts +37 -37
- package/src/data/feature_position_map.ts +5 -5
- package/src/data/index_array_type.ts +1 -1
- package/src/data/load_geometry.test.ts +1 -1
- package/src/data/program_configuration.ts +47 -47
- package/src/data/segment.ts +14 -14
- package/src/geo/edge_insets.ts +2 -2
- package/src/geo/lng_lat.ts +4 -4
- package/src/geo/lng_lat_bounds.ts +35 -35
- package/src/geo/mercator_coordinate.ts +5 -5
- package/src/geo/transform.test.ts +1 -1
- package/src/geo/transform.ts +14 -14
- package/src/gl/context.ts +3 -3
- package/src/gl/types.ts +19 -19
- package/src/gl/value.ts +6 -6
- package/src/gl/vertex_buffer.test.ts +1 -1
- package/src/index.ts +24 -9
- package/src/render/draw_circle.ts +8 -8
- package/src/render/draw_collision_debug.ts +5 -5
- package/src/render/draw_debug.ts +1 -1
- package/src/render/draw_line.ts +4 -4
- package/src/render/draw_symbol.ts +21 -21
- package/src/render/glyph_atlas.ts +12 -12
- package/src/render/glyph_manager.test.ts +10 -21
- package/src/render/glyph_manager.ts +34 -33
- package/src/render/image_manager.ts +4 -4
- package/src/render/painter.ts +16 -14
- package/src/render/program/background_program.ts +29 -29
- package/src/render/program/circle_program.ts +11 -11
- package/src/render/program/clipping_mask_program.ts +1 -1
- package/src/render/program/collision_program.ts +9 -9
- package/src/render/program/debug_program.ts +4 -4
- package/src/render/program/fill_extrusion_program.ts +31 -31
- package/src/render/program/fill_program.ts +29 -29
- package/src/render/program/heatmap_program.ts +12 -12
- package/src/render/program/hillshade_program.ts +12 -12
- package/src/render/program/line_program.ts +41 -41
- package/src/render/program/pattern.ts +28 -28
- package/src/render/program/raster_program.ts +21 -21
- package/src/render/program/symbol_program.ts +97 -97
- package/src/render/program.ts +25 -25
- package/src/render/texture.ts +9 -9
- package/src/render/uniform_binding.ts +1 -1
- package/src/render/vertex_array_object.ts +13 -13
- package/src/shaders/_prelude.fragment.glsl.g.ts +2 -0
- package/src/shaders/_prelude.vertex.glsl.g.ts +2 -0
- package/src/shaders/background.fragment.glsl.g.ts +2 -0
- package/src/shaders/background.vertex.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/background_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.fragment.glsl.g.ts +2 -0
- package/src/shaders/clipping_mask.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_box.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_box.vertex.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.fragment.glsl.g.ts +2 -0
- package/src/shaders/collision_circle.vertex.glsl.g.ts +2 -0
- package/src/shaders/debug.fragment.glsl.g.ts +2 -0
- package/src/shaders/debug.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_extrusion_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_outline_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/fill_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap.vertex.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.fragment.glsl.g.ts +2 -0
- package/src/shaders/heatmap_texture.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade.vertex.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.fragment.glsl.g.ts +2 -0
- package/src/shaders/hillshade_prepare.vertex.glsl.g.ts +2 -0
- package/src/shaders/line.fragment.glsl.g.ts +2 -0
- package/src/shaders/line.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_gradient.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_pattern.vertex.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/line_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/raster.fragment.glsl.g.ts +2 -0
- package/src/shaders/raster.vertex.glsl.g.ts +2 -0
- package/src/shaders/shaders.ts +52 -55
- package/src/shaders/symbol_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_icon.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_sdf.vertex.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.fragment.glsl.g.ts +2 -0
- package/src/shaders/symbol_text_and_icon.vertex.glsl.g.ts +2 -0
- package/src/source/canvas_source.test.ts +11 -12
- package/src/source/canvas_source.ts +4 -4
- package/src/source/geojson_source.test.ts +2 -1
- package/src/source/geojson_source.ts +1 -1
- package/src/source/geojson_worker_source.ts +23 -23
- package/src/source/geojson_wrapper.ts +8 -8
- package/src/source/image_source.test.ts +153 -0
- package/src/source/image_source.ts +6 -6
- package/src/source/pixels_to_tile_units.ts +6 -6
- package/src/source/query_features.ts +20 -20
- package/src/source/raster_dem_tile_source.test.ts +4 -3
- package/src/source/raster_dem_tile_source.ts +1 -1
- package/src/source/raster_tile_source.test.ts +4 -3
- package/src/source/raster_tile_source.ts +1 -1
- package/src/source/rtl_text_plugin.ts +10 -10
- package/src/source/source.ts +29 -29
- package/src/source/source_cache.test.ts +33 -1
- package/src/source/source_cache.ts +7 -5
- package/src/source/source_state.ts +1 -1
- package/src/source/tile.test.ts +3 -3
- package/src/source/tile.ts +15 -15
- package/src/source/tile_cache.test.ts +6 -4
- package/src/source/tile_cache.ts +6 -6
- package/src/source/tile_id.test.ts +10 -13
- package/src/source/tile_id.ts +2 -2
- package/src/source/vector_tile_source.test.ts +17 -5
- package/src/source/vector_tile_source.ts +4 -5
- package/src/source/vector_tile_worker_source.test.ts +4 -4
- package/src/source/vector_tile_worker_source.ts +5 -5
- package/src/source/worker.test.ts +1 -1
- package/src/source/worker.ts +22 -22
- package/src/source/worker_source.ts +56 -56
- package/src/source/worker_tile.ts +4 -4
- package/src/style/evaluation_parameters.ts +3 -3
- package/src/style/format_section_override.test.ts +1 -1
- package/src/style/light.ts +10 -10
- package/src/style/load_glyph_range.test.ts +3 -5
- package/src/style/load_glyph_range.ts +6 -6
- package/src/style/load_sprite.ts +5 -4
- package/src/style/pauseable_placement.ts +1 -1
- package/src/style/properties.ts +70 -70
- package/src/style/query_utils.ts +7 -7
- package/src/style/style.test.ts +26 -15
- package/src/style/style.ts +30 -30
- package/src/style/style_glyph.ts +8 -8
- package/src/style/style_image.ts +58 -58
- package/src/style/style_layer/background_style_layer.ts +2 -2
- package/src/style/style_layer/{background_style_layer_properties.ts → background_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/circle_style_layer.ts +10 -10
- package/src/style/style_layer/{circle_style_layer_properties.ts → circle_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/custom_style_layer.ts +19 -19
- package/src/style/style_layer/fill_extrusion_style_layer.ts +11 -11
- package/src/style/style_layer/{fill_extrusion_style_layer_properties.ts → fill_extrusion_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/fill_style_layer.ts +9 -9
- package/src/style/style_layer/{fill_style_layer_properties.ts → fill_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/heatmap_style_layer.ts +2 -2
- package/src/style/style_layer/{heatmap_style_layer_properties.ts → heatmap_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/hillshade_style_layer.ts +2 -2
- package/src/style/style_layer/{hillshade_style_layer_properties.ts → hillshade_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/line_style_layer.ts +9 -9
- package/src/style/style_layer/{line_style_layer_properties.ts → line_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/raster_style_layer.ts +2 -2
- package/src/style/style_layer/{raster_style_layer_properties.ts → raster_style_layer_properties.g.ts} +0 -0
- package/src/style/style_layer/symbol_style_layer.ts +26 -7
- package/src/style/style_layer/{symbol_style_layer_properties.ts → symbol_style_layer_properties.g.ts} +6 -0
- package/src/style/style_layer.ts +10 -10
- package/src/style/style_layer_index.ts +3 -3
- package/src/style/validate_style.ts +15 -15
- package/src/style-spec/CHANGELOG.md +6 -0
- package/src/style-spec/error/validation_error.ts +1 -1
- package/src/style-spec/expression/compound_expression.ts +3 -3
- package/src/style-spec/expression/definitions/format.ts +11 -11
- package/src/style-spec/expression/definitions/interpolate.ts +5 -5
- package/src/style-spec/expression/definitions/match.ts +2 -2
- package/src/style-spec/expression/definitions/number_format.ts +11 -11
- package/src/style-spec/expression/expression.ts +8 -8
- package/src/style-spec/expression/index.ts +97 -97
- package/src/style-spec/expression/parsing_context.ts +11 -11
- package/src/style-spec/expression/types/collator.ts +9 -9
- package/src/style-spec/expression/types/resolved_image.ts +2 -2
- package/src/style-spec/expression/types.ts +14 -14
- package/src/style-spec/expression/values.ts +1 -1
- package/src/style-spec/feature_filter/index.ts +66 -66
- package/src/style-spec/function/convert.ts +3 -3
- package/src/style-spec/package.json +1 -1
- package/src/style-spec/reference/v8.json +68 -2
- package/src/style-spec/style-spec.ts +44 -44
- package/src/style-spec/types.ts +2 -0
- package/src/style-spec/util/color_spaces.ts +8 -8
- package/src/style-spec/util/result.ts +4 -4
- package/src/style-spec/validate/validate_filter.ts +58 -58
- package/src/style-spec/validate/validate_source.ts +63 -63
- package/src/style-spec/visit.ts +11 -11
- package/src/symbol/collision_feature.test.ts +1 -1
- package/src/symbol/collision_feature.ts +10 -10
- package/src/symbol/collision_index.ts +43 -43
- package/src/symbol/cross_tile_symbol_index.ts +17 -17
- package/src/symbol/get_anchors.ts +16 -16
- package/src/symbol/grid_index.test.ts +42 -19
- package/src/symbol/grid_index.ts +69 -40
- package/src/symbol/placement.ts +124 -95
- package/src/symbol/projection.ts +30 -30
- package/src/symbol/quads.ts +30 -30
- package/src/symbol/shaping.ts +160 -160
- package/src/symbol/symbol_layout.ts +119 -119
- package/src/symbol/symbol_size.ts +29 -29
- package/src/symbol/symbol_style_layer.test.ts +49 -2
- package/src/types/cancelable.ts +1 -1
- package/src/types/tilejson.ts +13 -13
- package/src/ui/anchor.ts +1 -1
- package/src/ui/camera.test.ts +9 -9
- package/src/ui/camera.ts +26 -18
- package/src/ui/control/attribution_control.test.ts +51 -16
- package/src/ui/control/attribution_control.ts +35 -16
- package/src/ui/control/control.ts +40 -40
- package/src/ui/control/fullscreen_control.ts +1 -1
- package/src/ui/control/geolocate_control.test.ts +1 -1
- package/src/ui/control/geolocate_control.ts +102 -102
- package/src/ui/control/logo_control.test.ts +5 -4
- package/src/ui/control/navigation_control.ts +3 -3
- package/src/ui/control/scale_control.test.ts +2 -2
- package/src/ui/control/scale_control.ts +5 -5
- package/src/ui/events.ts +289 -200
- package/src/ui/handler/box_zoom.test.ts +1 -1
- package/src/ui/handler/box_zoom.ts +1 -1
- package/src/ui/handler/dblclick_zoom.test.ts +1 -1
- package/src/ui/handler/drag_pan.test.ts +1 -1
- package/src/ui/handler/drag_rotate.test.ts +1 -1
- package/src/ui/handler/keyboard.test.ts +1 -1
- package/src/ui/handler/keyboard.ts +51 -51
- package/src/ui/handler/map_event.test.ts +1 -1
- package/src/ui/handler/map_event.ts +1 -1
- package/src/ui/handler/mouse.ts +1 -1
- package/src/ui/handler/mouse_rotate.test.ts +1 -1
- package/src/ui/handler/scroll_zoom.test.ts +3 -2
- package/src/ui/handler/scroll_zoom.ts +9 -9
- package/src/ui/handler/shim/drag_pan.ts +4 -4
- package/src/ui/handler/shim/drag_rotate.ts +1 -1
- package/src/ui/handler/shim/touch_zoom_rotate.ts +1 -1
- package/src/ui/handler/tap_recognizer.ts +4 -4
- package/src/ui/handler/touch_pan.ts +2 -2
- package/src/ui/handler/touch_zoom_rotate.test.ts +1 -1
- package/src/ui/handler/touch_zoom_rotate.ts +1 -1
- package/src/ui/handler_inertia.ts +6 -6
- package/src/ui/handler_manager.ts +44 -44
- package/src/ui/map/isMoving.test.ts +1 -1
- package/src/ui/map/isRotating.test.ts +1 -1
- package/src/ui/map/isZooming.test.ts +1 -1
- package/src/ui/map.test.ts +87 -14
- package/src/ui/map.ts +138 -108
- package/src/ui/map_events.test.ts +1 -1
- package/src/ui/marker.test.ts +12 -12
- package/src/ui/marker.ts +37 -37
- package/src/ui/popup.test.ts +7 -7
- package/src/ui/popup.ts +9 -9
- package/src/util/actor.test.ts +41 -10
- package/src/util/actor.ts +8 -8
- package/src/util/ajax.test.ts +214 -0
- package/src/util/ajax.ts +51 -30
- package/src/util/browser.ts +1 -1
- package/src/util/classify_rings.test.ts +1 -1
- package/src/util/color_ramp.ts +5 -5
- package/src/util/config.ts +2 -2
- package/src/util/dispatcher.ts +1 -1
- package/src/util/dom.ts +2 -2
- package/src/util/evented.ts +1 -1
- package/src/util/find_pole_of_inaccessibility.ts +3 -3
- package/src/util/image.ts +5 -5
- package/src/util/performance.ts +7 -7
- package/src/util/request_manager.ts +4 -4
- package/src/util/resolve_tokens.ts +4 -4
- package/src/util/struct_array.test.ts +1 -1
- package/src/util/struct_array.ts +15 -15
- package/src/util/task_queue.ts +3 -3
- package/src/util/test/util.ts +14 -0
- package/src/util/tile_request_cache.ts +3 -3
- package/src/util/transferable_grid_index.ts +4 -4
- package/src/util/util.ts +8 -8
- package/src/util/web_worker.ts +4 -68
- package/src/util/web_worker_transfer.test.ts +3 -0
- package/src/util/web_worker_transfer.ts +21 -17
- package/src/util/worker_pool.ts +1 -1
- package/build/.eslintrc +0 -21
- package/build/glsl_to_js.js +0 -12
- package/build/post-ts-build.js +0 -43
- package/build/release-notes.md.ejs +0 -8
- package/build/test/build-tape.js +0 -17
- package/build/web_worker_replacement.js +0 -5
- package/dist/package.json +0 -1
- package/src/style-spec/validate_spec.test.ts +0 -29
- package/src/symbol/shaping.test.ts +0 -392
- package/src/types/glsl.d.ts +0 -4
package/src/symbol/grid_index.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import type {OverlapMode} from '../style/style_layer/symbol_style_layer';
|
|
2
|
+
|
|
1
3
|
type QueryArgs = {
|
|
2
4
|
hitTest: boolean;
|
|
5
|
+
overlapMode?: OverlapMode;
|
|
3
6
|
circle?: {
|
|
4
7
|
x: number;
|
|
5
8
|
y: number;
|
|
@@ -23,6 +26,24 @@ type QueryResult<T> = {
|
|
|
23
26
|
y2: number;
|
|
24
27
|
};
|
|
25
28
|
|
|
29
|
+
export type GridKey = {
|
|
30
|
+
overlapMode?: OverlapMode;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function overlapAllowed(overlapA: OverlapMode, overlapB: OverlapMode): boolean {
|
|
34
|
+
let allowed = true;
|
|
35
|
+
|
|
36
|
+
if (overlapA === 'always') {
|
|
37
|
+
// symbol A using 'always' overlap - allowed to overlap anything.
|
|
38
|
+
} else if (overlapA === 'never' || overlapB === 'never') {
|
|
39
|
+
// symbol A using 'never' overlap - can't overlap anything
|
|
40
|
+
// symbol A using 'cooperative' overlap - can overlap 'always' or 'cooperative' symbol; can't overlap 'never'
|
|
41
|
+
allowed = false;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return allowed;
|
|
45
|
+
}
|
|
46
|
+
|
|
26
47
|
/**
|
|
27
48
|
* GridIndex is a data structure for testing the intersection of
|
|
28
49
|
* circles and rectangles in a 2d plane.
|
|
@@ -36,7 +57,7 @@ type QueryResult<T> = {
|
|
|
36
57
|
*
|
|
37
58
|
* @private
|
|
38
59
|
*/
|
|
39
|
-
class GridIndex<T> {
|
|
60
|
+
class GridIndex<T extends GridKey> {
|
|
40
61
|
circleKeys: Array<T>;
|
|
41
62
|
boxKeys: Array<T>;
|
|
42
63
|
boxCells: Array<Array<number>>;
|
|
@@ -110,7 +131,7 @@ class GridIndex<T> {
|
|
|
110
131
|
this.circleCells[cellIndex].push(uid);
|
|
111
132
|
}
|
|
112
133
|
|
|
113
|
-
private _query(x1: number, y1: number, x2: number, y2: number, hitTest: boolean, predicate?: (key: T) => boolean): Array<QueryResult<T>> {
|
|
134
|
+
private _query(x1: number, y1: number, x2: number, y2: number, hitTest: boolean, overlapMode: OverlapMode, predicate?: (key: T) => boolean): Array<QueryResult<T>> {
|
|
114
135
|
if (x2 < 0 || x1 > this.width || y2 < 0 || y1 > this.height) {
|
|
115
136
|
return [];
|
|
116
137
|
}
|
|
@@ -150,6 +171,7 @@ class GridIndex<T> {
|
|
|
150
171
|
} else {
|
|
151
172
|
const queryArgs: QueryArgs = {
|
|
152
173
|
hitTest,
|
|
174
|
+
overlapMode,
|
|
153
175
|
seenUids: {box: {}, circle: {}}
|
|
154
176
|
};
|
|
155
177
|
this._forEachCell(x1, y1, x2, y2, this._queryCell, result, queryArgs, predicate);
|
|
@@ -162,11 +184,11 @@ class GridIndex<T> {
|
|
|
162
184
|
return this._query(x1, y1, x2, y2, false, null);
|
|
163
185
|
}
|
|
164
186
|
|
|
165
|
-
hitTest(x1: number, y1: number, x2: number, y2: number, predicate?: (key: T) => boolean): boolean {
|
|
166
|
-
return this._query(x1, y1, x2, y2, true, predicate).length > 0;
|
|
187
|
+
hitTest(x1: number, y1: number, x2: number, y2: number, overlapMode: OverlapMode, predicate?: (key: T) => boolean): boolean {
|
|
188
|
+
return this._query(x1, y1, x2, y2, true, overlapMode, predicate).length > 0;
|
|
167
189
|
}
|
|
168
190
|
|
|
169
|
-
hitTestCircle(x: number, y: number, radius: number, predicate?: (key: T) => boolean): boolean {
|
|
191
|
+
hitTestCircle(x: number, y: number, radius: number, overlapMode: OverlapMode, predicate?: (key: T) => boolean): boolean {
|
|
170
192
|
// Insert circle into grid for all cells in the circumscribing square
|
|
171
193
|
// It's more than necessary (by a factor of 4/PI), but fast to insert
|
|
172
194
|
const x1 = x - radius;
|
|
@@ -183,6 +205,7 @@ class GridIndex<T> {
|
|
|
183
205
|
const result: boolean[] = [];
|
|
184
206
|
const queryArgs: QueryArgs = {
|
|
185
207
|
hitTest: true,
|
|
208
|
+
overlapMode,
|
|
186
209
|
circle: {x, y, radius},
|
|
187
210
|
seenUids: {box: {}, circle: {}}
|
|
188
211
|
};
|
|
@@ -191,7 +214,7 @@ class GridIndex<T> {
|
|
|
191
214
|
}
|
|
192
215
|
|
|
193
216
|
private _queryCell(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: Array<QueryResult<T>>, queryArgs: QueryArgs, predicate?: (key: T) => boolean): boolean {
|
|
194
|
-
const {seenUids, hitTest} = queryArgs;
|
|
217
|
+
const {seenUids, hitTest, overlapMode} = queryArgs;
|
|
195
218
|
const boxCell = this.boxCells[cellIndex];
|
|
196
219
|
|
|
197
220
|
if (boxCell !== null) {
|
|
@@ -207,16 +230,18 @@ class GridIndex<T> {
|
|
|
207
230
|
(x2 >= bboxes[offset + 0]) &&
|
|
208
231
|
(y2 >= bboxes[offset + 1]) &&
|
|
209
232
|
(!predicate || predicate(key))) {
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
233
|
+
if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
|
|
234
|
+
result.push({
|
|
235
|
+
key,
|
|
236
|
+
x1: bboxes[offset],
|
|
237
|
+
y1: bboxes[offset + 1],
|
|
238
|
+
x2: bboxes[offset + 2],
|
|
239
|
+
y2: bboxes[offset + 3]
|
|
240
|
+
});
|
|
241
|
+
if (hitTest) {
|
|
242
|
+
// true return value stops the query after first match
|
|
243
|
+
return true;
|
|
244
|
+
}
|
|
220
245
|
}
|
|
221
246
|
}
|
|
222
247
|
}
|
|
@@ -240,19 +265,21 @@ class GridIndex<T> {
|
|
|
240
265
|
x2,
|
|
241
266
|
y2) &&
|
|
242
267
|
(!predicate || predicate(key))) {
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
268
|
+
if (!hitTest || !overlapAllowed(overlapMode, key.overlapMode)) {
|
|
269
|
+
const x = circles[offset];
|
|
270
|
+
const y = circles[offset + 1];
|
|
271
|
+
const radius = circles[offset + 2];
|
|
272
|
+
result.push({
|
|
273
|
+
key,
|
|
274
|
+
x1: x - radius,
|
|
275
|
+
y1: y - radius,
|
|
276
|
+
x2: x + radius,
|
|
277
|
+
y2: y + radius
|
|
278
|
+
});
|
|
279
|
+
if (hitTest) {
|
|
280
|
+
// true return value stops the query after first match
|
|
281
|
+
return true;
|
|
282
|
+
}
|
|
256
283
|
}
|
|
257
284
|
}
|
|
258
285
|
}
|
|
@@ -263,8 +290,8 @@ class GridIndex<T> {
|
|
|
263
290
|
return false;
|
|
264
291
|
}
|
|
265
292
|
|
|
266
|
-
private _queryCellCircle(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: Array<boolean>, queryArgs: QueryArgs, predicate?: (key:T) => boolean): boolean {
|
|
267
|
-
const {circle, seenUids} = queryArgs;
|
|
293
|
+
private _queryCellCircle(x1: number, y1: number, x2: number, y2: number, cellIndex: number, result: Array<boolean>, queryArgs: QueryArgs, predicate?: (key: T) => boolean): boolean {
|
|
294
|
+
const {circle, seenUids, overlapMode} = queryArgs;
|
|
268
295
|
const boxCell = this.boxCells[cellIndex];
|
|
269
296
|
|
|
270
297
|
if (boxCell !== null) {
|
|
@@ -282,7 +309,8 @@ class GridIndex<T> {
|
|
|
282
309
|
bboxes[offset + 1],
|
|
283
310
|
bboxes[offset + 2],
|
|
284
311
|
bboxes[offset + 3]) &&
|
|
285
|
-
(!predicate || predicate(key))
|
|
312
|
+
(!predicate || predicate(key)) &&
|
|
313
|
+
!overlapAllowed(overlapMode, key.overlapMode)) {
|
|
286
314
|
result.push(true);
|
|
287
315
|
return true;
|
|
288
316
|
}
|
|
@@ -305,7 +333,8 @@ class GridIndex<T> {
|
|
|
305
333
|
circle.x,
|
|
306
334
|
circle.y,
|
|
307
335
|
circle.radius) &&
|
|
308
|
-
(!predicate || predicate(key))
|
|
336
|
+
(!predicate || predicate(key)) &&
|
|
337
|
+
!overlapAllowed(overlapMode, key.overlapMode)) {
|
|
309
338
|
result.push(true);
|
|
310
339
|
return true;
|
|
311
340
|
}
|
|
@@ -352,13 +381,13 @@ class GridIndex<T> {
|
|
|
352
381
|
}
|
|
353
382
|
|
|
354
383
|
private _circleAndRectCollide(
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
384
|
+
circleX: number,
|
|
385
|
+
circleY: number,
|
|
386
|
+
radius: number,
|
|
387
|
+
x1: number,
|
|
388
|
+
y1: number,
|
|
389
|
+
x2: number,
|
|
390
|
+
y2: number
|
|
362
391
|
): boolean {
|
|
363
392
|
const halfRectWidth = (x2 - x1) / 2;
|
|
364
393
|
const distX = Math.abs(circleX - (x1 + halfRectWidth));
|
package/src/symbol/placement.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import CollisionIndex from './collision_index';
|
|
2
|
+
import type {FeatureKey} from './collision_index';
|
|
2
3
|
import EXTENT from '../data/extent';
|
|
3
4
|
import * as symbolSize from './symbol_size';
|
|
4
5
|
import * as projection from './projection';
|
|
@@ -11,12 +12,13 @@ import Point from '@mapbox/point-geometry';
|
|
|
11
12
|
import type Transform from '../geo/transform';
|
|
12
13
|
import type StyleLayer from '../style/style_layer';
|
|
13
14
|
import {PossiblyEvaluated} from '../style/properties';
|
|
14
|
-
import type {SymbolLayoutProps, SymbolLayoutPropsPossiblyEvaluated} from '../style/style_layer/symbol_style_layer_properties';
|
|
15
|
+
import type {SymbolLayoutProps, SymbolLayoutPropsPossiblyEvaluated} from '../style/style_layer/symbol_style_layer_properties.g';
|
|
16
|
+
import {getOverlapMode, OverlapMode} from '../style/style_layer/symbol_style_layer';
|
|
15
17
|
|
|
16
18
|
import type Tile from '../source/tile';
|
|
17
19
|
import SymbolBucket, {CollisionArrays, SingleCollisionBox} from '../data/bucket/symbol_bucket';
|
|
18
20
|
|
|
19
|
-
import type {CollisionBoxArray, CollisionVertexArray, SymbolInstance} from '../data/array_types';
|
|
21
|
+
import type {CollisionBoxArray, CollisionVertexArray, SymbolInstance} from '../data/array_types.g';
|
|
20
22
|
import type FeatureIndex from '../data/feature_index';
|
|
21
23
|
import type {OverscaledTileID} from '../source/tile_id';
|
|
22
24
|
import type {TextAnchor} from './symbol_layout';
|
|
@@ -85,10 +87,10 @@ export class RetainedQueryData {
|
|
|
85
87
|
tileID: OverscaledTileID;
|
|
86
88
|
featureSortOrder: Array<number>;
|
|
87
89
|
constructor(bucketInstanceId: number,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
featureIndex: FeatureIndex,
|
|
91
|
+
sourceLayerIndex: number,
|
|
92
|
+
bucketIndex: number,
|
|
93
|
+
tileID: OverscaledTileID) {
|
|
92
94
|
this.bucketInstanceId = bucketInstanceId;
|
|
93
95
|
this.featureIndex = featureIndex;
|
|
94
96
|
this.sourceLayerIndex = sourceLayerIndex;
|
|
@@ -98,8 +100,8 @@ export class RetainedQueryData {
|
|
|
98
100
|
}
|
|
99
101
|
|
|
100
102
|
type CollisionGroup = {
|
|
101
|
-
|
|
102
|
-
|
|
103
|
+
ID: number;
|
|
104
|
+
predicate?: (key: FeatureKey) => boolean;
|
|
103
105
|
};
|
|
104
106
|
|
|
105
107
|
class CollisionGroups {
|
|
@@ -135,11 +137,11 @@ class CollisionGroups {
|
|
|
135
137
|
}
|
|
136
138
|
|
|
137
139
|
function calculateVariableLayoutShift(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
140
|
+
anchor: TextAnchor,
|
|
141
|
+
width: number,
|
|
142
|
+
height: number,
|
|
143
|
+
textOffset: [number, number],
|
|
144
|
+
textBoxScale: number
|
|
143
145
|
): Point {
|
|
144
146
|
const {horizontalAlign, verticalAlign} = getAnchorAlignment(anchor);
|
|
145
147
|
const shiftX = -(horizontalAlign - 0.5) * width;
|
|
@@ -152,9 +154,9 @@ function calculateVariableLayoutShift(
|
|
|
152
154
|
}
|
|
153
155
|
|
|
154
156
|
function shiftVariableCollisionBox(collisionBox: SingleCollisionBox,
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
157
|
+
shiftX: number, shiftY: number,
|
|
158
|
+
rotateWithMap: boolean, pitchWithMap: boolean,
|
|
159
|
+
angle: number) {
|
|
158
160
|
const {x1, x2, y1, y2, anchorPointX, anchorPointY} = collisionBox;
|
|
159
161
|
const rotatedOffset = new Point(shiftX, shiftY);
|
|
160
162
|
if (rotateWithMap) {
|
|
@@ -210,16 +212,16 @@ export class Placement {
|
|
|
210
212
|
transform: Transform;
|
|
211
213
|
collisionIndex: CollisionIndex;
|
|
212
214
|
placements: {
|
|
213
|
-
|
|
215
|
+
[_ in CrossTileID]: JointPlacement;
|
|
214
216
|
};
|
|
215
217
|
opacities: {
|
|
216
|
-
|
|
218
|
+
[_ in CrossTileID]: JointOpacityState;
|
|
217
219
|
};
|
|
218
220
|
variableOffsets: {
|
|
219
|
-
|
|
221
|
+
[_ in CrossTileID]: VariableOffset;
|
|
220
222
|
};
|
|
221
223
|
placedOrientations: {
|
|
222
|
-
|
|
224
|
+
[_ in CrossTileID]: number;
|
|
223
225
|
};
|
|
224
226
|
commitTime: number;
|
|
225
227
|
prevZoomAdjustment: number;
|
|
@@ -227,13 +229,13 @@ export class Placement {
|
|
|
227
229
|
stale: boolean;
|
|
228
230
|
fadeDuration: number;
|
|
229
231
|
retainedQueryData: {
|
|
230
|
-
|
|
232
|
+
[_: number]: RetainedQueryData;
|
|
231
233
|
};
|
|
232
234
|
collisionGroups: CollisionGroups;
|
|
233
235
|
prevPlacement: Placement;
|
|
234
236
|
zoomAtLastRecencyCheck: number;
|
|
235
237
|
collisionCircleArrays: {
|
|
236
|
-
|
|
238
|
+
[k in any]: CollisionCircleArray;
|
|
237
239
|
};
|
|
238
240
|
|
|
239
241
|
constructor(transform: Transform, fadeDuration: number, crossSourceCollisions: boolean, prevPlacement?: Placement) {
|
|
@@ -277,10 +279,10 @@ export class Placement {
|
|
|
277
279
|
const pixelsToTiles = pixelsToTileUnits(tile, 1, this.transform.zoom);
|
|
278
280
|
|
|
279
281
|
const textLabelPlaneMatrix = projection.getLabelPlaneMatrix(posMatrix,
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
282
|
+
pitchWithMap,
|
|
283
|
+
rotateWithMap,
|
|
284
|
+
this.transform,
|
|
285
|
+
pixelsToTiles);
|
|
284
286
|
|
|
285
287
|
let labelToScreenMatrix = null;
|
|
286
288
|
|
|
@@ -334,28 +336,28 @@ export class Placement {
|
|
|
334
336
|
}
|
|
335
337
|
|
|
336
338
|
attemptAnchorPlacement(
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
339
|
+
anchor: TextAnchor,
|
|
340
|
+
textBox: SingleCollisionBox,
|
|
341
|
+
width: number,
|
|
342
|
+
height: number,
|
|
343
|
+
textBoxScale: number,
|
|
344
|
+
rotateWithMap: boolean,
|
|
345
|
+
pitchWithMap: boolean,
|
|
346
|
+
textPixelRatio: number,
|
|
347
|
+
posMatrix: mat4,
|
|
348
|
+
collisionGroup: CollisionGroup,
|
|
349
|
+
textOverlapMode: OverlapMode,
|
|
350
|
+
symbolInstance: SymbolInstance,
|
|
351
|
+
bucket: SymbolBucket,
|
|
352
|
+
orientation: number,
|
|
353
|
+
iconBox?: SingleCollisionBox | null
|
|
352
354
|
): {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
355
|
+
shift: Point;
|
|
356
|
+
placedGlyphBoxes: {
|
|
357
|
+
box: Array<number>;
|
|
358
|
+
offscreen: boolean;
|
|
359
|
+
};
|
|
360
|
+
} {
|
|
359
361
|
|
|
360
362
|
const textOffset = [symbolInstance.textOffset0, symbolInstance.textOffset1] as [number, number];
|
|
361
363
|
const shift = calculateVariableLayoutShift(anchor, width, height, textOffset, textBoxScale);
|
|
@@ -364,14 +366,14 @@ export class Placement {
|
|
|
364
366
|
shiftVariableCollisionBox(
|
|
365
367
|
textBox, shift.x, shift.y,
|
|
366
368
|
rotateWithMap, pitchWithMap, this.transform.angle),
|
|
367
|
-
|
|
369
|
+
textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
|
|
368
370
|
|
|
369
371
|
if (iconBox) {
|
|
370
372
|
const placedIconBoxes = this.collisionIndex.placeCollisionBox(
|
|
371
373
|
shiftVariableCollisionBox(
|
|
372
374
|
iconBox, shift.x, shift.y,
|
|
373
375
|
rotateWithMap, pitchWithMap, this.transform.angle),
|
|
374
|
-
|
|
376
|
+
textOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
|
|
375
377
|
if (placedIconBoxes.box.length === 0) return;
|
|
376
378
|
}
|
|
377
379
|
|
|
@@ -406,7 +408,7 @@ export class Placement {
|
|
|
406
408
|
}
|
|
407
409
|
|
|
408
410
|
placeLayerBucketPart(bucketPart: BucketPart, seenCrossTileIDs: {
|
|
409
|
-
|
|
411
|
+
[k in string | number]: boolean;
|
|
410
412
|
}, showCollisionBoxes: boolean) {
|
|
411
413
|
|
|
412
414
|
const {
|
|
@@ -424,8 +426,10 @@ export class Placement {
|
|
|
424
426
|
|
|
425
427
|
const textOptional = layout.get('text-optional');
|
|
426
428
|
const iconOptional = layout.get('icon-optional');
|
|
427
|
-
const
|
|
428
|
-
const
|
|
429
|
+
const textOverlapMode = getOverlapMode(layout, 'text-overlap', 'text-allow-overlap');
|
|
430
|
+
const textAlwaysOverlap = textOverlapMode === 'always';
|
|
431
|
+
const iconOverlapMode = getOverlapMode(layout, 'icon-overlap', 'icon-allow-overlap');
|
|
432
|
+
const iconAlwaysOverlap = iconOverlapMode === 'always';
|
|
429
433
|
const rotateWithMap = layout.get('text-rotation-alignment') === 'map';
|
|
430
434
|
const pitchWithMap = layout.get('text-pitch-alignment') === 'map';
|
|
431
435
|
const hasIconTextFit = layout.get('icon-text-fit') !== 'none';
|
|
@@ -445,8 +449,8 @@ export class Placement {
|
|
|
445
449
|
// This is the reverse of our normal policy of "fade in on pan", but should look like any other
|
|
446
450
|
// collision and hopefully not be too noticeable.
|
|
447
451
|
// See https://github.com/mapbox/mapbox-gl-js/issues/7172
|
|
448
|
-
const alwaysShowText =
|
|
449
|
-
const alwaysShowIcon =
|
|
452
|
+
const alwaysShowText = textAlwaysOverlap && (iconAlwaysOverlap || !bucket.hasIconData() || iconOptional);
|
|
453
|
+
const alwaysShowIcon = iconAlwaysOverlap && (textAlwaysOverlap || !bucket.hasTextData() || textOptional);
|
|
450
454
|
|
|
451
455
|
if (!bucket.collisionArrays && collisionBoxArray) {
|
|
452
456
|
bucket.deserializeCollisionBoxes(collisionBoxArray);
|
|
@@ -519,8 +523,12 @@ export class Placement {
|
|
|
519
523
|
|
|
520
524
|
if (!layout.get('text-variable-anchor')) {
|
|
521
525
|
const placeBox = (collisionTextBox, orientation) => {
|
|
522
|
-
const placedFeature = this.collisionIndex.placeCollisionBox(
|
|
523
|
-
|
|
526
|
+
const placedFeature = this.collisionIndex.placeCollisionBox(
|
|
527
|
+
collisionTextBox,
|
|
528
|
+
textOverlapMode,
|
|
529
|
+
textPixelRatio,
|
|
530
|
+
posMatrix,
|
|
531
|
+
collisionGroup.predicate);
|
|
524
532
|
if (placedFeature && placedFeature.box && placedFeature.box.length) {
|
|
525
533
|
this.markUsedOrientation(bucket, orientation, symbolInstance);
|
|
526
534
|
this.placedOrientations[symbolInstance.crossTileID] = orientation;
|
|
@@ -562,20 +570,20 @@ export class Placement {
|
|
|
562
570
|
const height = collisionTextBox.y2 - collisionTextBox.y1;
|
|
563
571
|
const textBoxScale = symbolInstance.textBoxScale;
|
|
564
572
|
|
|
565
|
-
const variableIconBox = hasIconTextFit &&
|
|
573
|
+
const variableIconBox = hasIconTextFit && (iconOverlapMode === 'never') ? collisionIconBox : null;
|
|
566
574
|
|
|
567
575
|
let placedBox: {
|
|
568
|
-
|
|
569
|
-
|
|
576
|
+
box: Array<number>;
|
|
577
|
+
offscreen: boolean;
|
|
570
578
|
} = {box: [], offscreen: false};
|
|
571
|
-
const placementAttempts =
|
|
579
|
+
const placementAttempts = (textOverlapMode !== 'never') ? anchors.length * 2 : anchors.length;
|
|
572
580
|
for (let i = 0; i < placementAttempts; ++i) {
|
|
573
581
|
const anchor = anchors[i % anchors.length];
|
|
574
|
-
const
|
|
582
|
+
const overlapMode = (i >= anchors.length) ? textOverlapMode : 'never';
|
|
575
583
|
const result = this.attemptAnchorPlacement(
|
|
576
584
|
anchor, collisionTextBox, width, height,
|
|
577
585
|
textBoxScale, rotateWithMap, pitchWithMap, textPixelRatio, posMatrix,
|
|
578
|
-
collisionGroup,
|
|
586
|
+
collisionGroup, overlapMode, symbolInstance, bucket, orientation, variableIconBox);
|
|
579
587
|
|
|
580
588
|
if (result) {
|
|
581
589
|
placedBox = result.placedGlyphBoxes;
|
|
@@ -637,26 +645,27 @@ export class Placement {
|
|
|
637
645
|
const textPixelPadding = layout.get('text-padding');
|
|
638
646
|
const circlePixelDiameter = symbolInstance.collisionCircleDiameter;
|
|
639
647
|
|
|
640
|
-
placedGlyphCircles = this.collisionIndex.placeCollisionCircles(
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
648
|
+
placedGlyphCircles = this.collisionIndex.placeCollisionCircles(
|
|
649
|
+
textOverlapMode,
|
|
650
|
+
placedSymbol,
|
|
651
|
+
bucket.lineVertexArray,
|
|
652
|
+
bucket.glyphOffsetArray,
|
|
653
|
+
fontSize,
|
|
654
|
+
posMatrix,
|
|
655
|
+
textLabelPlaneMatrix,
|
|
656
|
+
labelToScreenMatrix,
|
|
657
|
+
showCollisionBoxes,
|
|
658
|
+
pitchWithMap,
|
|
659
|
+
collisionGroup.predicate,
|
|
660
|
+
circlePixelDiameter,
|
|
661
|
+
textPixelPadding);
|
|
653
662
|
|
|
654
663
|
assert(!placedGlyphCircles.circles.length || (!placedGlyphCircles.collisionDetected || showCollisionBoxes));
|
|
655
|
-
// If text-
|
|
664
|
+
// If text-overlap is set to 'always', force "placedCircles" to true
|
|
656
665
|
// In theory there should always be at least one circle placed
|
|
657
666
|
// in this case, but for now quirks in text-anchor
|
|
658
667
|
// and text-offset may prevent that from being true.
|
|
659
|
-
placeText =
|
|
668
|
+
placeText = textAlwaysOverlap || (placedGlyphCircles.circles.length > 0 && !placedGlyphCircles.collisionDetected);
|
|
660
669
|
offscreen = offscreen && placedGlyphCircles.offscreen;
|
|
661
670
|
}
|
|
662
671
|
|
|
@@ -673,7 +682,7 @@ export class Placement {
|
|
|
673
682
|
rotateWithMap, pitchWithMap, this.transform.angle) :
|
|
674
683
|
iconBox;
|
|
675
684
|
return this.collisionIndex.placeCollisionBox(shiftedIconBox,
|
|
676
|
-
|
|
685
|
+
iconOverlapMode, textPixelRatio, posMatrix, collisionGroup.predicate);
|
|
677
686
|
};
|
|
678
687
|
|
|
679
688
|
if (placedVerticalText && placedVerticalText.box && placedVerticalText.box.length && collisionArrays.verticalIconBox) {
|
|
@@ -701,22 +710,42 @@ export class Placement {
|
|
|
701
710
|
|
|
702
711
|
if (placeText && placedGlyphBoxes && placedGlyphBoxes.box) {
|
|
703
712
|
if (placedVerticalText && placedVerticalText.box && verticalTextFeatureIndex) {
|
|
704
|
-
this.collisionIndex.insertCollisionBox(
|
|
705
|
-
|
|
713
|
+
this.collisionIndex.insertCollisionBox(
|
|
714
|
+
placedGlyphBoxes.box,
|
|
715
|
+
textOverlapMode,
|
|
716
|
+
layout.get('text-ignore-placement'),
|
|
717
|
+
bucket.bucketInstanceId,
|
|
718
|
+
verticalTextFeatureIndex,
|
|
719
|
+
collisionGroup.ID);
|
|
706
720
|
} else {
|
|
707
|
-
this.collisionIndex.insertCollisionBox(
|
|
708
|
-
|
|
721
|
+
this.collisionIndex.insertCollisionBox(
|
|
722
|
+
placedGlyphBoxes.box,
|
|
723
|
+
textOverlapMode,
|
|
724
|
+
layout.get('text-ignore-placement'),
|
|
725
|
+
bucket.bucketInstanceId,
|
|
726
|
+
textFeatureIndex,
|
|
727
|
+
collisionGroup.ID);
|
|
709
728
|
}
|
|
710
729
|
|
|
711
730
|
}
|
|
712
731
|
if (placeIcon && placedIconBoxes) {
|
|
713
|
-
this.collisionIndex.insertCollisionBox(
|
|
714
|
-
|
|
732
|
+
this.collisionIndex.insertCollisionBox(
|
|
733
|
+
placedIconBoxes.box,
|
|
734
|
+
iconOverlapMode,
|
|
735
|
+
layout.get('icon-ignore-placement'),
|
|
736
|
+
bucket.bucketInstanceId,
|
|
737
|
+
iconFeatureIndex,
|
|
738
|
+
collisionGroup.ID);
|
|
715
739
|
}
|
|
716
740
|
if (placedGlyphCircles) {
|
|
717
741
|
if (placeText) {
|
|
718
|
-
this.collisionIndex.insertCollisionCircles(
|
|
719
|
-
|
|
742
|
+
this.collisionIndex.insertCollisionCircles(
|
|
743
|
+
placedGlyphCircles.circles,
|
|
744
|
+
textOverlapMode,
|
|
745
|
+
layout.get('text-ignore-placement'),
|
|
746
|
+
bucket.bucketInstanceId,
|
|
747
|
+
textFeatureIndex,
|
|
748
|
+
collisionGroup.ID);
|
|
720
749
|
}
|
|
721
750
|
|
|
722
751
|
if (showCollisionBoxes) {
|
|
@@ -887,7 +916,7 @@ export class Placement {
|
|
|
887
916
|
updateLayerOpacities(styleLayer: StyleLayer, tiles: Array<Tile>) {
|
|
888
917
|
const seenCrossTileIDs = {};
|
|
889
918
|
for (const tile of tiles) {
|
|
890
|
-
const symbolBucket =
|
|
919
|
+
const symbolBucket = tile.getBucket(styleLayer) as SymbolBucket;
|
|
891
920
|
if (symbolBucket && tile.latestFeatureIndex && styleLayer.id === symbolBucket.layerIds[0]) {
|
|
892
921
|
this.updateBucketOpacities(symbolBucket, seenCrossTileIDs, tile.collisionBoxArray);
|
|
893
922
|
}
|
|
@@ -895,7 +924,7 @@ export class Placement {
|
|
|
895
924
|
}
|
|
896
925
|
|
|
897
926
|
updateBucketOpacities(bucket: SymbolBucket, seenCrossTileIDs: {
|
|
898
|
-
|
|
927
|
+
[k in string | number]: boolean;
|
|
899
928
|
}, collisionBoxArray?: CollisionBoxArray | null) {
|
|
900
929
|
if (bucket.hasTextData()) bucket.text.opacityVertexArray.clear();
|
|
901
930
|
if (bucket.hasIconData()) bucket.icon.opacityVertexArray.clear();
|
|
@@ -915,9 +944,9 @@ export class Placement {
|
|
|
915
944
|
// with allow-overlap: false.
|
|
916
945
|
// See https://github.com/mapbox/mapbox-gl-js/issues/7032
|
|
917
946
|
const defaultOpacityState = new JointOpacityState(null, 0,
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
947
|
+
textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || layout.get('icon-optional')),
|
|
948
|
+
iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || layout.get('text-optional')),
|
|
949
|
+
true);
|
|
921
950
|
|
|
922
951
|
if (!bucket.collisionArrays && collisionBoxArray && ((bucket.hasIconCollisionBoxData() || bucket.hasTextCollisionBoxData()))) {
|
|
923
952
|
bucket.deserializeCollisionBoxes(collisionBoxArray);
|
|
@@ -1031,10 +1060,10 @@ export class Placement {
|
|
|
1031
1060
|
// just made the symbol disappear, and the most likely place for the
|
|
1032
1061
|
// symbol to come back)
|
|
1033
1062
|
shift = calculateVariableLayoutShift(variableOffset.anchor,
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1063
|
+
variableOffset.width,
|
|
1064
|
+
variableOffset.height,
|
|
1065
|
+
variableOffset.textOffset,
|
|
1066
|
+
variableOffset.textBoxScale);
|
|
1038
1067
|
if (rotateWithMap) {
|
|
1039
1068
|
shift._rotate(pitchWithMap ? this.transform.angle : -this.transform.angle);
|
|
1040
1069
|
}
|