@mapgis/mapbox-gl 16.0.1 → 16.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mapbox-gl.js +3 -3
- package/dist/mapbox-gl.js.map +1 -1
- package/package.json +1 -1
- package/.flowconfig +0 -61
- package/LICENSE.txt +0 -84
- package/README.md +0 -34
- package/build/banner.js +0 -4
- package/build/check-bundle-size.js +0 -140
- package/build/generate-access-token-script.js +0 -11
- package/build/generate-flow-typed-style-spec.js +0 -188
- package/build/generate-release-list.js +0 -21
- package/build/generate-struct-arrays.js +0 -237
- package/build/generate-style-code.js +0 -159
- package/build/mapbox-gl.js.flow +0 -3
- package/build/print-release-url.js +0 -6
- package/build/rollup_plugin_minify_style_spec.js +0 -20
- package/build/rollup_plugins.js +0 -80
- package/build/run-node +0 -3
- package/build/run-tap +0 -8
- package/build/test/build-tape.js +0 -19
- package/flow-typed/gl.js +0 -5
- package/flow-typed/jsdom.js +0 -18
- package/flow-typed/mapbox-gl-supported.js +0 -9
- package/flow-typed/mapbox-unitbezier.js +0 -14
- package/flow-typed/offscreen-canvas.js +0 -9
- package/flow-typed/pbf.js +0 -25
- package/flow-typed/point-geometry.js +0 -44
- package/flow-typed/potpack.js +0 -12
- package/flow-typed/sinon.js +0 -28
- package/flow-typed/vector-tile.js +0 -41
- package/src/css/mapbox-gl.css +0 -798
- package/src/css/svg/mapboxgl-ctrl-attrib.svg +0 -3
- package/src/css/svg/mapboxgl-ctrl-compass.svg +0 -4
- package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +0 -3
- package/src/css/svg/mapboxgl-ctrl-geolocate.svg +0 -5
- package/src/css/svg/mapboxgl-ctrl-logo.svg +0 -20
- package/src/css/svg/mapboxgl-ctrl-shrink.svg +0 -3
- package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +0 -3
- package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +0 -3
- package/src/data/array_types.js +0 -1095
- package/src/data/bucket/circle_attributes.js +0 -9
- package/src/data/bucket/circle_bucket.js +0 -204
- package/src/data/bucket/fill_attributes.js +0 -9
- package/src/data/bucket/fill_bucket.js +0 -233
- package/src/data/bucket/fill_extrusion_attributes.js +0 -10
- package/src/data/bucket/fill_extrusion_bucket.js +0 -289
- package/src/data/bucket/heatmap_bucket.js +0 -17
- package/src/data/bucket/line_attributes.js +0 -10
- package/src/data/bucket/line_bucket.js +0 -556
- package/src/data/bucket/pattern_attributes.js +0 -10
- package/src/data/bucket/pattern_bucket_features.js +0 -60
- package/src/data/bucket/symbol_attributes.js +0 -117
- package/src/data/bucket/symbol_bucket.js +0 -972
- package/src/data/bucket.js +0 -123
- package/src/data/dem_data.js +0 -125
- package/src/data/extent.js +0 -18
- package/src/data/feature_index.js +0 -321
- package/src/data/feature_position_map.js +0 -125
- package/src/data/index_array_type.js +0 -16
- package/src/data/load_geometry.js +0 -48
- package/src/data/pos_attributes.js +0 -6
- package/src/data/program_configuration.js +0 -687
- package/src/data/raster_bounds_attributes.js +0 -7
- package/src/data/segment.js +0 -76
- package/src/geo/edge_insets.js +0 -102
- package/src/geo/lng_lat.js +0 -165
- package/src/geo/lng_lat_bounds.js +0 -267
- package/src/geo/mercator_coordinate.js +0 -153
- package/src/geo/transform.js +0 -864
- package/src/gl/color_mode.js +0 -34
- package/src/gl/context.js +0 -298
- package/src/gl/cull_face_mode.js +0 -26
- package/src/gl/depth_mode.js +0 -29
- package/src/gl/framebuffer.js +0 -44
- package/src/gl/index_buffer.js +0 -55
- package/src/gl/stencil_mode.js +0 -30
- package/src/gl/types.js +0 -84
- package/src/gl/value.js +0 -520
- package/src/gl/vertex_buffer.js +0 -119
- package/src/index.js +0 -201
- package/src/render/draw_background.js +0 -57
- package/src/render/draw_circle.js +0 -113
- package/src/render/draw_collision_debug.js +0 -49
- package/src/render/draw_custom.js +0 -49
- package/src/render/draw_debug.js +0 -127
- package/src/render/draw_fill.js +0 -126
- package/src/render/draw_fill_extrusion.js +0 -96
- package/src/render/draw_heatmap.js +0 -140
- package/src/render/draw_hillshade.js +0 -108
- package/src/render/draw_line.js +0 -98
- package/src/render/draw_raster.js +0 -125
- package/src/render/draw_symbol.js +0 -394
- package/src/render/glyph_atlas.js +0 -71
- package/src/render/glyph_manager.js +0 -182
- package/src/render/image_atlas.js +0 -149
- package/src/render/image_manager.js +0 -306
- package/src/render/line_atlas.js +0 -210
- package/src/render/painter.js +0 -653
- package/src/render/program/background_program.js +0 -103
- package/src/render/program/circle_program.js +0 -69
- package/src/render/program/clipping_mask_program.js +0 -20
- package/src/render/program/collision_program.js +0 -49
- package/src/render/program/debug_program.js +0 -35
- package/src/render/program/fill_extrusion_program.js +0 -122
- package/src/render/program/fill_program.js +0 -126
- package/src/render/program/heatmap_program.js +0 -83
- package/src/render/program/hillshade_program.js +0 -122
- package/src/render/program/line_program.js +0 -207
- package/src/render/program/pattern.js +0 -102
- package/src/render/program/program_uniforms.js +0 -42
- package/src/render/program/raster_program.js +0 -92
- package/src/render/program/symbol_program.js +0 -224
- package/src/render/program.js +0 -168
- package/src/render/texture.js +0 -122
- package/src/render/uniform_binding.js +0 -147
- package/src/render/vertex_array_object.js +0 -163
- package/src/shaders/README.md +0 -42
- package/src/shaders/_prelude.fragment.glsl +0 -17
- package/src/shaders/_prelude.vertex.glsl +0 -73
- package/src/shaders/background.fragment.glsl +0 -10
- package/src/shaders/background.vertex.glsl +0 -7
- package/src/shaders/background_pattern.fragment.glsl +0 -28
- package/src/shaders/background_pattern.vertex.glsl +0 -20
- package/src/shaders/circle.fragment.glsl +0 -39
- package/src/shaders/circle.vertex.glsl +0 -64
- package/src/shaders/clipping_mask.fragment.glsl +0 -3
- package/src/shaders/clipping_mask.vertex.glsl +0 -7
- package/src/shaders/collision_box.fragment.glsl +0 -21
- package/src/shaders/collision_box.vertex.glsl +0 -27
- package/src/shaders/collision_circle.fragment.glsl +0 -34
- package/src/shaders/collision_circle.vertex.glsl +0 -36
- package/src/shaders/debug.fragment.glsl +0 -9
- package/src/shaders/debug.vertex.glsl +0 -12
- package/src/shaders/encode_attribute.js +0 -17
- package/src/shaders/fill.fragment.glsl +0 -13
- package/src/shaders/fill.vertex.glsl +0 -13
- package/src/shaders/fill_extrusion.fragment.glsl +0 -9
- package/src/shaders/fill_extrusion.vertex.glsl +0 -66
- package/src/shaders/fill_extrusion_pattern.fragment.glsl +0 -45
- package/src/shaders/fill_extrusion_pattern.vertex.glsl +0 -79
- package/src/shaders/fill_outline.fragment.glsl +0 -17
- package/src/shaders/fill_outline.vertex.glsl +0 -17
- package/src/shaders/fill_outline_pattern.fragment.glsl +0 -43
- package/src/shaders/fill_outline_pattern.vertex.glsl +0 -44
- package/src/shaders/fill_pattern.fragment.glsl +0 -36
- package/src/shaders/fill_pattern.vertex.glsl +0 -39
- package/src/shaders/heatmap.fragment.glsl +0 -22
- package/src/shaders/heatmap.vertex.glsl +0 -54
- package/src/shaders/heatmap_texture.fragment.glsl +0 -14
- package/src/shaders/heatmap_texture.vertex.glsl +0 -11
- package/src/shaders/hillshade.fragment.glsl +0 -52
- package/src/shaders/hillshade.vertex.glsl +0 -11
- package/src/shaders/hillshade_prepare.fragment.glsl +0 -74
- package/src/shaders/hillshade_prepare.vertex.glsl +0 -15
- package/src/shaders/index.js +0 -20
- package/src/shaders/line.fragment.glsl +0 -30
- package/src/shaders/line.vertex.glsl +0 -85
- package/src/shaders/line_gradient.fragment.glsl +0 -34
- package/src/shaders/line_gradient.vertex.glsl +0 -87
- package/src/shaders/line_pattern.fragment.glsl +0 -74
- package/src/shaders/line_pattern.vertex.glsl +0 -99
- package/src/shaders/line_sdf.fragment.glsl +0 -45
- package/src/shaders/line_sdf.vertex.glsl +0 -98
- package/src/shaders/raster.fragment.glsl +0 -52
- package/src/shaders/raster.vertex.glsl +0 -21
- package/src/shaders/shaders.js +0 -180
- package/src/shaders/symbol_icon.fragment.glsl +0 -17
- package/src/shaders/symbol_icon.vertex.glsl +0 -94
- package/src/shaders/symbol_sdf.fragment.glsl +0 -52
- package/src/shaders/symbol_sdf.vertex.glsl +0 -115
- package/src/shaders/symbol_text_and_icon.fragment.glsl +0 -68
- package/src/shaders/symbol_text_and_icon.vertex.glsl +0 -116
- package/src/source/canvas_source.js +0 -238
- package/src/source/geojson_helper.js +0 -92
- package/src/source/geojson_source.js +0 -374
- package/src/source/geojson_worker_source.js +0 -357
- package/src/source/geojson_wrapper.js +0 -94
- package/src/source/image_source.js +0 -307
- package/src/source/load_tilejson.js +0 -39
- package/src/source/mbtiles_source.js +0 -115
- package/src/source/offline_database.js +0 -61
- package/src/source/offline_database_root.js +0 -62
- package/src/source/pixels_to_tile_units.js +0 -21
- package/src/source/query_features.js +0 -208
- package/src/source/raster_dem_tile_source.js +0 -138
- package/src/source/raster_dem_tile_worker_source.js +0 -62
- package/src/source/raster_tile_offline_source.js +0 -136
- package/src/source/raster_tile_source.js +0 -177
- package/src/source/rtl_text_plugin.js +0 -138
- package/src/source/source.js +0 -137
- package/src/source/source_cache.js +0 -957
- package/src/source/source_state.js +0 -159
- package/src/source/tile.js +0 -465
- package/src/source/tile_bounds.js +0 -38
- package/src/source/tile_cache.js +0 -212
- package/src/source/tile_id.js +0 -402
- package/src/source/vector_tile_source.js +0 -192
- package/src/source/vector_tile_worker_source.js +0 -216
- package/src/source/video_source.js +0 -203
- package/src/source/worker.js +0 -237
- package/src/source/worker_source.js +0 -106
- package/src/source/worker_tile.js +0 -224
- package/src/style/create_style_layer.js +0 -36
- package/src/style/evaluation_parameters.js +0 -62
- package/src/style/light.js +0 -130
- package/src/style/load_glyph_range.js +0 -38
- package/src/style/load_sprite.js +0 -67
- package/src/style/parse_glyph_pbf.js +0 -44
- package/src/style/pauseable_placement.js +0 -132
- package/src/style/properties.js +0 -753
- package/src/style/query_utils.js +0 -43
- package/src/style/style.js +0 -1361
- package/src/style/style_glyph.js +0 -17
- package/src/style/style_image.js +0 -137
- package/src/style/style_layer/background_style_layer.js +0 -21
- package/src/style/style_layer/background_style_layer_properties.js +0 -40
- package/src/style/style_layer/circle_style_layer.js +0 -98
- package/src/style/style_layer/circle_style_layer_properties.js +0 -63
- package/src/style/style_layer/custom_style_layer.js +0 -223
- package/src/style/style_layer/fill_extrusion_style_layer.js +0 -224
- package/src/style/style_layer/fill_extrusion_style_layer_properties.js +0 -50
- package/src/style/style_layer/fill_style_layer.js +0 -67
- package/src/style/style_layer/fill_style_layer_properties.js +0 -55
- package/src/style/style_layer/heatmap_style_layer.js +0 -69
- package/src/style/style_layer/heatmap_style_layer_properties.js +0 -44
- package/src/style/style_layer/hillshade_style_layer.js +0 -25
- package/src/style/style_layer/hillshade_style_layer_properties.js +0 -46
- package/src/style/style_layer/layer_properties.js.ejs +0 -69
- package/src/style/style_layer/line_style_layer.js +0 -151
- package/src/style/style_layer/line_style_layer_properties.js +0 -71
- package/src/style/style_layer/raster_style_layer.js +0 -21
- package/src/style/style_layer/raster_style_layer_properties.js +0 -50
- package/src/style/style_layer/symbol_style_layer.js +0 -190
- package/src/style/style_layer/symbol_style_layer_properties.js +0 -153
- package/src/style/style_layer/typed_style_layer.js +0 -17
- package/src/style/style_layer.js +0 -281
- package/src/style/style_layer_index.js +0 -80
- package/src/style/validate_style.js +0 -42
- package/src/style/zoom_history.js +0 -44
- package/src/style-spec/.eslintrc +0 -5
- package/src/style-spec/CHANGELOG.md +0 -438
- package/src/style-spec/README.md +0 -59
- package/src/style-spec/bin/gl-style-composite +0 -9
- package/src/style-spec/bin/gl-style-format +0 -22
- package/src/style-spec/bin/gl-style-migrate +0 -9
- package/src/style-spec/bin/gl-style-validate +0 -50
- package/src/style-spec/composite.js +0 -50
- package/src/style-spec/declass.js +0 -42
- package/src/style-spec/deref.js +0 -52
- package/src/style-spec/diff.js +0 -393
- package/src/style-spec/dist/.gitkeep +0 -0
- package/src/style-spec/empty.js +0 -29
- package/src/style-spec/error/parsing_error.js +0 -16
- package/src/style-spec/error/validation_error.js +0 -18
- package/src/style-spec/expression/compound_expression.js +0 -162
- package/src/style-spec/expression/definitions/assertion.js +0 -130
- package/src/style-spec/expression/definitions/at.js +0 -70
- package/src/style-spec/expression/definitions/case.js +0 -85
- package/src/style-spec/expression/definitions/coalesce.js +0 -93
- package/src/style-spec/expression/definitions/coercion.js +0 -133
- package/src/style-spec/expression/definitions/collator.js +0 -78
- package/src/style-spec/expression/definitions/comparison.js +0 -184
- package/src/style-spec/expression/definitions/format.js +0 -144
- package/src/style-spec/expression/definitions/format_section_override.js +0 -54
- package/src/style-spec/expression/definitions/image.js +0 -52
- package/src/style-spec/expression/definitions/in.js +0 -92
- package/src/style-spec/expression/definitions/index.js +0 -561
- package/src/style-spec/expression/definitions/interpolate.js +0 -267
- package/src/style-spec/expression/definitions/length.js +0 -61
- package/src/style-spec/expression/definitions/let.js +0 -72
- package/src/style-spec/expression/definitions/literal.js +0 -77
- package/src/style-spec/expression/definitions/match.js +0 -158
- package/src/style-spec/expression/definitions/number_format.js +0 -142
- package/src/style-spec/expression/definitions/step.js +0 -120
- package/src/style-spec/expression/definitions/var.js +0 -46
- package/src/style-spec/expression/definitions/within.js +0 -333
- package/src/style-spec/expression/evaluation_context.js +0 -59
- package/src/style-spec/expression/expression.js +0 -27
- package/src/style-spec/expression/index.js +0 -392
- package/src/style-spec/expression/is_constant.js +0 -59
- package/src/style-spec/expression/parsing_context.js +0 -233
- package/src/style-spec/expression/parsing_error.js +0 -13
- package/src/style-spec/expression/runtime_error.js +0 -17
- package/src/style-spec/expression/scope.js +0 -36
- package/src/style-spec/expression/stops.js +0 -39
- package/src/style-spec/expression/types/collator.js +0 -61
- package/src/style-spec/expression/types/formatted.js +0 -73
- package/src/style-spec/expression/types/resolved_image.js +0 -29
- package/src/style-spec/expression/types.js +0 -106
- package/src/style-spec/expression/values.js +0 -123
- package/src/style-spec/feature_filter/README.md +0 -55
- package/src/style-spec/feature_filter/convert.js +0 -208
- package/src/style-spec/feature_filter/index.js +0 -165
- package/src/style-spec/format.js +0 -51
- package/src/style-spec/function/convert.js +0 -254
- package/src/style-spec/function/index.js +0 -262
- package/src/style-spec/group_by_layout.js +0 -75
- package/src/style-spec/migrate/expressions.js +0 -39
- package/src/style-spec/migrate/v8.js +0 -203
- package/src/style-spec/migrate/v9.js +0 -26
- package/src/style-spec/migrate.js +0 -36
- package/src/style-spec/package.json +0 -41
- package/src/style-spec/read_style.js +0 -14
- package/src/style-spec/reference/latest.js +0 -3
- package/src/style-spec/reference/v8.json +0 -5808
- package/src/style-spec/rollup.config.js +0 -45
- package/src/style-spec/style-spec.js +0 -122
- package/src/style-spec/types.js +0 -438
- package/src/style-spec/util/color.js +0 -95
- package/src/style-spec/util/color_spaces.js +0 -139
- package/src/style-spec/util/deep_equal.js +0 -28
- package/src/style-spec/util/extend.js +0 -10
- package/src/style-spec/util/get_type.js +0 -17
- package/src/style-spec/util/interpolate.js +0 -22
- package/src/style-spec/util/properties.js +0 -15
- package/src/style-spec/util/ref_properties.js +0 -2
- package/src/style-spec/util/result.js +0 -19
- package/src/style-spec/util/unbundle_jsonlint.js +0 -24
- package/src/style-spec/validate/latest.js +0 -11
- package/src/style-spec/validate/validate.js +0 -75
- package/src/style-spec/validate/validate_array.js +0 -52
- package/src/style-spec/validate/validate_boolean.js +0 -15
- package/src/style-spec/validate/validate_color.js +0 -20
- package/src/style-spec/validate/validate_constants.js +0 -13
- package/src/style-spec/validate/validate_enum.js +0 -21
- package/src/style-spec/validate/validate_expression.js +0 -43
- package/src/style-spec/validate/validate_filter.js +0 -111
- package/src/style-spec/validate/validate_formatted.js +0 -11
- package/src/style-spec/validate/validate_function.js +0 -207
- package/src/style-spec/validate/validate_glyphs_url.js +0 -21
- package/src/style-spec/validate/validate_image.js +0 -11
- package/src/style-spec/validate/validate_layer.js +0 -134
- package/src/style-spec/validate/validate_layout_property.js +0 -6
- package/src/style-spec/validate/validate_light.js +0 -47
- package/src/style-spec/validate/validate_number.js +0 -29
- package/src/style-spec/validate/validate_object.js +0 -61
- package/src/style-spec/validate/validate_paint_property.js +0 -6
- package/src/style-spec/validate/validate_property.js +0 -64
- package/src/style-spec/validate/validate_source.js +0 -111
- package/src/style-spec/validate/validate_string.js +0 -15
- package/src/style-spec/validate_mapbox_api_supported.js +0 -171
- package/src/style-spec/validate_style.js +0 -39
- package/src/style-spec/validate_style.min.js +0 -78
- package/src/style-spec/visit.js +0 -77
- package/src/symbol/anchor.js +0 -26
- package/src/symbol/check_max_angle.js +0 -81
- package/src/symbol/clip_line.js +0 -71
- package/src/symbol/collision_feature.js +0 -217
- package/src/symbol/collision_index.js +0 -372
- package/src/symbol/cross_tile_symbol_index.js +0 -301
- package/src/symbol/get_anchors.js +0 -167
- package/src/symbol/grid_index.js +0 -335
- package/src/symbol/mergelines.js +0 -82
- package/src/symbol/one_em.js +0 -4
- package/src/symbol/opacity_state.js +0 -27
- package/src/symbol/placement.js +0 -1062
- package/src/symbol/projection.js +0 -450
- package/src/symbol/quads.js +0 -334
- package/src/symbol/shaping.js +0 -816
- package/src/symbol/symbol_layout.js +0 -772
- package/src/symbol/symbol_size.js +0 -113
- package/src/symbol/transform_text.js +0 -29
- package/src/types/callback.js +0 -17
- package/src/types/cancelable.js +0 -3
- package/src/types/tilejson.js +0 -17
- package/src/types/transferable.js +0 -3
- package/src/types/window.js +0 -172
- package/src/ui/anchor.js +0 -32
- package/src/ui/bind_handlers.js +0 -202
- package/src/ui/camera.js +0 -1152
- package/src/ui/control/attribution_control.js +0 -189
- package/src/ui/control/fps_control.js +0 -185
- package/src/ui/control/fullscreen_control.js +0 -147
- package/src/ui/control/geolocate_control.js +0 -594
- package/src/ui/control/logo_control.js +0 -92
- package/src/ui/control/navigation_control.js +0 -148
- package/src/ui/control/scale_control.js +0 -142
- package/src/ui/crs.js +0 -64
- package/src/ui/default_locale.js +0 -20
- package/src/ui/events.js +0 -806
- package/src/ui/handler/box_zoom.js +0 -175
- package/src/ui/handler/dblclick_zoom.js +0 -139
- package/src/ui/handler/drag_pan.js +0 -416
- package/src/ui/handler/drag_rotate.js +0 -378
- package/src/ui/handler/keyboard.js +0 -161
- package/src/ui/handler/scroll_zoom.js +0 -333
- package/src/ui/handler/touch_zoom_rotate.js +0 -293
- package/src/ui/hash.js +0 -147
- package/src/ui/map.js +0 -2883
- package/src/ui/marker.js +0 -607
- package/src/ui/offline_map.js +0 -91
- package/src/ui/popup.js +0 -530
- package/src/util/actor.js +0 -212
- package/src/util/ajax.js +0 -371
- package/src/util/browser/web_worker.js +0 -10
- package/src/util/browser/window.js +0 -5
- package/src/util/browser.js +0 -70
- package/src/util/classify_rings.js +0 -52
- package/src/util/color_ramp.js +0 -28
- package/src/util/config.js +0 -30
- package/src/util/debug.js +0 -12
- package/src/util/dictionary_coder.js +0 -30
- package/src/util/dispatcher.js +0 -70
- package/src/util/dom.js +0 -144
- package/src/util/evented.js +0 -174
- package/src/util/find_pole_of_inaccessibility.js +0 -129
- package/src/util/global_worker_pool.js +0 -17
- package/src/util/image.js +0 -142
- package/src/util/intersection_tests.js +0 -208
- package/src/util/is_char_in_unicode_block.js +0 -311
- package/src/util/mapbox.js +0 -486
- package/src/util/offscreen_canvas_supported.js +0 -14
- package/src/util/performance.js +0 -112
- package/src/util/primitives.js +0 -145
- package/src/util/resolve_tokens.js +0 -16
- package/src/util/script_detection.js +0 -328
- package/src/util/sku_token.js +0 -42
- package/src/util/smart_wrap.js +0 -55
- package/src/util/struct_array.js +0 -243
- package/src/util/struct_array.js.ejs +0 -112
- package/src/util/struct_array_layout.js.ejs +0 -98
- package/src/util/task_queue.js +0 -68
- package/src/util/throttle.js +0 -28
- package/src/util/throttled_invoker.js +0 -46
- package/src/util/tile_cover.js +0 -101
- package/src/util/tile_request_cache.js +0 -172
- package/src/util/util.js +0 -504
- package/src/util/vectortile_to_geojson.js +0 -54
- package/src/util/verticalize_punctuation.js +0 -114
- package/src/util/web_worker.js +0 -91
- package/src/util/web_worker_transfer.js +0 -266
- package/src/util/webp_supported.js +0 -69
- package/src/util/window.js +0 -102
- package/src/util/worker_pool.js +0 -47
package/src/symbol/clip_line.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import Point from '@mapbox/point-geometry';
|
|
4
|
-
|
|
5
|
-
export default clipLine;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Returns the part of a multiline that intersects with the provided rectangular box.
|
|
9
|
-
*
|
|
10
|
-
* @param lines
|
|
11
|
-
* @param x1 the left edge of the box
|
|
12
|
-
* @param y1 the top edge of the box
|
|
13
|
-
* @param x2 the right edge of the box
|
|
14
|
-
* @param y2 the bottom edge of the box
|
|
15
|
-
* @returns lines
|
|
16
|
-
* @private
|
|
17
|
-
*/
|
|
18
|
-
function clipLine(lines: Array<Array<Point>>, x1: number, y1: number, x2: number, y2: number): Array<Array<Point>> {
|
|
19
|
-
const clippedLines = [];
|
|
20
|
-
|
|
21
|
-
for (let l = 0; l < lines.length; l++) {
|
|
22
|
-
const line = lines[l];
|
|
23
|
-
let clippedLine;
|
|
24
|
-
|
|
25
|
-
for (let i = 0; i < line.length - 1; i++) {
|
|
26
|
-
let p0 = line[i];
|
|
27
|
-
let p1 = line[i + 1];
|
|
28
|
-
|
|
29
|
-
if (p0.x < x1 && p1.x < x1) {
|
|
30
|
-
continue;
|
|
31
|
-
} else if (p0.x < x1) {
|
|
32
|
-
p0 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();
|
|
33
|
-
} else if (p1.x < x1) {
|
|
34
|
-
p1 = new Point(x1, p0.y + (p1.y - p0.y) * ((x1 - p0.x) / (p1.x - p0.x)))._round();
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (p0.y < y1 && p1.y < y1) {
|
|
38
|
-
continue;
|
|
39
|
-
} else if (p0.y < y1) {
|
|
40
|
-
p0 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();
|
|
41
|
-
} else if (p1.y < y1) {
|
|
42
|
-
p1 = new Point(p0.x + (p1.x - p0.x) * ((y1 - p0.y) / (p1.y - p0.y)), y1)._round();
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (p0.x >= x2 && p1.x >= x2) {
|
|
46
|
-
continue;
|
|
47
|
-
} else if (p0.x >= x2) {
|
|
48
|
-
p0 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();
|
|
49
|
-
} else if (p1.x >= x2) {
|
|
50
|
-
p1 = new Point(x2, p0.y + (p1.y - p0.y) * ((x2 - p0.x) / (p1.x - p0.x)))._round();
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (p0.y >= y2 && p1.y >= y2) {
|
|
54
|
-
continue;
|
|
55
|
-
} else if (p0.y >= y2) {
|
|
56
|
-
p0 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();
|
|
57
|
-
} else if (p1.y >= y2) {
|
|
58
|
-
p1 = new Point(p0.x + (p1.x - p0.x) * ((y2 - p0.y) / (p1.y - p0.y)), y2)._round();
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
if (!clippedLine || !p0.equals(clippedLine[clippedLine.length - 1])) {
|
|
62
|
-
clippedLine = [p0];
|
|
63
|
-
clippedLines.push(clippedLine);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
clippedLine.push(p1);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
return clippedLines;
|
|
71
|
-
}
|
|
@@ -1,217 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import type {CollisionBoxArray} from '../data/array_types';
|
|
4
|
-
import Point from '@mapbox/point-geometry';
|
|
5
|
-
import type Anchor from './anchor';
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* A CollisionFeature represents the area of the tile covered by a single label.
|
|
9
|
-
* It is used with CollisionIndex to check if the label overlaps with any
|
|
10
|
-
* previous labels. A CollisionFeature is mostly just a set of CollisionBox
|
|
11
|
-
* objects.
|
|
12
|
-
*
|
|
13
|
-
* @private
|
|
14
|
-
*/
|
|
15
|
-
class CollisionFeature {
|
|
16
|
-
boxStartIndex: number;
|
|
17
|
-
boxEndIndex: number;
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Create a CollisionFeature, adding its collision box data to the given collisionBoxArray in the process.
|
|
21
|
-
*
|
|
22
|
-
* @param line The geometry the label is placed on.
|
|
23
|
-
* @param anchor The point along the line around which the label is anchored.
|
|
24
|
-
* @param shaped The text or icon shaping results.
|
|
25
|
-
* @param boxScale A magic number used to convert from glyph metrics units to geometry units.
|
|
26
|
-
* @param padding The amount of padding to add around the label edges.
|
|
27
|
-
* @param alignLine Whether the label is aligned with the line or the viewport.
|
|
28
|
-
* @private
|
|
29
|
-
*/
|
|
30
|
-
constructor(collisionBoxArray: CollisionBoxArray,
|
|
31
|
-
line: Array<Point>,
|
|
32
|
-
anchor: Anchor,
|
|
33
|
-
featureIndex: number,
|
|
34
|
-
sourceLayerIndex: number,
|
|
35
|
-
bucketIndex: number,
|
|
36
|
-
shaped: Object,
|
|
37
|
-
boxScale: number,
|
|
38
|
-
padding: number,
|
|
39
|
-
alignLine: boolean,
|
|
40
|
-
overscaling: number,
|
|
41
|
-
rotate: number) {
|
|
42
|
-
let y1 = shaped.top * boxScale - padding;
|
|
43
|
-
let y2 = shaped.bottom * boxScale + padding;
|
|
44
|
-
let x1 = shaped.left * boxScale - padding;
|
|
45
|
-
let x2 = shaped.right * boxScale + padding;
|
|
46
|
-
|
|
47
|
-
const collisionPadding = shaped.collisionPadding;
|
|
48
|
-
if (collisionPadding) {
|
|
49
|
-
x1 -= collisionPadding[0] * boxScale;
|
|
50
|
-
y1 -= collisionPadding[1] * boxScale;
|
|
51
|
-
x2 += collisionPadding[2] * boxScale;
|
|
52
|
-
y2 += collisionPadding[3] * boxScale;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
this.boxStartIndex = collisionBoxArray.length;
|
|
56
|
-
|
|
57
|
-
if (alignLine) {
|
|
58
|
-
|
|
59
|
-
let height = y2 - y1;
|
|
60
|
-
const length = x2 - x1;
|
|
61
|
-
|
|
62
|
-
if (height > 0) {
|
|
63
|
-
// set minimum box height to avoid very many small labels
|
|
64
|
-
height = Math.max(10 * boxScale, height);
|
|
65
|
-
|
|
66
|
-
this._addLineCollisionCircles(collisionBoxArray, line, anchor, (anchor.segment: any), length, height, featureIndex, sourceLayerIndex, bucketIndex, overscaling);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
} else {
|
|
70
|
-
if (rotate) {
|
|
71
|
-
// Account for *-rotate in point collision boxes
|
|
72
|
-
// See https://github.com/mapbox/mapbox-gl-js/issues/6075
|
|
73
|
-
// Doesn't account for icon-text-fit
|
|
74
|
-
|
|
75
|
-
const tl = new Point(x1, y1);
|
|
76
|
-
const tr = new Point(x2, y1);
|
|
77
|
-
const bl = new Point(x1, y2);
|
|
78
|
-
const br = new Point(x2, y2);
|
|
79
|
-
|
|
80
|
-
const rotateRadians = rotate * Math.PI / 180;
|
|
81
|
-
|
|
82
|
-
tl._rotate(rotateRadians);
|
|
83
|
-
tr._rotate(rotateRadians);
|
|
84
|
-
bl._rotate(rotateRadians);
|
|
85
|
-
br._rotate(rotateRadians);
|
|
86
|
-
|
|
87
|
-
// Collision features require an "on-axis" geometry,
|
|
88
|
-
// so take the envelope of the rotated geometry
|
|
89
|
-
// (may be quite large for wide labels rotated 45 degrees)
|
|
90
|
-
x1 = Math.min(tl.x, tr.x, bl.x, br.x);
|
|
91
|
-
x2 = Math.max(tl.x, tr.x, bl.x, br.x);
|
|
92
|
-
y1 = Math.min(tl.y, tr.y, bl.y, br.y);
|
|
93
|
-
y2 = Math.max(tl.y, tr.y, bl.y, br.y);
|
|
94
|
-
}
|
|
95
|
-
collisionBoxArray.emplaceBack(anchor.x, anchor.y, x1, y1, x2, y2, featureIndex, sourceLayerIndex, bucketIndex,
|
|
96
|
-
0, 0);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
this.boxEndIndex = collisionBoxArray.length;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* Create a set of CollisionBox objects for a line.
|
|
104
|
-
*
|
|
105
|
-
* @param labelLength The length of the label in geometry units.
|
|
106
|
-
* @param anchor The point along the line around which the label is anchored.
|
|
107
|
-
* @param boxSize The size of the collision boxes that will be created.
|
|
108
|
-
* @private
|
|
109
|
-
*/
|
|
110
|
-
_addLineCollisionCircles(collisionBoxArray: CollisionBoxArray,
|
|
111
|
-
line: Array<Point>,
|
|
112
|
-
anchor: Anchor,
|
|
113
|
-
segment: number,
|
|
114
|
-
labelLength: number,
|
|
115
|
-
boxSize: number,
|
|
116
|
-
featureIndex: number,
|
|
117
|
-
sourceLayerIndex: number,
|
|
118
|
-
bucketIndex: number,
|
|
119
|
-
overscaling: number) {
|
|
120
|
-
const step = boxSize / 2;
|
|
121
|
-
const nBoxes = Math.floor(labelLength / step) || 1;
|
|
122
|
-
// We calculate line collision circles out to 300% of what would normally be our
|
|
123
|
-
// max size, to allow collision detection to work on labels that expand as
|
|
124
|
-
// they move into the distance
|
|
125
|
-
// Vertically oriented labels in the distant field can extend past this padding
|
|
126
|
-
// This is a noticeable problem in overscaled tiles where the pitch 0-based
|
|
127
|
-
// symbol spacing will put labels very close together in a pitched map.
|
|
128
|
-
// To reduce the cost of adding extra collision circles, we slowly increase
|
|
129
|
-
// them for overscaled tiles.
|
|
130
|
-
const overscalingPaddingFactor = 1 + .4 * Math.log(overscaling) / Math.LN2;
|
|
131
|
-
const nPitchPaddingBoxes = Math.floor(nBoxes * overscalingPaddingFactor / 2);
|
|
132
|
-
|
|
133
|
-
// offset the center of the first box by half a box so that the edge of the
|
|
134
|
-
// box is at the edge of the label.
|
|
135
|
-
const firstBoxOffset = -boxSize / 2;
|
|
136
|
-
|
|
137
|
-
let p = anchor;
|
|
138
|
-
let index = segment + 1;
|
|
139
|
-
let anchorDistance = firstBoxOffset;
|
|
140
|
-
const labelStartDistance = -labelLength / 2;
|
|
141
|
-
const paddingStartDistance = labelStartDistance - labelLength / 4;
|
|
142
|
-
// move backwards along the line to the first segment the label appears on
|
|
143
|
-
do {
|
|
144
|
-
index--;
|
|
145
|
-
|
|
146
|
-
if (index < 0) {
|
|
147
|
-
if (anchorDistance > labelStartDistance) {
|
|
148
|
-
// there isn't enough room for the label after the beginning of the line
|
|
149
|
-
// checkMaxAngle should have already caught this
|
|
150
|
-
return;
|
|
151
|
-
} else {
|
|
152
|
-
// The line doesn't extend far enough back for all of our padding,
|
|
153
|
-
// but we got far enough to show the label under most conditions.
|
|
154
|
-
index = 0;
|
|
155
|
-
break;
|
|
156
|
-
}
|
|
157
|
-
} else {
|
|
158
|
-
anchorDistance -= line[index].dist(p);
|
|
159
|
-
p = line[index];
|
|
160
|
-
}
|
|
161
|
-
} while (anchorDistance > paddingStartDistance);
|
|
162
|
-
|
|
163
|
-
let segmentLength = line[index].dist(line[index + 1]);
|
|
164
|
-
|
|
165
|
-
for (let i = -nPitchPaddingBoxes; i < nBoxes + nPitchPaddingBoxes; i++) {
|
|
166
|
-
|
|
167
|
-
// the distance the box will be from the anchor
|
|
168
|
-
const boxOffset = i * step;
|
|
169
|
-
let boxDistanceToAnchor = labelStartDistance + boxOffset;
|
|
170
|
-
|
|
171
|
-
// make the distance between pitch padding boxes bigger
|
|
172
|
-
if (boxOffset < 0) boxDistanceToAnchor += boxOffset;
|
|
173
|
-
if (boxOffset > labelLength) boxDistanceToAnchor += boxOffset - labelLength;
|
|
174
|
-
|
|
175
|
-
if (boxDistanceToAnchor < anchorDistance) {
|
|
176
|
-
// The line doesn't extend far enough back for this box, skip it
|
|
177
|
-
// (This could allow for line collisions on distant tiles)
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
// the box is not on the current segment. Move to the next segment.
|
|
182
|
-
while (anchorDistance + segmentLength < boxDistanceToAnchor) {
|
|
183
|
-
anchorDistance += segmentLength;
|
|
184
|
-
index++;
|
|
185
|
-
|
|
186
|
-
// There isn't enough room before the end of the line.
|
|
187
|
-
if (index + 1 >= line.length) {
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
segmentLength = line[index].dist(line[index + 1]);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// the distance the box will be from the beginning of the segment
|
|
195
|
-
const segmentBoxDistance = boxDistanceToAnchor - anchorDistance;
|
|
196
|
-
|
|
197
|
-
const p0 = line[index];
|
|
198
|
-
const p1 = line[index + 1];
|
|
199
|
-
const boxAnchorPoint = p1.sub(p0)._unit()._mult(segmentBoxDistance)._add(p0)._round();
|
|
200
|
-
|
|
201
|
-
// If the box is within boxSize of the anchor, force the box to be used
|
|
202
|
-
// (so even 0-width labels use at least one box)
|
|
203
|
-
// Otherwise, the .8 multiplication gives us a little bit of conservative
|
|
204
|
-
// padding in choosing which boxes to use (see CollisionIndex#placedCollisionCircles)
|
|
205
|
-
const paddedAnchorDistance = Math.abs(boxDistanceToAnchor - firstBoxOffset) < step ?
|
|
206
|
-
0 :
|
|
207
|
-
(boxDistanceToAnchor - firstBoxOffset) * 0.8;
|
|
208
|
-
|
|
209
|
-
collisionBoxArray.emplaceBack(boxAnchorPoint.x, boxAnchorPoint.y,
|
|
210
|
-
-boxSize / 2, -boxSize / 2, boxSize / 2, boxSize / 2,
|
|
211
|
-
featureIndex, sourceLayerIndex, bucketIndex,
|
|
212
|
-
boxSize / 2, paddedAnchorDistance);
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
export default CollisionFeature;
|
|
@@ -1,372 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import Point from '@mapbox/point-geometry';
|
|
4
|
-
|
|
5
|
-
import * as intersectionTests from '../util/intersection_tests';
|
|
6
|
-
import Grid from './grid_index';
|
|
7
|
-
import {mat4} from 'gl-matrix';
|
|
8
|
-
|
|
9
|
-
import * as projection from '../symbol/projection';
|
|
10
|
-
|
|
11
|
-
import type Transform from '../geo/transform';
|
|
12
|
-
import type {SingleCollisionBox} from '../data/bucket/symbol_bucket';
|
|
13
|
-
import type {
|
|
14
|
-
GlyphOffsetArray,
|
|
15
|
-
SymbolLineVertexArray
|
|
16
|
-
} from '../data/array_types';
|
|
17
|
-
|
|
18
|
-
// When a symbol crosses the edge that causes it to be included in
|
|
19
|
-
// collision detection, it will cause changes in the symbols around
|
|
20
|
-
// it. This constant specifies how many pixels to pad the edge of
|
|
21
|
-
// the viewport for collision detection so that the bulk of the changes
|
|
22
|
-
// occur offscreen. Making this constant greater increases label
|
|
23
|
-
// stability, but it's expensive.
|
|
24
|
-
const viewportPadding = 100;
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* A collision index used to prevent symbols from overlapping. It keep tracks of
|
|
28
|
-
* where previous symbols have been placed and is used to check if a new
|
|
29
|
-
* symbol overlaps with any previously added symbols.
|
|
30
|
-
*
|
|
31
|
-
* There are two steps to insertion: first placeCollisionBox/Circles checks if
|
|
32
|
-
* there's room for a symbol, then insertCollisionBox/Circles actually puts the
|
|
33
|
-
* symbol in the index. The two step process allows paired symbols to be inserted
|
|
34
|
-
* together even if they overlap.
|
|
35
|
-
*
|
|
36
|
-
* @private
|
|
37
|
-
*/
|
|
38
|
-
class CollisionIndex {
|
|
39
|
-
grid: Grid;
|
|
40
|
-
ignoredGrid: Grid;
|
|
41
|
-
transform: Transform;
|
|
42
|
-
pitchfactor: number;
|
|
43
|
-
screenRightBoundary: number;
|
|
44
|
-
screenBottomBoundary: number;
|
|
45
|
-
gridRightBoundary: number;
|
|
46
|
-
gridBottomBoundary: number;
|
|
47
|
-
|
|
48
|
-
constructor(
|
|
49
|
-
transform: Transform,
|
|
50
|
-
grid: Grid = new Grid(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25),
|
|
51
|
-
ignoredGrid: Grid = new Grid(transform.width + 2 * viewportPadding, transform.height + 2 * viewportPadding, 25)
|
|
52
|
-
) {
|
|
53
|
-
this.transform = transform;
|
|
54
|
-
|
|
55
|
-
this.grid = grid;
|
|
56
|
-
this.ignoredGrid = ignoredGrid;
|
|
57
|
-
this.pitchfactor = Math.cos(transform._pitch) * transform.cameraToCenterDistance;
|
|
58
|
-
|
|
59
|
-
this.screenRightBoundary = transform.width + viewportPadding;
|
|
60
|
-
this.screenBottomBoundary = transform.height + viewportPadding;
|
|
61
|
-
this.gridRightBoundary = transform.width + 2 * viewportPadding;
|
|
62
|
-
this.gridBottomBoundary = transform.height + 2 * viewportPadding;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
placeCollisionBox(collisionBox: SingleCollisionBox, allowOverlap: boolean, textPixelRatio: number, posMatrix: mat4, collisionGroupPredicate?: any): { box: Array<number>, offscreen: boolean } {
|
|
66
|
-
const projectedPoint = this.projectAndGetPerspectiveRatio(posMatrix, collisionBox.anchorPointX, collisionBox.anchorPointY);
|
|
67
|
-
const tileToViewport = textPixelRatio * projectedPoint.perspectiveRatio;
|
|
68
|
-
const tlX = collisionBox.x1 * tileToViewport + projectedPoint.point.x;
|
|
69
|
-
const tlY = collisionBox.y1 * tileToViewport + projectedPoint.point.y;
|
|
70
|
-
const brX = collisionBox.x2 * tileToViewport + projectedPoint.point.x;
|
|
71
|
-
const brY = collisionBox.y2 * tileToViewport + projectedPoint.point.y;
|
|
72
|
-
|
|
73
|
-
if (!this.isInsideGrid(tlX, tlY, brX, brY) ||
|
|
74
|
-
(!allowOverlap && this.grid.hitTest(tlX, tlY, brX, brY, collisionGroupPredicate))) {
|
|
75
|
-
return {
|
|
76
|
-
box: [],
|
|
77
|
-
offscreen: false
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
box: [tlX, tlY, brX, brY],
|
|
83
|
-
offscreen: this.isOffscreen(tlX, tlY, brX, brY)
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
approximateTileDistance(tileDistance: any, lastSegmentAngle: number, pixelsToTileUnits: number, cameraToAnchorDistance: number, pitchWithMap: boolean): number {
|
|
88
|
-
// This is a quick and dirty solution for chosing which collision circles to use (since collision circles are
|
|
89
|
-
// laid out in tile units). Ideally, I think we should generate collision circles on the fly in viewport coordinates
|
|
90
|
-
// at the time we do collision detection.
|
|
91
|
-
// See https://github.com/mapbox/mapbox-gl-js/issues/5474
|
|
92
|
-
|
|
93
|
-
// incidenceStretch is the ratio of how much y space a label takes up on a tile while drawn perpendicular to the viewport vs
|
|
94
|
-
// how much space it would take up if it were drawn flat on the tile
|
|
95
|
-
// Using law of sines, camera_to_anchor/sin(ground_angle) = camera_to_center/sin(incidence_angle)
|
|
96
|
-
// Incidence angle 90 -> head on, sin(incidence_angle) = 1, no stretch
|
|
97
|
-
// Incidence angle 1 -> very oblique, sin(incidence_angle) =~ 0, lots of stretch
|
|
98
|
-
// ground_angle = u_pitch + PI/2 -> sin(ground_angle) = cos(u_pitch)
|
|
99
|
-
// incidenceStretch = 1 / sin(incidenceAngle)
|
|
100
|
-
|
|
101
|
-
const incidenceStretch = pitchWithMap ? 1 : cameraToAnchorDistance / this.pitchfactor;
|
|
102
|
-
const lastSegmentTile = tileDistance.lastSegmentViewportDistance * pixelsToTileUnits;
|
|
103
|
-
return tileDistance.prevTileDistance +
|
|
104
|
-
lastSegmentTile +
|
|
105
|
-
(incidenceStretch - 1) * lastSegmentTile * Math.abs(Math.sin(lastSegmentAngle));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
placeCollisionCircles(collisionCircles: Array<number>,
|
|
109
|
-
allowOverlap: boolean,
|
|
110
|
-
scale: number,
|
|
111
|
-
textPixelRatio: number,
|
|
112
|
-
symbol: any,
|
|
113
|
-
lineVertexArray: SymbolLineVertexArray,
|
|
114
|
-
glyphOffsetArray: GlyphOffsetArray,
|
|
115
|
-
fontSize: number,
|
|
116
|
-
posMatrix: mat4,
|
|
117
|
-
labelPlaneMatrix: mat4,
|
|
118
|
-
showCollisionCircles: boolean,
|
|
119
|
-
pitchWithMap: boolean,
|
|
120
|
-
collisionGroupPredicate?: any): { circles: Array<number>, offscreen: boolean } {
|
|
121
|
-
const placedCollisionCircles = [];
|
|
122
|
-
|
|
123
|
-
const projectedAnchor = this.projectAnchor(posMatrix, symbol.anchorX, symbol.anchorY);
|
|
124
|
-
|
|
125
|
-
const projectionCache = {};
|
|
126
|
-
const fontScale = fontSize / 24;
|
|
127
|
-
const lineOffsetX = symbol.lineOffsetX * fontSize;
|
|
128
|
-
const lineOffsetY = symbol.lineOffsetY * fontSize;
|
|
129
|
-
|
|
130
|
-
const tileUnitAnchorPoint = new Point(symbol.anchorX, symbol.anchorY);
|
|
131
|
-
// projection.project generates NDC coordinates, as opposed to the
|
|
132
|
-
// pixel-based grid coordinates generated by this.projectPoint
|
|
133
|
-
const labelPlaneAnchorPoint =
|
|
134
|
-
projection.project(tileUnitAnchorPoint, labelPlaneMatrix).point;
|
|
135
|
-
const firstAndLastGlyph = projection.placeFirstAndLastGlyph(
|
|
136
|
-
fontScale,
|
|
137
|
-
glyphOffsetArray,
|
|
138
|
-
lineOffsetX,
|
|
139
|
-
lineOffsetY,
|
|
140
|
-
/*flip*/ false,
|
|
141
|
-
labelPlaneAnchorPoint,
|
|
142
|
-
tileUnitAnchorPoint,
|
|
143
|
-
symbol,
|
|
144
|
-
lineVertexArray,
|
|
145
|
-
labelPlaneMatrix,
|
|
146
|
-
projectionCache,
|
|
147
|
-
/*return tile distance*/ true);
|
|
148
|
-
|
|
149
|
-
let collisionDetected = false;
|
|
150
|
-
let inGrid = false;
|
|
151
|
-
let entirelyOffscreen = true;
|
|
152
|
-
|
|
153
|
-
const tileToViewport = projectedAnchor.perspectiveRatio * textPixelRatio;
|
|
154
|
-
// pixelsToTileUnits is used for translating line geometry to tile units
|
|
155
|
-
// ... so we care about 'scale' but not 'perspectiveRatio'
|
|
156
|
-
// equivalent to pixel_to_tile_units
|
|
157
|
-
const pixelsToTileUnits = 1 / (textPixelRatio * scale);
|
|
158
|
-
|
|
159
|
-
let firstTileDistance = 0, lastTileDistance = 0;
|
|
160
|
-
if (firstAndLastGlyph) {
|
|
161
|
-
firstTileDistance = this.approximateTileDistance(firstAndLastGlyph.first.tileDistance, firstAndLastGlyph.first.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap);
|
|
162
|
-
lastTileDistance = this.approximateTileDistance(firstAndLastGlyph.last.tileDistance, firstAndLastGlyph.last.angle, pixelsToTileUnits, projectedAnchor.cameraDistance, pitchWithMap);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
for (let k = 0; k < collisionCircles.length; k += 5) {
|
|
166
|
-
const anchorPointX = collisionCircles[k];
|
|
167
|
-
const anchorPointY = collisionCircles[k + 1];
|
|
168
|
-
const tileUnitRadius = collisionCircles[k + 2];
|
|
169
|
-
const boxSignedDistanceFromAnchor = collisionCircles[k + 3];
|
|
170
|
-
if (!firstAndLastGlyph ||
|
|
171
|
-
(boxSignedDistanceFromAnchor < -firstTileDistance) ||
|
|
172
|
-
(boxSignedDistanceFromAnchor > lastTileDistance)) {
|
|
173
|
-
// The label either doesn't fit on its line or we
|
|
174
|
-
// don't need to use this circle because the label
|
|
175
|
-
// doesn't extend this far. Either way, mark the circle unused.
|
|
176
|
-
markCollisionCircleUsed(collisionCircles, k, false);
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
const projectedPoint = this.projectPoint(posMatrix, anchorPointX, anchorPointY);
|
|
181
|
-
const radius = tileUnitRadius * tileToViewport;
|
|
182
|
-
|
|
183
|
-
const atLeastOneCirclePlaced = placedCollisionCircles.length > 0;
|
|
184
|
-
if (atLeastOneCirclePlaced) {
|
|
185
|
-
const dx = projectedPoint.x - placedCollisionCircles[placedCollisionCircles.length - 4];
|
|
186
|
-
const dy = projectedPoint.y - placedCollisionCircles[placedCollisionCircles.length - 3];
|
|
187
|
-
// The circle edges touch when the distance between their centers is 2x the radius
|
|
188
|
-
// When the distance is 1x the radius, they're doubled up, and we could remove
|
|
189
|
-
// every other circle while keeping them all in touch.
|
|
190
|
-
// We actually start removing circles when the distance is √2x the radius:
|
|
191
|
-
// thinning the number of circles as much as possible is a major performance win,
|
|
192
|
-
// and the small gaps introduced don't make a very noticeable difference.
|
|
193
|
-
const placedTooDensely = radius * radius * 2 > dx * dx + dy * dy;
|
|
194
|
-
if (placedTooDensely) {
|
|
195
|
-
const atLeastOneMoreCircle = (k + 8) < collisionCircles.length;
|
|
196
|
-
if (atLeastOneMoreCircle) {
|
|
197
|
-
const nextBoxDistanceToAnchor = collisionCircles[k + 8];
|
|
198
|
-
if ((nextBoxDistanceToAnchor > -firstTileDistance) &&
|
|
199
|
-
(nextBoxDistanceToAnchor < lastTileDistance)) {
|
|
200
|
-
// Hide significantly overlapping circles, unless this is the last one we can
|
|
201
|
-
// use, in which case we want to keep it in place even if it's tightly packed
|
|
202
|
-
// with the one before it.
|
|
203
|
-
markCollisionCircleUsed(collisionCircles, k, false);
|
|
204
|
-
continue;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
const collisionBoxArrayIndex = k / 5;
|
|
210
|
-
placedCollisionCircles.push(projectedPoint.x, projectedPoint.y, radius, collisionBoxArrayIndex);
|
|
211
|
-
markCollisionCircleUsed(collisionCircles, k, true);
|
|
212
|
-
|
|
213
|
-
const x1 = projectedPoint.x - radius;
|
|
214
|
-
const y1 = projectedPoint.y - radius;
|
|
215
|
-
const x2 = projectedPoint.x + radius;
|
|
216
|
-
const y2 = projectedPoint.y + radius;
|
|
217
|
-
entirelyOffscreen = entirelyOffscreen && this.isOffscreen(x1, y1, x2, y2);
|
|
218
|
-
inGrid = inGrid || this.isInsideGrid(x1, y1, x2, y2);
|
|
219
|
-
|
|
220
|
-
if (!allowOverlap) {
|
|
221
|
-
if (this.grid.hitTestCircle(projectedPoint.x, projectedPoint.y, radius, collisionGroupPredicate)) {
|
|
222
|
-
if (!showCollisionCircles) {
|
|
223
|
-
return {
|
|
224
|
-
circles: [],
|
|
225
|
-
offscreen: false
|
|
226
|
-
};
|
|
227
|
-
} else {
|
|
228
|
-
// Don't early exit if we're showing the debug circles because we still want to calculate
|
|
229
|
-
// which circles are in use
|
|
230
|
-
collisionDetected = true;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return {
|
|
237
|
-
circles: (collisionDetected || !inGrid) ? [] : placedCollisionCircles,
|
|
238
|
-
offscreen: entirelyOffscreen
|
|
239
|
-
};
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
/**
|
|
243
|
-
* Because the geometries in the CollisionIndex are an approximation of the shape of
|
|
244
|
-
* symbols on the map, we use the CollisionIndex to look up the symbol part of
|
|
245
|
-
* `queryRenderedFeatures`.
|
|
246
|
-
*
|
|
247
|
-
* @private
|
|
248
|
-
*/
|
|
249
|
-
queryRenderedSymbols(viewportQueryGeometry: Array<Point>) {
|
|
250
|
-
if (viewportQueryGeometry.length === 0 || (this.grid.keysLength() === 0 && this.ignoredGrid.keysLength() === 0)) {
|
|
251
|
-
return {};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
const query = [];
|
|
255
|
-
let minX = Infinity;
|
|
256
|
-
let minY = Infinity;
|
|
257
|
-
let maxX = -Infinity;
|
|
258
|
-
let maxY = -Infinity;
|
|
259
|
-
for (const point of viewportQueryGeometry) {
|
|
260
|
-
const gridPoint = new Point(point.x + viewportPadding, point.y + viewportPadding);
|
|
261
|
-
minX = Math.min(minX, gridPoint.x);
|
|
262
|
-
minY = Math.min(minY, gridPoint.y);
|
|
263
|
-
maxX = Math.max(maxX, gridPoint.x);
|
|
264
|
-
maxY = Math.max(maxY, gridPoint.y);
|
|
265
|
-
query.push(gridPoint);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
const features = this.grid.query(minX, minY, maxX, maxY)
|
|
269
|
-
.concat(this.ignoredGrid.query(minX, minY, maxX, maxY));
|
|
270
|
-
|
|
271
|
-
const seenFeatures = {};
|
|
272
|
-
const result = {};
|
|
273
|
-
|
|
274
|
-
for (const feature of features) {
|
|
275
|
-
const featureKey = feature.key;
|
|
276
|
-
// Skip already seen features.
|
|
277
|
-
if (seenFeatures[featureKey.bucketInstanceId] === undefined) {
|
|
278
|
-
seenFeatures[featureKey.bucketInstanceId] = {};
|
|
279
|
-
}
|
|
280
|
-
if (seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex]) {
|
|
281
|
-
continue;
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Check if query intersects with the feature box
|
|
285
|
-
// "Collision Circles" for line labels are treated as boxes here
|
|
286
|
-
// Since there's no actual collision taking place, the circle vs. square
|
|
287
|
-
// distinction doesn't matter as much, and box geometry is easier
|
|
288
|
-
// to work with.
|
|
289
|
-
const bbox = [
|
|
290
|
-
new Point(feature.x1, feature.y1),
|
|
291
|
-
new Point(feature.x2, feature.y1),
|
|
292
|
-
new Point(feature.x2, feature.y2),
|
|
293
|
-
new Point(feature.x1, feature.y2)
|
|
294
|
-
];
|
|
295
|
-
if (!intersectionTests.polygonIntersectsPolygon(query, bbox)) {
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
seenFeatures[featureKey.bucketInstanceId][featureKey.featureIndex] = true;
|
|
300
|
-
if (result[featureKey.bucketInstanceId] === undefined) {
|
|
301
|
-
result[featureKey.bucketInstanceId] = [];
|
|
302
|
-
}
|
|
303
|
-
result[featureKey.bucketInstanceId].push(featureKey.featureIndex);
|
|
304
|
-
}
|
|
305
|
-
|
|
306
|
-
return result;
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
insertCollisionBox(collisionBox: Array<number>, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {
|
|
310
|
-
const grid = ignorePlacement ? this.ignoredGrid : this.grid;
|
|
311
|
-
|
|
312
|
-
const key = {bucketInstanceId, featureIndex, collisionGroupID};
|
|
313
|
-
grid.insert(key, collisionBox[0], collisionBox[1], collisionBox[2], collisionBox[3]);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
insertCollisionCircles(collisionCircles: Array<number>, ignorePlacement: boolean, bucketInstanceId: number, featureIndex: number, collisionGroupID: number) {
|
|
317
|
-
const grid = ignorePlacement ? this.ignoredGrid : this.grid;
|
|
318
|
-
|
|
319
|
-
const key = {bucketInstanceId, featureIndex, collisionGroupID};
|
|
320
|
-
for (let k = 0; k < collisionCircles.length; k += 4) {
|
|
321
|
-
grid.insertCircle(key, collisionCircles[k], collisionCircles[k + 1], collisionCircles[k + 2]);
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
projectAnchor(posMatrix: mat4, x: number, y: number) {
|
|
326
|
-
const p = [x, y, 0, 1];
|
|
327
|
-
projection.xyTransformMat4(p, p, posMatrix);
|
|
328
|
-
return {
|
|
329
|
-
perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3]),
|
|
330
|
-
cameraDistance: p[3]
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
projectPoint(posMatrix: mat4, x: number, y: number) {
|
|
335
|
-
const p = [x, y, 0, 1];
|
|
336
|
-
projection.xyTransformMat4(p, p, posMatrix);
|
|
337
|
-
return new Point(
|
|
338
|
-
(((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding,
|
|
339
|
-
(((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding
|
|
340
|
-
);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
projectAndGetPerspectiveRatio(posMatrix: mat4, x: number, y: number) {
|
|
344
|
-
const p = [x, y, 0, 1];
|
|
345
|
-
projection.xyTransformMat4(p, p, posMatrix);
|
|
346
|
-
const a = new Point(
|
|
347
|
-
(((p[0] / p[3] + 1) / 2) * this.transform.width) + viewportPadding,
|
|
348
|
-
(((-p[1] / p[3] + 1) / 2) * this.transform.height) + viewportPadding
|
|
349
|
-
);
|
|
350
|
-
return {
|
|
351
|
-
point: a,
|
|
352
|
-
// See perspective ratio comment in symbol_sdf.vertex
|
|
353
|
-
// We're doing collision detection in viewport space so we need
|
|
354
|
-
// to scale down boxes in the distance
|
|
355
|
-
perspectiveRatio: 0.5 + 0.5 * (this.transform.cameraToCenterDistance / p[3])
|
|
356
|
-
};
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
isOffscreen(x1: number, y1: number, x2: number, y2: number) {
|
|
360
|
-
return x2 < viewportPadding || x1 >= this.screenRightBoundary || y2 < viewportPadding || y1 > this.screenBottomBoundary;
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
isInsideGrid(x1: number, y1: number, x2: number, y2: number) {
|
|
364
|
-
return x2 >= 0 && x1 < this.gridRightBoundary && y2 >= 0 && y1 < this.gridBottomBoundary;
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
function markCollisionCircleUsed(collisionCircles: Array<number>, index: number, used: boolean) {
|
|
369
|
-
collisionCircles[index + 4] = used ? 1 : 0;
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
export default CollisionIndex;
|