@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
|
@@ -1,556 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
|
|
3
|
-
import {LineLayoutArray} from '../array_types';
|
|
4
|
-
|
|
5
|
-
import {members as layoutAttributes} from './line_attributes';
|
|
6
|
-
import SegmentVector from '../segment';
|
|
7
|
-
import {ProgramConfigurationSet} from '../program_configuration';
|
|
8
|
-
import {TriangleIndexArray} from '../index_array_type';
|
|
9
|
-
import EXTENT from '../extent';
|
|
10
|
-
import mvt from '@mapbox/vector-tile';
|
|
11
|
-
const vectorTileFeatureTypes = mvt.VectorTileFeature.types;
|
|
12
|
-
import {register} from '../../util/web_worker_transfer';
|
|
13
|
-
import {hasPattern, addPatternDependencies} from './pattern_bucket_features';
|
|
14
|
-
import loadGeometry from '../load_geometry';
|
|
15
|
-
import EvaluationParameters from '../../style/evaluation_parameters';
|
|
16
|
-
|
|
17
|
-
import type {CanonicalTileID} from '../../source/tile_id';
|
|
18
|
-
import type {
|
|
19
|
-
Bucket,
|
|
20
|
-
BucketParameters,
|
|
21
|
-
BucketFeature,
|
|
22
|
-
IndexedFeature,
|
|
23
|
-
PopulateParameters
|
|
24
|
-
} from '../bucket';
|
|
25
|
-
import type LineStyleLayer from '../../style/style_layer/line_style_layer';
|
|
26
|
-
import type Point from '@mapbox/point-geometry';
|
|
27
|
-
import type {Segment} from '../segment';
|
|
28
|
-
import type Context from '../../gl/context';
|
|
29
|
-
import type IndexBuffer from '../../gl/index_buffer';
|
|
30
|
-
import type VertexBuffer from '../../gl/vertex_buffer';
|
|
31
|
-
import type {FeatureStates} from '../../source/source_state';
|
|
32
|
-
import type {ImagePosition} from '../../render/image_atlas';
|
|
33
|
-
|
|
34
|
-
// NOTE ON EXTRUDE SCALE:
|
|
35
|
-
// scale the extrusion vector so that the normal length is this value.
|
|
36
|
-
// contains the "texture" normals (-1..1). this is distinct from the extrude
|
|
37
|
-
// normals for line joins, because the x-value remains 0 for the texture
|
|
38
|
-
// normal array, while the extrude normal actually moves the vertex to create
|
|
39
|
-
// the acute/bevelled line join.
|
|
40
|
-
const EXTRUDE_SCALE = 63;
|
|
41
|
-
|
|
42
|
-
/*
|
|
43
|
-
* Sharp corners cause dashed lines to tilt because the distance along the line
|
|
44
|
-
* is the same at both the inner and outer corners. To improve the appearance of
|
|
45
|
-
* dashed lines we add extra points near sharp corners so that a smaller part
|
|
46
|
-
* of the line is tilted.
|
|
47
|
-
*
|
|
48
|
-
* COS_HALF_SHARP_CORNER controls how sharp a corner has to be for us to add an
|
|
49
|
-
* extra vertex. The default is 75 degrees.
|
|
50
|
-
*
|
|
51
|
-
* The newly created vertices are placed SHARP_CORNER_OFFSET pixels from the corner.
|
|
52
|
-
*/
|
|
53
|
-
const COS_HALF_SHARP_CORNER = Math.cos(75 / 2 * (Math.PI / 180));
|
|
54
|
-
const SHARP_CORNER_OFFSET = 15;
|
|
55
|
-
|
|
56
|
-
// Angle per triangle for approximating round line joins.
|
|
57
|
-
const DEG_PER_TRIANGLE = 20;
|
|
58
|
-
|
|
59
|
-
// The number of bits that is used to store the line distance in the buffer.
|
|
60
|
-
const LINE_DISTANCE_BUFFER_BITS = 15;
|
|
61
|
-
|
|
62
|
-
// We don't have enough bits for the line distance as we'd like to have, so
|
|
63
|
-
// use this value to scale the line distance (in tile units) down to a smaller
|
|
64
|
-
// value. This lets us store longer distances while sacrificing precision.
|
|
65
|
-
const LINE_DISTANCE_SCALE = 1 / 2;
|
|
66
|
-
|
|
67
|
-
// The maximum line distance, in tile units, that fits in the buffer.
|
|
68
|
-
const MAX_LINE_DISTANCE = Math.pow(2, LINE_DISTANCE_BUFFER_BITS - 1) / LINE_DISTANCE_SCALE;
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* @private
|
|
72
|
-
*/
|
|
73
|
-
class LineBucket implements Bucket {
|
|
74
|
-
distance: number;
|
|
75
|
-
totalDistance: number;
|
|
76
|
-
scaledDistance: number;
|
|
77
|
-
clipStart: number;
|
|
78
|
-
clipEnd: number;
|
|
79
|
-
|
|
80
|
-
e1: number;
|
|
81
|
-
e2: number;
|
|
82
|
-
|
|
83
|
-
index: number;
|
|
84
|
-
zoom: number;
|
|
85
|
-
overscaling: number;
|
|
86
|
-
layers: Array<LineStyleLayer>;
|
|
87
|
-
layerIds: Array<string>;
|
|
88
|
-
stateDependentLayers: Array<any>;
|
|
89
|
-
stateDependentLayerIds: Array<string>;
|
|
90
|
-
patternFeatures: Array<BucketFeature>;
|
|
91
|
-
|
|
92
|
-
layoutVertexArray: LineLayoutArray;
|
|
93
|
-
layoutVertexBuffer: VertexBuffer;
|
|
94
|
-
|
|
95
|
-
indexArray: TriangleIndexArray;
|
|
96
|
-
indexBuffer: IndexBuffer;
|
|
97
|
-
|
|
98
|
-
hasPattern: boolean;
|
|
99
|
-
programConfigurations: ProgramConfigurationSet<LineStyleLayer>;
|
|
100
|
-
segments: SegmentVector;
|
|
101
|
-
uploaded: boolean;
|
|
102
|
-
|
|
103
|
-
constructor(options: BucketParameters<LineStyleLayer>) {
|
|
104
|
-
this.zoom = options.zoom;
|
|
105
|
-
this.overscaling = options.overscaling;
|
|
106
|
-
this.layers = options.layers;
|
|
107
|
-
this.layerIds = this.layers.map(layer => layer.id);
|
|
108
|
-
this.index = options.index;
|
|
109
|
-
this.hasPattern = false;
|
|
110
|
-
this.patternFeatures = [];
|
|
111
|
-
|
|
112
|
-
this.layoutVertexArray = new LineLayoutArray();
|
|
113
|
-
this.indexArray = new TriangleIndexArray();
|
|
114
|
-
this.programConfigurations = new ProgramConfigurationSet(layoutAttributes, options.layers, options.zoom);
|
|
115
|
-
this.segments = new SegmentVector();
|
|
116
|
-
|
|
117
|
-
this.stateDependentLayerIds = this.layers.filter((l) => l.isStateDependent()).map((l) => l.id);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
populate(features: Array<IndexedFeature>, options: PopulateParameters, canonical: CanonicalTileID) {
|
|
121
|
-
this.hasPattern = hasPattern('line', this.layers, options);
|
|
122
|
-
const lineSortKey = this.layers[0].layout.get('line-sort-key');
|
|
123
|
-
const bucketFeatures = [];
|
|
124
|
-
|
|
125
|
-
for (const {feature, id, index, sourceLayerIndex} of features) {
|
|
126
|
-
const needGeometry = this.layers[0]._featureFilter.needGeometry;
|
|
127
|
-
const evaluationFeature = {type: feature.type,
|
|
128
|
-
id,
|
|
129
|
-
properties: feature.properties,
|
|
130
|
-
geometry: needGeometry ? loadGeometry(feature) : []};
|
|
131
|
-
|
|
132
|
-
if (!this.layers[0]._featureFilter.filter(new EvaluationParameters(this.zoom), evaluationFeature, canonical)) continue;
|
|
133
|
-
|
|
134
|
-
if (!needGeometry) evaluationFeature.geometry = loadGeometry(feature);
|
|
135
|
-
|
|
136
|
-
const sortKey = lineSortKey ?
|
|
137
|
-
lineSortKey.evaluate(evaluationFeature, {}, canonical) :
|
|
138
|
-
undefined;
|
|
139
|
-
|
|
140
|
-
const bucketFeature: BucketFeature = {
|
|
141
|
-
id,
|
|
142
|
-
properties: feature.properties,
|
|
143
|
-
type: feature.type,
|
|
144
|
-
sourceLayerIndex,
|
|
145
|
-
index,
|
|
146
|
-
geometry: evaluationFeature.geometry,
|
|
147
|
-
patterns: {},
|
|
148
|
-
sortKey
|
|
149
|
-
};
|
|
150
|
-
|
|
151
|
-
bucketFeatures.push(bucketFeature);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
if (lineSortKey) {
|
|
155
|
-
bucketFeatures.sort((a, b) => {
|
|
156
|
-
// a.sortKey is always a number when in use
|
|
157
|
-
return ((a.sortKey: any): number) - ((b.sortKey: any): number);
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
for (const bucketFeature of bucketFeatures) {
|
|
162
|
-
const {geometry, index, sourceLayerIndex} = bucketFeature;
|
|
163
|
-
|
|
164
|
-
if (this.hasPattern) {
|
|
165
|
-
const patternBucketFeature = addPatternDependencies('line', this.layers, bucketFeature, this.zoom, options);
|
|
166
|
-
// pattern features are added only once the pattern is loaded into the image atlas
|
|
167
|
-
// so are stored during populate until later updated with positions by tile worker in addFeatures
|
|
168
|
-
this.patternFeatures.push(patternBucketFeature);
|
|
169
|
-
} else {
|
|
170
|
-
this.addFeature(bucketFeature, geometry, index, canonical, {});
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
const feature = features[index].feature;
|
|
174
|
-
options.featureIndex.insert(feature, geometry, index, sourceLayerIndex, this.index);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
update(states: FeatureStates, vtLayer: VectorTileLayer, imagePositions: {[_: string]: ImagePosition}) {
|
|
179
|
-
if (!this.stateDependentLayers.length) return;
|
|
180
|
-
this.programConfigurations.updatePaintArrays(states, vtLayer, this.stateDependentLayers, imagePositions);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
addFeatures(options: PopulateParameters, canonical: CanonicalTileID, imagePositions: {[_: string]: ImagePosition}) {
|
|
184
|
-
for (const feature of this.patternFeatures) {
|
|
185
|
-
this.addFeature(feature, feature.geometry, feature.index, canonical, imagePositions);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
isEmpty() {
|
|
190
|
-
return this.layoutVertexArray.length === 0;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
uploadPending() {
|
|
194
|
-
return !this.uploaded || this.programConfigurations.needsUpload;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
upload(context: Context) {
|
|
198
|
-
if (!this.uploaded) {
|
|
199
|
-
this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, layoutAttributes);
|
|
200
|
-
this.indexBuffer = context.createIndexBuffer(this.indexArray);
|
|
201
|
-
}
|
|
202
|
-
this.programConfigurations.upload(context);
|
|
203
|
-
this.uploaded = true;
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
destroy() {
|
|
207
|
-
if (!this.layoutVertexBuffer) return;
|
|
208
|
-
this.layoutVertexBuffer.destroy();
|
|
209
|
-
this.indexBuffer.destroy();
|
|
210
|
-
this.programConfigurations.destroy();
|
|
211
|
-
this.segments.destroy();
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
addFeature(feature: BucketFeature, geometry: Array<Array<Point>>, index: number, canonical: CanonicalTileID, imagePositions: {[_: string]: ImagePosition}) {
|
|
215
|
-
const layout = this.layers[0].layout;
|
|
216
|
-
const join = layout.get('line-join').evaluate(feature, {});
|
|
217
|
-
const cap = layout.get('line-cap');
|
|
218
|
-
const miterLimit = layout.get('line-miter-limit');
|
|
219
|
-
const roundLimit = layout.get('line-round-limit');
|
|
220
|
-
|
|
221
|
-
for (const line of geometry) {
|
|
222
|
-
this.addLine(line, feature, join, cap, miterLimit, roundLimit);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length, feature, index, imagePositions, canonical);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
addLine(vertices: Array<Point>, feature: BucketFeature, join: string, cap: string, miterLimit: number, roundLimit: number) {
|
|
229
|
-
this.distance = 0;
|
|
230
|
-
this.scaledDistance = 0;
|
|
231
|
-
this.totalDistance = 0;
|
|
232
|
-
|
|
233
|
-
if (!!feature.properties &&
|
|
234
|
-
feature.properties.hasOwnProperty('mapbox_clip_start') &&
|
|
235
|
-
feature.properties.hasOwnProperty('mapbox_clip_end')) {
|
|
236
|
-
|
|
237
|
-
this.clipStart = +feature.properties['mapbox_clip_start'];
|
|
238
|
-
this.clipEnd = +feature.properties['mapbox_clip_end'];
|
|
239
|
-
|
|
240
|
-
// Calculate the total distance, in tile units, of this tiled line feature
|
|
241
|
-
for (let i = 0; i < vertices.length - 1; i++) {
|
|
242
|
-
this.totalDistance += vertices[i].dist(vertices[i + 1]);
|
|
243
|
-
}
|
|
244
|
-
this.updateScaledDistance();
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
const isPolygon = vectorTileFeatureTypes[feature.type] === 'Polygon';
|
|
248
|
-
|
|
249
|
-
// If the line has duplicate vertices at the ends, adjust start/length to remove them.
|
|
250
|
-
let len = vertices.length;
|
|
251
|
-
while (len >= 2 && vertices[len - 1].equals(vertices[len - 2])) {
|
|
252
|
-
len--;
|
|
253
|
-
}
|
|
254
|
-
let first = 0;
|
|
255
|
-
while (first < len - 1 && vertices[first].equals(vertices[first + 1])) {
|
|
256
|
-
first++;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// Ignore invalid geometry.
|
|
260
|
-
if (len < (isPolygon ? 3 : 2)) return;
|
|
261
|
-
|
|
262
|
-
if (join === 'bevel') miterLimit = 1.05;
|
|
263
|
-
|
|
264
|
-
const sharpCornerOffset = this.overscaling <= 16 ?
|
|
265
|
-
SHARP_CORNER_OFFSET * EXTENT / (512 * this.overscaling) :
|
|
266
|
-
0;
|
|
267
|
-
|
|
268
|
-
// we could be more precise, but it would only save a negligible amount of space
|
|
269
|
-
const segment = this.segments.prepareSegment(len * 10, this.layoutVertexArray, this.indexArray);
|
|
270
|
-
|
|
271
|
-
let currentVertex;
|
|
272
|
-
let prevVertex = ((undefined: any): Point);
|
|
273
|
-
let nextVertex = ((undefined: any): Point);
|
|
274
|
-
let prevNormal = ((undefined: any): Point);
|
|
275
|
-
let nextNormal = ((undefined: any): Point);
|
|
276
|
-
|
|
277
|
-
// the last two vertices added
|
|
278
|
-
this.e1 = this.e2 = -1;
|
|
279
|
-
|
|
280
|
-
if (isPolygon) {
|
|
281
|
-
currentVertex = vertices[len - 2];
|
|
282
|
-
nextNormal = vertices[first].sub(currentVertex)._unit()._perp();
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
for (let i = first; i < len; i++) {
|
|
286
|
-
|
|
287
|
-
nextVertex = i === len - 1 ?
|
|
288
|
-
(isPolygon ? vertices[first + 1] : (undefined: any)) : // if it's a polygon, treat the last vertex like the first
|
|
289
|
-
vertices[i + 1]; // just the next vertex
|
|
290
|
-
|
|
291
|
-
// if two consecutive vertices exist, skip the current one
|
|
292
|
-
if (nextVertex && vertices[i].equals(nextVertex)) continue;
|
|
293
|
-
|
|
294
|
-
if (nextNormal) prevNormal = nextNormal;
|
|
295
|
-
if (currentVertex) prevVertex = currentVertex;
|
|
296
|
-
|
|
297
|
-
currentVertex = vertices[i];
|
|
298
|
-
|
|
299
|
-
// Calculate the normal towards the next vertex in this line. In case
|
|
300
|
-
// there is no next vertex, pretend that the line is continuing straight,
|
|
301
|
-
// meaning that we are just using the previous normal.
|
|
302
|
-
nextNormal = nextVertex ? nextVertex.sub(currentVertex)._unit()._perp() : prevNormal;
|
|
303
|
-
|
|
304
|
-
// If we still don't have a previous normal, this is the beginning of a
|
|
305
|
-
// non-closed line, so we're doing a straight "join".
|
|
306
|
-
prevNormal = prevNormal || nextNormal;
|
|
307
|
-
|
|
308
|
-
// Determine the normal of the join extrusion. It is the angle bisector
|
|
309
|
-
// of the segments between the previous line and the next line.
|
|
310
|
-
// In the case of 180° angles, the prev and next normals cancel each other out:
|
|
311
|
-
// prevNormal + nextNormal = (0, 0), its magnitude is 0, so the unit vector would be
|
|
312
|
-
// undefined. In that case, we're keeping the joinNormal at (0, 0), so that the cosHalfAngle
|
|
313
|
-
// below will also become 0 and miterLength will become Infinity.
|
|
314
|
-
let joinNormal = prevNormal.add(nextNormal);
|
|
315
|
-
if (joinNormal.x !== 0 || joinNormal.y !== 0) {
|
|
316
|
-
joinNormal._unit();
|
|
317
|
-
}
|
|
318
|
-
/* joinNormal prevNormal
|
|
319
|
-
* ↖ ↑
|
|
320
|
-
* .________. prevVertex
|
|
321
|
-
* |
|
|
322
|
-
* nextNormal ← | currentVertex
|
|
323
|
-
* |
|
|
324
|
-
* nextVertex !
|
|
325
|
-
*
|
|
326
|
-
*/
|
|
327
|
-
|
|
328
|
-
// calculate cosines of the angle (and its half) using dot product
|
|
329
|
-
const cosAngle = prevNormal.x * nextNormal.x + prevNormal.y * nextNormal.y;
|
|
330
|
-
const cosHalfAngle = joinNormal.x * nextNormal.x + joinNormal.y * nextNormal.y;
|
|
331
|
-
|
|
332
|
-
// Calculate the length of the miter (the ratio of the miter to the width)
|
|
333
|
-
// as the inverse of cosine of the angle between next and join normals
|
|
334
|
-
const miterLength = cosHalfAngle !== 0 ? 1 / cosHalfAngle : Infinity;
|
|
335
|
-
|
|
336
|
-
// approximate angle from cosine
|
|
337
|
-
const approxAngle = 2 * Math.sqrt(2 - 2 * cosHalfAngle);
|
|
338
|
-
|
|
339
|
-
const isSharpCorner = cosHalfAngle < COS_HALF_SHARP_CORNER && prevVertex && nextVertex;
|
|
340
|
-
const lineTurnsLeft = prevNormal.x * nextNormal.y - prevNormal.y * nextNormal.x > 0;
|
|
341
|
-
|
|
342
|
-
if (isSharpCorner && i > first) {
|
|
343
|
-
const prevSegmentLength = currentVertex.dist(prevVertex);
|
|
344
|
-
if (prevSegmentLength > 2 * sharpCornerOffset) {
|
|
345
|
-
const newPrevVertex = currentVertex.sub(currentVertex.sub(prevVertex)._mult(sharpCornerOffset / prevSegmentLength)._round());
|
|
346
|
-
this.updateDistance(prevVertex, newPrevVertex);
|
|
347
|
-
this.addCurrentVertex(newPrevVertex, prevNormal, 0, 0, segment);
|
|
348
|
-
prevVertex = newPrevVertex;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
// The join if a middle vertex, otherwise the cap.
|
|
353
|
-
const middleVertex = prevVertex && nextVertex;
|
|
354
|
-
let currentJoin = middleVertex ? join : isPolygon ? 'butt' : cap;
|
|
355
|
-
|
|
356
|
-
if (middleVertex && currentJoin === 'round') {
|
|
357
|
-
if (miterLength < roundLimit) {
|
|
358
|
-
currentJoin = 'miter';
|
|
359
|
-
} else if (miterLength <= 2) {
|
|
360
|
-
currentJoin = 'fakeround';
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
if (currentJoin === 'miter' && miterLength > miterLimit) {
|
|
365
|
-
currentJoin = 'bevel';
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
if (currentJoin === 'bevel') {
|
|
369
|
-
// The maximum extrude length is 128 / 63 = 2 times the width of the line
|
|
370
|
-
// so if miterLength >= 2 we need to draw a different type of bevel here.
|
|
371
|
-
if (miterLength > 2) currentJoin = 'flipbevel';
|
|
372
|
-
|
|
373
|
-
// If the miterLength is really small and the line bevel wouldn't be visible,
|
|
374
|
-
// just draw a miter join to save a triangle.
|
|
375
|
-
if (miterLength < miterLimit) currentJoin = 'miter';
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
// Calculate how far along the line the currentVertex is
|
|
379
|
-
if (prevVertex) this.updateDistance(prevVertex, currentVertex);
|
|
380
|
-
|
|
381
|
-
if (currentJoin === 'miter') {
|
|
382
|
-
|
|
383
|
-
joinNormal._mult(miterLength);
|
|
384
|
-
this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
|
|
385
|
-
|
|
386
|
-
} else if (currentJoin === 'flipbevel') {
|
|
387
|
-
// miter is too big, flip the direction to make a beveled join
|
|
388
|
-
|
|
389
|
-
if (miterLength > 100) {
|
|
390
|
-
// Almost parallel lines
|
|
391
|
-
joinNormal = nextNormal.mult(-1);
|
|
392
|
-
|
|
393
|
-
} else {
|
|
394
|
-
const bevelLength = miterLength * prevNormal.add(nextNormal).mag() / prevNormal.sub(nextNormal).mag();
|
|
395
|
-
joinNormal._perp()._mult(bevelLength * (lineTurnsLeft ? -1 : 1));
|
|
396
|
-
}
|
|
397
|
-
this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment);
|
|
398
|
-
this.addCurrentVertex(currentVertex, joinNormal.mult(-1), 0, 0, segment);
|
|
399
|
-
|
|
400
|
-
} else if (currentJoin === 'bevel' || currentJoin === 'fakeround') {
|
|
401
|
-
const offset = -Math.sqrt(miterLength * miterLength - 1);
|
|
402
|
-
const offsetA = lineTurnsLeft ? offset : 0;
|
|
403
|
-
const offsetB = lineTurnsLeft ? 0 : offset;
|
|
404
|
-
|
|
405
|
-
// Close previous segment with a bevel
|
|
406
|
-
if (prevVertex) {
|
|
407
|
-
this.addCurrentVertex(currentVertex, prevNormal, offsetA, offsetB, segment);
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
if (currentJoin === 'fakeround') {
|
|
411
|
-
// The join angle is sharp enough that a round join would be visible.
|
|
412
|
-
// Bevel joins fill the gap between segments with a single pie slice triangle.
|
|
413
|
-
// Create a round join by adding multiple pie slices. The join isn't actually round, but
|
|
414
|
-
// it looks like it is at the sizes we render lines at.
|
|
415
|
-
|
|
416
|
-
// pick the number of triangles for approximating round join by based on the angle between normals
|
|
417
|
-
const n = Math.round((approxAngle * 180 / Math.PI) / DEG_PER_TRIANGLE);
|
|
418
|
-
|
|
419
|
-
for (let m = 1; m < n; m++) {
|
|
420
|
-
let t = m / n;
|
|
421
|
-
if (t !== 0.5) {
|
|
422
|
-
// approximate spherical interpolation https://observablehq.com/@mourner/approximating-geometric-slerp
|
|
423
|
-
const t2 = t - 0.5;
|
|
424
|
-
const A = 1.0904 + cosAngle * (-3.2452 + cosAngle * (3.55645 - cosAngle * 1.43519));
|
|
425
|
-
const B = 0.848013 + cosAngle * (-1.06021 + cosAngle * 0.215638);
|
|
426
|
-
t = t + t * t2 * (t - 1) * (A * t2 * t2 + B);
|
|
427
|
-
}
|
|
428
|
-
const extrude = nextNormal.sub(prevNormal)._mult(t)._add(prevNormal)._unit()._mult(lineTurnsLeft ? -1 : 1);
|
|
429
|
-
this.addHalfVertex(currentVertex, extrude.x, extrude.y, false, lineTurnsLeft, 0, segment);
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
if (nextVertex) {
|
|
434
|
-
// Start next segment
|
|
435
|
-
this.addCurrentVertex(currentVertex, nextNormal, -offsetA, -offsetB, segment);
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
} else if (currentJoin === 'butt') {
|
|
439
|
-
this.addCurrentVertex(currentVertex, joinNormal, 0, 0, segment); // butt cap
|
|
440
|
-
|
|
441
|
-
} else if (currentJoin === 'square') {
|
|
442
|
-
const offset = prevVertex ? 1 : -1; // closing or starting square cap
|
|
443
|
-
this.addCurrentVertex(currentVertex, joinNormal, offset, offset, segment);
|
|
444
|
-
|
|
445
|
-
} else if (currentJoin === 'round') {
|
|
446
|
-
|
|
447
|
-
if (prevVertex) {
|
|
448
|
-
// Close previous segment with butt
|
|
449
|
-
this.addCurrentVertex(currentVertex, prevNormal, 0, 0, segment);
|
|
450
|
-
|
|
451
|
-
// Add round cap or linejoin at end of segment
|
|
452
|
-
this.addCurrentVertex(currentVertex, prevNormal, 1, 1, segment, true);
|
|
453
|
-
}
|
|
454
|
-
if (nextVertex) {
|
|
455
|
-
// Add round cap before first segment
|
|
456
|
-
this.addCurrentVertex(currentVertex, nextNormal, -1, -1, segment, true);
|
|
457
|
-
|
|
458
|
-
// Start next segment with a butt
|
|
459
|
-
this.addCurrentVertex(currentVertex, nextNormal, 0, 0, segment);
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
if (isSharpCorner && i < len - 1) {
|
|
464
|
-
const nextSegmentLength = currentVertex.dist(nextVertex);
|
|
465
|
-
if (nextSegmentLength > 2 * sharpCornerOffset) {
|
|
466
|
-
const newCurrentVertex = currentVertex.add(nextVertex.sub(currentVertex)._mult(sharpCornerOffset / nextSegmentLength)._round());
|
|
467
|
-
this.updateDistance(currentVertex, newCurrentVertex);
|
|
468
|
-
this.addCurrentVertex(newCurrentVertex, nextNormal, 0, 0, segment);
|
|
469
|
-
currentVertex = newCurrentVertex;
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
|
|
475
|
-
/**
|
|
476
|
-
* Add two vertices to the buffers.
|
|
477
|
-
*
|
|
478
|
-
* @param p the line vertex to add buffer vertices for
|
|
479
|
-
* @param normal vertex normal
|
|
480
|
-
* @param endLeft extrude to shift the left vertex along the line
|
|
481
|
-
* @param endRight extrude to shift the left vertex along the line
|
|
482
|
-
* @param segment the segment object to add the vertex to
|
|
483
|
-
* @param round whether this is a round cap
|
|
484
|
-
* @private
|
|
485
|
-
*/
|
|
486
|
-
addCurrentVertex(p: Point, normal: Point, endLeft: number, endRight: number, segment: Segment, round: boolean = false) {
|
|
487
|
-
// left and right extrude vectors, perpendicularly shifted by endLeft/endRight
|
|
488
|
-
const leftX = normal.x + normal.y * endLeft;
|
|
489
|
-
const leftY = normal.y - normal.x * endLeft;
|
|
490
|
-
const rightX = -normal.x + normal.y * endRight;
|
|
491
|
-
const rightY = -normal.y - normal.x * endRight;
|
|
492
|
-
|
|
493
|
-
this.addHalfVertex(p, leftX, leftY, round, false, endLeft, segment);
|
|
494
|
-
this.addHalfVertex(p, rightX, rightY, round, true, -endRight, segment);
|
|
495
|
-
|
|
496
|
-
// There is a maximum "distance along the line" that we can store in the buffers.
|
|
497
|
-
// When we get close to the distance, reset it to zero and add the vertex again with
|
|
498
|
-
// a distance of zero. The max distance is determined by the number of bits we allocate
|
|
499
|
-
// to `linesofar`.
|
|
500
|
-
if (this.distance > MAX_LINE_DISTANCE / 2 && this.totalDistance === 0) {
|
|
501
|
-
this.distance = 0;
|
|
502
|
-
this.addCurrentVertex(p, normal, endLeft, endRight, segment, round);
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
addHalfVertex({x, y}: Point, extrudeX: number, extrudeY: number, round: boolean, up: boolean, dir: number, segment: Segment) {
|
|
507
|
-
// scale down so that we can store longer distances while sacrificing precision.
|
|
508
|
-
const linesofar = this.scaledDistance * LINE_DISTANCE_SCALE;
|
|
509
|
-
|
|
510
|
-
this.layoutVertexArray.emplaceBack(
|
|
511
|
-
// a_pos_normal
|
|
512
|
-
// Encode round/up the least significant bits
|
|
513
|
-
(x << 1) + (round ? 1 : 0),
|
|
514
|
-
(y << 1) + (up ? 1 : 0),
|
|
515
|
-
// a_data
|
|
516
|
-
// add 128 to store a byte in an unsigned byte
|
|
517
|
-
Math.round(EXTRUDE_SCALE * extrudeX) + 128,
|
|
518
|
-
Math.round(EXTRUDE_SCALE * extrudeY) + 128,
|
|
519
|
-
// Encode the -1/0/1 direction value into the first two bits of .z of a_data.
|
|
520
|
-
// Combine it with the lower 6 bits of `linesofar` (shifted by 2 bites to make
|
|
521
|
-
// room for the direction value). The upper 8 bits of `linesofar` are placed in
|
|
522
|
-
// the `w` component.
|
|
523
|
-
((dir === 0 ? 0 : (dir < 0 ? -1 : 1)) + 1) | ((linesofar & 0x3F) << 2),
|
|
524
|
-
linesofar >> 6);
|
|
525
|
-
|
|
526
|
-
const e = segment.vertexLength++;
|
|
527
|
-
if (this.e1 >= 0 && this.e2 >= 0) {
|
|
528
|
-
this.indexArray.emplaceBack(this.e1, this.e2, e);
|
|
529
|
-
segment.primitiveLength++;
|
|
530
|
-
}
|
|
531
|
-
if (up) {
|
|
532
|
-
this.e2 = e;
|
|
533
|
-
} else {
|
|
534
|
-
this.e1 = e;
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
updateScaledDistance() {
|
|
539
|
-
// Knowing the ratio of the full linestring covered by this tiled feature, as well
|
|
540
|
-
// as the total distance (in tile units) of this tiled feature, and the distance
|
|
541
|
-
// (in tile units) of the current vertex, we can determine the relative distance
|
|
542
|
-
// of this vertex along the full linestring feature and scale it to [0, 2^15)
|
|
543
|
-
this.scaledDistance = this.totalDistance > 0 ?
|
|
544
|
-
(this.clipStart + (this.clipEnd - this.clipStart) * this.distance / this.totalDistance) * (MAX_LINE_DISTANCE - 1) :
|
|
545
|
-
this.distance;
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
updateDistance(prev: Point, next: Point) {
|
|
549
|
-
this.distance += prev.dist(next);
|
|
550
|
-
this.updateScaledDistance();
|
|
551
|
-
}
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
register('LineBucket', LineBucket, {omit: ['layers', 'patternFeatures']});
|
|
555
|
-
|
|
556
|
-
export default LineBucket;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
import {createLayout} from '../../util/struct_array';
|
|
3
|
-
|
|
4
|
-
export default createLayout([
|
|
5
|
-
// [tl.x, tl.y, br.x, br.y]
|
|
6
|
-
{name: 'a_pattern_from', components: 4, type: 'Uint16'},
|
|
7
|
-
{name: 'a_pattern_to', components: 4, type: 'Uint16'},
|
|
8
|
-
{name: 'a_pixel_ratio_from', components: 1, type: 'Uint8'},
|
|
9
|
-
{name: 'a_pixel_ratio_to', components: 1, type: 'Uint8'},
|
|
10
|
-
]);
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
// @flow
|
|
2
|
-
import type FillStyleLayer from '../../style/style_layer/fill_style_layer';
|
|
3
|
-
import type FillExtrusionStyleLayer from '../../style/style_layer/fill_extrusion_style_layer';
|
|
4
|
-
import type LineStyleLayer from '../../style/style_layer/line_style_layer';
|
|
5
|
-
|
|
6
|
-
import type {
|
|
7
|
-
BucketFeature,
|
|
8
|
-
PopulateParameters
|
|
9
|
-
} from '../bucket';
|
|
10
|
-
|
|
11
|
-
type PatternStyleLayers =
|
|
12
|
-
Array<LineStyleLayer> |
|
|
13
|
-
Array<FillStyleLayer> |
|
|
14
|
-
Array<FillExtrusionStyleLayer>;
|
|
15
|
-
|
|
16
|
-
export function hasPattern(type: string, layers: PatternStyleLayers, options: PopulateParameters) {
|
|
17
|
-
const patterns = options.patternDependencies;
|
|
18
|
-
let hasPattern = false;
|
|
19
|
-
|
|
20
|
-
for (const layer of layers) {
|
|
21
|
-
const patternProperty = layer.paint.get(`${type}-pattern`);
|
|
22
|
-
if (!patternProperty.isConstant()) {
|
|
23
|
-
hasPattern = true;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const constantPattern = patternProperty.constantOr(null);
|
|
27
|
-
if (constantPattern) {
|
|
28
|
-
hasPattern = true;
|
|
29
|
-
patterns[constantPattern.to] = true;
|
|
30
|
-
patterns[constantPattern.from] = true;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
return hasPattern;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function addPatternDependencies(type: string, layers: PatternStyleLayers, patternFeature: BucketFeature, zoom: number, options: PopulateParameters) {
|
|
38
|
-
const patterns = options.patternDependencies;
|
|
39
|
-
for (const layer of layers) {
|
|
40
|
-
const patternProperty = layer.paint.get(`${type}-pattern`);
|
|
41
|
-
|
|
42
|
-
const patternPropertyValue = patternProperty.value;
|
|
43
|
-
if (patternPropertyValue.kind !== "constant") {
|
|
44
|
-
let min = patternPropertyValue.evaluate({zoom: zoom - 1}, patternFeature, {}, options.availableImages);
|
|
45
|
-
let mid = patternPropertyValue.evaluate({zoom}, patternFeature, {}, options.availableImages);
|
|
46
|
-
let max = patternPropertyValue.evaluate({zoom: zoom + 1}, patternFeature, {}, options.availableImages);
|
|
47
|
-
min = min && min.name ? min.name : min;
|
|
48
|
-
mid = mid && mid.name ? mid.name : mid;
|
|
49
|
-
max = max && max.name ? max.name : max;
|
|
50
|
-
// add to patternDependencies
|
|
51
|
-
patterns[min] = true;
|
|
52
|
-
patterns[mid] = true;
|
|
53
|
-
patterns[max] = true;
|
|
54
|
-
|
|
55
|
-
// save for layout
|
|
56
|
-
patternFeature.patterns[layer.id] = {min, mid, max};
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
return patternFeature;
|
|
60
|
-
}
|