@mapwhit/tilerenderer 0.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/LICENSE.txt +87 -0
  2. package/README.md +25 -0
  3. package/build/min/.dir +0 -0
  4. package/build/min/package.json +3 -0
  5. package/build/min/src/shaders/_prelude.fragment.glsl.txt +13 -0
  6. package/build/min/src/shaders/_prelude.vertex.glsl.txt +14 -0
  7. package/build/min/src/shaders/background.fragment.glsl.txt +5 -0
  8. package/build/min/src/shaders/background.vertex.glsl.txt +1 -0
  9. package/build/min/src/shaders/background_pattern.fragment.glsl.txt +5 -0
  10. package/build/min/src/shaders/background_pattern.vertex.glsl.txt +1 -0
  11. package/build/min/src/shaders/circle.fragment.glsl.txt +20 -0
  12. package/build/min/src/shaders/circle.vertex.glsl.txt +17 -0
  13. package/build/min/src/shaders/clipping_mask.fragment.glsl.txt +1 -0
  14. package/build/min/src/shaders/clipping_mask.vertex.glsl.txt +1 -0
  15. package/build/min/src/shaders/collision_box.fragment.glsl.txt +1 -0
  16. package/build/min/src/shaders/collision_box.vertex.glsl.txt +1 -0
  17. package/build/min/src/shaders/collision_circle.fragment.glsl.txt +1 -0
  18. package/build/min/src/shaders/collision_circle.vertex.glsl.txt +1 -0
  19. package/build/min/src/shaders/debug.fragment.glsl.txt +1 -0
  20. package/build/min/src/shaders/debug.vertex.glsl.txt +1 -0
  21. package/build/min/src/shaders/fill.fragment.glsl.txt +10 -0
  22. package/build/min/src/shaders/fill.vertex.glsl.txt +7 -0
  23. package/build/min/src/shaders/fill_extrusion.fragment.glsl.txt +13 -0
  24. package/build/min/src/shaders/fill_extrusion.vertex.glsl.txt +9 -0
  25. package/build/min/src/shaders/fill_extrusion_pattern.fragment.glsl.txt +15 -0
  26. package/build/min/src/shaders/fill_extrusion_pattern.vertex.glsl.txt +11 -0
  27. package/build/min/src/shaders/fill_outline.fragment.glsl.txt +10 -0
  28. package/build/min/src/shaders/fill_outline.vertex.glsl.txt +7 -0
  29. package/build/min/src/shaders/fill_outline_pattern.fragment.glsl.txt +13 -0
  30. package/build/min/src/shaders/fill_outline_pattern.vertex.glsl.txt +9 -0
  31. package/build/min/src/shaders/fill_pattern.fragment.glsl.txt +13 -0
  32. package/build/min/src/shaders/fill_pattern.vertex.glsl.txt +9 -0
  33. package/build/min/src/shaders/heatmap.fragment.glsl.txt +10 -0
  34. package/build/min/src/shaders/heatmap.vertex.glsl.txt +8 -0
  35. package/build/min/src/shaders/heatmap_texture.fragment.glsl.txt +5 -0
  36. package/build/min/src/shaders/heatmap_texture.vertex.glsl.txt +1 -0
  37. package/build/min/src/shaders/hillshade.fragment.glsl.txt +7 -0
  38. package/build/min/src/shaders/hillshade.vertex.glsl.txt +1 -0
  39. package/build/min/src/shaders/hillshade_prepare.fragment.glsl.txt +8 -0
  40. package/build/min/src/shaders/hillshade_prepare.vertex.glsl.txt +1 -0
  41. package/build/min/src/shaders/line.fragment.glsl.txt +12 -0
  42. package/build/min/src/shaders/line.vertex.glsl.txt +17 -0
  43. package/build/min/src/shaders/line_gradient.fragment.glsl.txt +10 -0
  44. package/build/min/src/shaders/line_gradient.vertex.glsl.txt +16 -0
  45. package/build/min/src/shaders/line_pattern.fragment.glsl.txt +15 -0
  46. package/build/min/src/shaders/line_pattern.vertex.glsl.txt +20 -0
  47. package/build/min/src/shaders/line_sdf.fragment.glsl.txt +17 -0
  48. package/build/min/src/shaders/line_sdf.vertex.glsl.txt +20 -0
  49. package/build/min/src/shaders/raster.fragment.glsl.txt +5 -0
  50. package/build/min/src/shaders/raster.vertex.glsl.txt +1 -0
  51. package/build/min/src/shaders/symbol_icon.fragment.glsl.txt +9 -0
  52. package/build/min/src/shaders/symbol_icon.vertex.glsl.txt +5 -0
  53. package/build/min/src/shaders/symbol_sdf.fragment.glsl.txt +19 -0
  54. package/build/min/src/shaders/symbol_sdf.vertex.glsl.txt +13 -0
  55. package/package.json +44 -0
  56. package/src/css/mapbox-gl.css +506 -0
  57. package/src/css/svg/mapboxgl-ctrl-attrib.svg +3 -0
  58. package/src/css/svg/mapboxgl-ctrl-compass.svg +4 -0
  59. package/src/css/svg/mapboxgl-ctrl-fullscreen.svg +3 -0
  60. package/src/css/svg/mapboxgl-ctrl-geolocate-background.svg +3 -0
  61. package/src/css/svg/mapboxgl-ctrl-geolocate.svg +3 -0
  62. package/src/css/svg/mapboxgl-ctrl-logo-compact.svg +2 -0
  63. package/src/css/svg/mapboxgl-ctrl-logo.svg +1 -0
  64. package/src/css/svg/mapboxgl-ctrl-shrink.svg +3 -0
  65. package/src/css/svg/mapboxgl-ctrl-zoom-in.svg +3 -0
  66. package/src/css/svg/mapboxgl-ctrl-zoom-out.svg +3 -0
  67. package/src/data/array_types.js +1138 -0
  68. package/src/data/bucket/circle_attributes.js +5 -0
  69. package/src/data/bucket/circle_bucket.js +118 -0
  70. package/src/data/bucket/fill_attributes.js +5 -0
  71. package/src/data/bucket/fill_bucket.js +166 -0
  72. package/src/data/bucket/fill_extrusion_attributes.js +11 -0
  73. package/src/data/bucket/fill_extrusion_bucket.js +247 -0
  74. package/src/data/bucket/heatmap_bucket.js +12 -0
  75. package/src/data/bucket/line_attributes.js +11 -0
  76. package/src/data/bucket/line_bucket.js +625 -0
  77. package/src/data/bucket/pattern_attributes.js +9 -0
  78. package/src/data/bucket/pattern_bucket_features.js +44 -0
  79. package/src/data/bucket/symbol_attributes.js +95 -0
  80. package/src/data/bucket/symbol_bucket.js +697 -0
  81. package/src/data/bucket.js +53 -0
  82. package/src/data/dem_data.js +126 -0
  83. package/src/data/extent.js +17 -0
  84. package/src/data/feature_index.js +254 -0
  85. package/src/data/index_array_type.js +14 -0
  86. package/src/data/load_geometry.js +42 -0
  87. package/src/data/pos_attributes.js +3 -0
  88. package/src/data/program_configuration.js +782 -0
  89. package/src/data/raster_bounds_attributes.js +6 -0
  90. package/src/data/segment.js +63 -0
  91. package/src/geo/coordinate.js +78 -0
  92. package/src/geo/lng_lat.js +129 -0
  93. package/src/geo/lng_lat_bounds.js +253 -0
  94. package/src/geo/transform.js +605 -0
  95. package/src/gl/color_mode.js +21 -0
  96. package/src/gl/context.js +193 -0
  97. package/src/gl/cull_face_mode.js +22 -0
  98. package/src/gl/depth_mode.js +18 -0
  99. package/src/gl/framebuffer.js +28 -0
  100. package/src/gl/index_buffer.js +52 -0
  101. package/src/gl/stencil_mode.js +17 -0
  102. package/src/gl/types.js +0 -0
  103. package/src/gl/value.js +676 -0
  104. package/src/gl/vertex_buffer.js +101 -0
  105. package/src/index.js +50 -0
  106. package/src/render/draw_background.js +60 -0
  107. package/src/render/draw_circle.js +55 -0
  108. package/src/render/draw_collision_debug.js +45 -0
  109. package/src/render/draw_debug.js +429 -0
  110. package/src/render/draw_fill.js +143 -0
  111. package/src/render/draw_fill_extrusion.js +101 -0
  112. package/src/render/draw_heatmap.js +159 -0
  113. package/src/render/draw_hillshade.js +144 -0
  114. package/src/render/draw_line.js +99 -0
  115. package/src/render/draw_raster.js +151 -0
  116. package/src/render/draw_symbol.js +231 -0
  117. package/src/render/glyph_atlas.js +55 -0
  118. package/src/render/glyph_manager.js +145 -0
  119. package/src/render/image_atlas.js +97 -0
  120. package/src/render/image_manager.js +183 -0
  121. package/src/render/line_atlas.js +139 -0
  122. package/src/render/painter.js +483 -0
  123. package/src/render/program/background_program.js +46 -0
  124. package/src/render/program/circle_program.js +40 -0
  125. package/src/render/program/clipping_mask_program.js +11 -0
  126. package/src/render/program/collision_program.js +28 -0
  127. package/src/render/program/debug_program.js +13 -0
  128. package/src/render/program/fill_extrusion_program.js +76 -0
  129. package/src/render/program/fill_program.js +60 -0
  130. package/src/render/program/heatmap_program.js +46 -0
  131. package/src/render/program/hillshade_program.js +77 -0
  132. package/src/render/program/line_program.js +119 -0
  133. package/src/render/program/pattern.js +57 -0
  134. package/src/render/program/program_uniforms.js +46 -0
  135. package/src/render/program/raster_program.js +50 -0
  136. package/src/render/program/symbol_program.js +112 -0
  137. package/src/render/program.js +133 -0
  138. package/src/render/texture.js +88 -0
  139. package/src/render/tile_mask.js +108 -0
  140. package/src/render/uniform_binding.js +129 -0
  141. package/src/render/vertex_array_object.js +155 -0
  142. package/src/shaders/README.md +42 -0
  143. package/src/shaders/_prelude.fragment.glsl +17 -0
  144. package/src/shaders/_prelude.vertex.glsl +73 -0
  145. package/src/shaders/background.fragment.glsl +10 -0
  146. package/src/shaders/background.vertex.glsl +7 -0
  147. package/src/shaders/background_pattern.fragment.glsl +28 -0
  148. package/src/shaders/background_pattern.vertex.glsl +20 -0
  149. package/src/shaders/circle.fragment.glsl +39 -0
  150. package/src/shaders/circle.vertex.glsl +63 -0
  151. package/src/shaders/clipping_mask.fragment.glsl +3 -0
  152. package/src/shaders/clipping_mask.vertex.glsl +7 -0
  153. package/src/shaders/collision_box.fragment.glsl +21 -0
  154. package/src/shaders/collision_box.vertex.glsl +26 -0
  155. package/src/shaders/collision_circle.fragment.glsl +34 -0
  156. package/src/shaders/collision_circle.vertex.glsl +36 -0
  157. package/src/shaders/debug.fragment.glsl +5 -0
  158. package/src/shaders/debug.vertex.glsl +7 -0
  159. package/src/shaders/encode_attribute.js +19 -0
  160. package/src/shaders/fill.fragment.glsl +13 -0
  161. package/src/shaders/fill.vertex.glsl +13 -0
  162. package/src/shaders/fill_extrusion.fragment.glsl +16 -0
  163. package/src/shaders/fill_extrusion.vertex.glsl +66 -0
  164. package/src/shaders/fill_extrusion_pattern.fragment.glsl +41 -0
  165. package/src/shaders/fill_extrusion_pattern.vertex.glsl +76 -0
  166. package/src/shaders/fill_outline.fragment.glsl +17 -0
  167. package/src/shaders/fill_outline.vertex.glsl +17 -0
  168. package/src/shaders/fill_outline_pattern.fragment.glsl +43 -0
  169. package/src/shaders/fill_outline_pattern.vertex.glsl +41 -0
  170. package/src/shaders/fill_pattern.fragment.glsl +36 -0
  171. package/src/shaders/fill_pattern.vertex.glsl +36 -0
  172. package/src/shaders/heatmap.fragment.glsl +21 -0
  173. package/src/shaders/heatmap.vertex.glsl +53 -0
  174. package/src/shaders/heatmap_texture.fragment.glsl +14 -0
  175. package/src/shaders/heatmap_texture.vertex.glsl +11 -0
  176. package/src/shaders/hillshade.fragment.glsl +52 -0
  177. package/src/shaders/hillshade.vertex.glsl +11 -0
  178. package/src/shaders/hillshade_prepare.fragment.glsl +72 -0
  179. package/src/shaders/hillshade_prepare.vertex.glsl +15 -0
  180. package/src/shaders/index.js +194 -0
  181. package/src/shaders/line.fragment.glsl +28 -0
  182. package/src/shaders/line.vertex.glsl +84 -0
  183. package/src/shaders/line_gradient.fragment.glsl +34 -0
  184. package/src/shaders/line_gradient.vertex.glsl +84 -0
  185. package/src/shaders/line_pattern.fragment.glsl +69 -0
  186. package/src/shaders/line_pattern.vertex.glsl +88 -0
  187. package/src/shaders/line_sdf.fragment.glsl +44 -0
  188. package/src/shaders/line_sdf.vertex.glsl +95 -0
  189. package/src/shaders/raster.fragment.glsl +52 -0
  190. package/src/shaders/raster.vertex.glsl +21 -0
  191. package/src/shaders/symbol_icon.fragment.glsl +17 -0
  192. package/src/shaders/symbol_icon.vertex.glsl +91 -0
  193. package/src/shaders/symbol_sdf.fragment.glsl +50 -0
  194. package/src/shaders/symbol_sdf.vertex.glsl +117 -0
  195. package/src/source/geojson_source.js +267 -0
  196. package/src/source/geojson_worker_source.js +210 -0
  197. package/src/source/geojson_wrapper.js +67 -0
  198. package/src/source/image_source.js +213 -0
  199. package/src/source/load_tilejson.js +40 -0
  200. package/src/source/pixels_to_tile_units.js +17 -0
  201. package/src/source/query_features.js +198 -0
  202. package/src/source/raster_dem_tile_source.js +140 -0
  203. package/src/source/raster_dem_tile_worker_source.js +26 -0
  204. package/src/source/raster_tile_source.js +126 -0
  205. package/src/source/rtl_text_plugin.js +63 -0
  206. package/src/source/source.js +75 -0
  207. package/src/source/source_cache.js +794 -0
  208. package/src/source/source_state.js +55 -0
  209. package/src/source/tile.js +332 -0
  210. package/src/source/tile_bounds.js +40 -0
  211. package/src/source/tile_cache.js +122 -0
  212. package/src/source/tile_id.js +150 -0
  213. package/src/source/vector_tile_source.js +144 -0
  214. package/src/source/vector_tile_worker_source.js +126 -0
  215. package/src/source/worker.js +175 -0
  216. package/src/source/worker_source.js +14 -0
  217. package/src/source/worker_tile.js +199 -0
  218. package/src/style/create_style_layer.js +25 -0
  219. package/src/style/evaluation_parameters.js +45 -0
  220. package/src/style/light.js +112 -0
  221. package/src/style/load_glyph_range.js +17 -0
  222. package/src/style/load_sprite.js +26 -0
  223. package/src/style/parse_glyph_pbf.js +45 -0
  224. package/src/style/pauseable_placement.js +88 -0
  225. package/src/style/properties.js +691 -0
  226. package/src/style/query_utils.js +39 -0
  227. package/src/style/style.js +955 -0
  228. package/src/style/style_layer/background_style_layer.js +11 -0
  229. package/src/style/style_layer/background_style_layer_properties.js +25 -0
  230. package/src/style/style_layer/circle_style_layer.js +93 -0
  231. package/src/style/style_layer/circle_style_layer_properties.js +76 -0
  232. package/src/style/style_layer/fill_extrusion_style_layer.js +194 -0
  233. package/src/style/style_layer/fill_extrusion_style_layer_properties.js +56 -0
  234. package/src/style/style_layer/fill_style_layer.js +46 -0
  235. package/src/style/style_layer/fill_style_layer_properties.js +45 -0
  236. package/src/style/style_layer/heatmap_style_layer.js +51 -0
  237. package/src/style/style_layer/heatmap_style_layer_properties.js +52 -0
  238. package/src/style/style_layer/hillshade_style_layer.js +15 -0
  239. package/src/style/style_layer/hillshade_style_layer_properties.js +43 -0
  240. package/src/style/style_layer/line_style_layer.js +129 -0
  241. package/src/style/style_layer/line_style_layer_properties.js +104 -0
  242. package/src/style/style_layer/raster_style_layer.js +11 -0
  243. package/src/style/style_layer/raster_style_layer_properties.js +55 -0
  244. package/src/style/style_layer/symbol_style_layer.js +66 -0
  245. package/src/style/style_layer/symbol_style_layer_properties.js +288 -0
  246. package/src/style/style_layer.js +183 -0
  247. package/src/style/style_layer_index.js +61 -0
  248. package/src/style/zoom_history.js +36 -0
  249. package/src/style-spec/deref.js +51 -0
  250. package/src/style-spec/error/parsing_error.js +8 -0
  251. package/src/style-spec/error/validation_error.js +10 -0
  252. package/src/style-spec/expression/compound_expression.js +118 -0
  253. package/src/style-spec/expression/definitions/array.js +82 -0
  254. package/src/style-spec/expression/definitions/assertion.js +69 -0
  255. package/src/style-spec/expression/definitions/at.js +57 -0
  256. package/src/style-spec/expression/definitions/case.js +73 -0
  257. package/src/style-spec/expression/definitions/coalesce.js +68 -0
  258. package/src/style-spec/expression/definitions/coercion.js +96 -0
  259. package/src/style-spec/expression/definitions/collator.js +102 -0
  260. package/src/style-spec/expression/definitions/equals.js +93 -0
  261. package/src/style-spec/expression/definitions/index.js +407 -0
  262. package/src/style-spec/expression/definitions/interpolate.js +235 -0
  263. package/src/style-spec/expression/definitions/length.js +54 -0
  264. package/src/style-spec/expression/definitions/let.js +60 -0
  265. package/src/style-spec/expression/definitions/literal.js +64 -0
  266. package/src/style-spec/expression/definitions/match.js +142 -0
  267. package/src/style-spec/expression/definitions/step.js +116 -0
  268. package/src/style-spec/expression/definitions/var.js +38 -0
  269. package/src/style-spec/expression/evaluation_context.js +35 -0
  270. package/src/style-spec/expression/index.js +329 -0
  271. package/src/style-spec/expression/is_constant.js +63 -0
  272. package/src/style-spec/expression/parsing_context.js +213 -0
  273. package/src/style-spec/expression/parsing_error.js +9 -0
  274. package/src/style-spec/expression/runtime_error.js +12 -0
  275. package/src/style-spec/expression/scope.js +34 -0
  276. package/src/style-spec/expression/stops.js +37 -0
  277. package/src/style-spec/expression/types.js +77 -0
  278. package/src/style-spec/expression/values.js +126 -0
  279. package/src/style-spec/feature_filter/README.md +55 -0
  280. package/src/style-spec/feature_filter/index.js +158 -0
  281. package/src/style-spec/function/convert.js +256 -0
  282. package/src/style-spec/function/index.js +299 -0
  283. package/src/style-spec/group_by_layout.js +68 -0
  284. package/src/style-spec/reference/v8.json +5356 -0
  285. package/src/style-spec/util/color.js +73 -0
  286. package/src/style-spec/util/color_spaces.js +128 -0
  287. package/src/style-spec/util/eval_support.js +8 -0
  288. package/src/style-spec/util/get_type.js +18 -0
  289. package/src/style-spec/util/interpolate.js +21 -0
  290. package/src/style-spec/util/properties.js +17 -0
  291. package/src/style-spec/util/ref_properties.js +1 -0
  292. package/src/style-spec/util/result.js +19 -0
  293. package/src/symbol/anchor.js +21 -0
  294. package/src/symbol/check_max_angle.js +75 -0
  295. package/src/symbol/clip_line.js +73 -0
  296. package/src/symbol/collision_feature.js +230 -0
  297. package/src/symbol/collision_index.js +379 -0
  298. package/src/symbol/cross_tile_symbol_index.js +270 -0
  299. package/src/symbol/get_anchors.js +177 -0
  300. package/src/symbol/grid_index.js +318 -0
  301. package/src/symbol/mergelines.js +75 -0
  302. package/src/symbol/opacity_state.js +21 -0
  303. package/src/symbol/placement.js +563 -0
  304. package/src/symbol/projection.js +601 -0
  305. package/src/symbol/quads.js +173 -0
  306. package/src/symbol/shaping.js +347 -0
  307. package/src/symbol/symbol_layout.js +519 -0
  308. package/src/symbol/symbol_size.js +110 -0
  309. package/src/symbol/transform_text.js +16 -0
  310. package/src/ui/anchor.js +24 -0
  311. package/src/ui/bind_handlers.js +199 -0
  312. package/src/ui/camera.js +954 -0
  313. package/src/ui/events.js +210 -0
  314. package/src/ui/handler/box_zoom.js +151 -0
  315. package/src/ui/handler/dblclick_zoom.js +91 -0
  316. package/src/ui/handler/drag_pan.js +285 -0
  317. package/src/ui/handler/drag_rotate.js +290 -0
  318. package/src/ui/handler/frame.js +28 -0
  319. package/src/ui/handler/inertia.js +45 -0
  320. package/src/ui/handler/keyboard.js +148 -0
  321. package/src/ui/handler/scroll_zoom.js +284 -0
  322. package/src/ui/handler/touch_zoom_rotate.js +263 -0
  323. package/src/ui/map.js +1645 -0
  324. package/src/util/actor.js +104 -0
  325. package/src/util/async.js +23 -0
  326. package/src/util/browser.js +61 -0
  327. package/src/util/callback.js +26 -0
  328. package/src/util/classify_rings.js +43 -0
  329. package/src/util/color_ramp.js +24 -0
  330. package/src/util/config.js +24 -0
  331. package/src/util/dictionary_coder.js +25 -0
  332. package/src/util/dispatcher.js +68 -0
  333. package/src/util/dom.js +102 -0
  334. package/src/util/evented.js +182 -0
  335. package/src/util/find_pole_of_inaccessibility.js +129 -0
  336. package/src/util/global_worker_pool.js +15 -0
  337. package/src/util/image.js +124 -0
  338. package/src/util/interpolate.js +5 -0
  339. package/src/util/intersection_tests.js +207 -0
  340. package/src/util/is_char_in_unicode_block.js +287 -0
  341. package/src/util/loader/image.js +32 -0
  342. package/src/util/object.js +178 -0
  343. package/src/util/script_detection.js +337 -0
  344. package/src/util/struct_array.js +197 -0
  345. package/src/util/task_queue.js +57 -0
  346. package/src/util/throttle.js +26 -0
  347. package/src/util/tile_cover.js +114 -0
  348. package/src/util/token.js +13 -0
  349. package/src/util/unique_id.js +12 -0
  350. package/src/util/util.js +192 -0
  351. package/src/util/vectortile_to_geojson.js +44 -0
  352. package/src/util/verticalize_punctuation.js +112 -0
  353. package/src/util/warn.js +21 -0
  354. package/src/util/web_worker.js +5 -0
  355. package/src/util/web_worker_transfer.js +228 -0
  356. package/src/util/worker_pool.js +41 -0
@@ -0,0 +1,697 @@
1
+ const {
2
+ symbolLayoutAttributes,
3
+ collisionVertexAttributes,
4
+ collisionBoxLayout,
5
+ collisionCircleLayout,
6
+ dynamicLayoutAttributes
7
+ } = require('./symbol_attributes');
8
+
9
+ const {
10
+ SymbolLayoutArray,
11
+ SymbolDynamicLayoutArray,
12
+ SymbolOpacityArray,
13
+ CollisionBoxLayoutArray,
14
+ CollisionCircleLayoutArray,
15
+ CollisionVertexArray,
16
+ PlacedSymbolArray,
17
+ GlyphOffsetArray,
18
+ SymbolLineVertexArray
19
+ } = require('../array_types');
20
+ const Point = require('@mapbox/point-geometry');
21
+ const SegmentVector = require('../segment');
22
+ const { ProgramConfigurationSet } = require('../program_configuration');
23
+ const { TriangleIndexArray, LineIndexArray } = require('../index_array_type');
24
+ const transformText = require('../../symbol/transform_text');
25
+ const mergeLines = require('../../symbol/mergelines');
26
+ const { allowsVerticalWritingMode } = require('../../util/script_detection');
27
+ const loadGeometry = require('../load_geometry');
28
+ const mvt = require('@mapbox/vector-tile');
29
+ const vectorTileFeatureTypes = mvt.VectorTileFeature.types;
30
+ const { verticalizedCharacterMap } = require('../../util/verticalize_punctuation');
31
+ const { getSizeData } = require('../../symbol/symbol_size');
32
+ const { register } = require('../../util/web_worker_transfer');
33
+ const EvaluationParameters = require('../../style/evaluation_parameters');
34
+
35
+ // Opacity arrays are frequently updated but don't contain a lot of information, so we pack them
36
+ // tight. Each Uint32 is actually four duplicate Uint8s for the four corners of a glyph
37
+ // 7 bits are for the current opacity, and the lowest bit is the target opacity
38
+
39
+ // actually defined in symbol_attributes.js
40
+ // const placementOpacityAttributes = [
41
+ // { name: 'a_fade_opacity', components: 1, type: 'Uint32' }
42
+ // ];
43
+ const shaderOpacityAttributes = [{ name: 'a_fade_opacity', components: 1, type: 'Uint8', offset: 0 }];
44
+
45
+ function addVertex(array, anchorX, anchorY, ox, oy, tx, ty, sizeVertex) {
46
+ array.emplaceBack(
47
+ // a_pos_offset
48
+ anchorX,
49
+ anchorY,
50
+ Math.round(ox * 32),
51
+ Math.round(oy * 32),
52
+
53
+ // a_data
54
+ tx, // x coordinate of symbol on glyph atlas texture
55
+ ty, // y coordinate of symbol on glyph atlas texture
56
+ sizeVertex ? sizeVertex[0] : 0,
57
+ sizeVertex ? sizeVertex[1] : 0
58
+ );
59
+ }
60
+
61
+ function addDynamicAttributes(dynamicLayoutVertexArray, p, angle) {
62
+ dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
63
+ dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
64
+ dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
65
+ dynamicLayoutVertexArray.emplaceBack(p.x, p.y, angle);
66
+ }
67
+
68
+ class SymbolBuffers {
69
+ constructor(programConfigurations) {
70
+ this.layoutVertexArray = new SymbolLayoutArray();
71
+ this.indexArray = new TriangleIndexArray();
72
+ this.programConfigurations = programConfigurations;
73
+ this.segments = new SegmentVector();
74
+ this.dynamicLayoutVertexArray = new SymbolDynamicLayoutArray();
75
+ this.opacityVertexArray = new SymbolOpacityArray();
76
+ this.placedSymbolArray = new PlacedSymbolArray();
77
+ }
78
+
79
+ upload(context, dynamicIndexBuffer, upload, update) {
80
+ if (upload) {
81
+ this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, symbolLayoutAttributes.members);
82
+ this.indexBuffer = context.createIndexBuffer(this.indexArray, dynamicIndexBuffer);
83
+ this.dynamicLayoutVertexBuffer = context.createVertexBuffer(
84
+ this.dynamicLayoutVertexArray,
85
+ dynamicLayoutAttributes.members,
86
+ true
87
+ );
88
+ this.opacityVertexBuffer = context.createVertexBuffer(this.opacityVertexArray, shaderOpacityAttributes, true);
89
+ // This is a performance hack so that we can write to opacityVertexArray with uint32s
90
+ // even though the shaders read uint8s
91
+ this.opacityVertexBuffer.itemSize = 1;
92
+ }
93
+ if (upload || update) {
94
+ this.programConfigurations.upload(context);
95
+ }
96
+ }
97
+
98
+ destroy() {
99
+ if (!this.layoutVertexBuffer) return;
100
+ this.layoutVertexBuffer.destroy();
101
+ this.indexBuffer.destroy();
102
+ this.programConfigurations.destroy();
103
+ this.segments.destroy();
104
+ this.dynamicLayoutVertexBuffer.destroy();
105
+ this.opacityVertexBuffer.destroy();
106
+ }
107
+ }
108
+
109
+ register('SymbolBuffers', SymbolBuffers);
110
+
111
+ class CollisionBuffers {
112
+ constructor(LayoutArray, layoutAttributes, IndexArray) {
113
+ this.layoutVertexArray = new LayoutArray();
114
+ this.layoutAttributes = layoutAttributes;
115
+ this.indexArray = new IndexArray();
116
+ this.segments = new SegmentVector();
117
+ this.collisionVertexArray = new CollisionVertexArray();
118
+ }
119
+
120
+ upload(context) {
121
+ this.layoutVertexBuffer = context.createVertexBuffer(this.layoutVertexArray, this.layoutAttributes);
122
+ this.indexBuffer = context.createIndexBuffer(this.indexArray);
123
+ this.collisionVertexBuffer = context.createVertexBuffer(
124
+ this.collisionVertexArray,
125
+ collisionVertexAttributes.members,
126
+ true
127
+ );
128
+ }
129
+
130
+ destroy() {
131
+ if (!this.layoutVertexBuffer) return;
132
+ this.layoutVertexBuffer.destroy();
133
+ this.indexBuffer.destroy();
134
+ this.segments.destroy();
135
+ this.collisionVertexBuffer.destroy();
136
+ }
137
+ }
138
+
139
+ register('CollisionBuffers', CollisionBuffers);
140
+
141
+ /**
142
+ * Unlike other buckets, which simply implement #addFeature with type-specific
143
+ * logic for (essentially) triangulating feature geometries, SymbolBucket
144
+ * requires specialized behavior:
145
+ *
146
+ * 1. WorkerTile#parse(), the logical owner of the bucket creation process,
147
+ * calls SymbolBucket#populate(), which resolves text and icon tokens on
148
+ * each feature, adds each glyphs and symbols needed to the passed-in
149
+ * collections options.glyphDependencies and options.iconDependencies, and
150
+ * stores the feature data for use in subsequent step (this.features).
151
+ *
152
+ * 2. WorkerTile asynchronously requests from the main thread all of the glyphs
153
+ * and icons needed (by this bucket and any others). When glyphs and icons
154
+ * have been received, the WorkerTile creates a CollisionIndex and invokes:
155
+ *
156
+ * 3. performSymbolLayout(bucket, stacks, icons) perform texts shaping and
157
+ * layout on a Symbol Bucket. This step populates:
158
+ * `this.symbolInstances`: metadata on generated symbols
159
+ * `this.collisionBoxArray`: collision data for use by foreground
160
+ * `this.text`: SymbolBuffers for text symbols
161
+ * `this.icons`: SymbolBuffers for icons
162
+ * `this.collisionBox`: Debug SymbolBuffers for collision boxes
163
+ * `this.collisionCircle`: Debug SymbolBuffers for collision circles
164
+ * The results are sent to the foreground for rendering
165
+ *
166
+ * 4. performSymbolPlacement(bucket, collisionIndex) is run on the foreground,
167
+ * and uses the CollisionIndex along with current camera settings to determine
168
+ * which symbols can actually show on the map. Collided symbols are hidden
169
+ * using a dynamic "OpacityVertexArray".
170
+ *
171
+ * @private
172
+ */
173
+ class SymbolBucket {
174
+ constructor(options) {
175
+ this.collisionBoxArray = options.collisionBoxArray;
176
+ this.zoom = options.zoom;
177
+ this.overscaling = options.overscaling;
178
+ this.layers = options.layers;
179
+ this.layerIds = this.layers.map(layer => layer.id);
180
+ this.index = options.index;
181
+ this.pixelRatio = options.pixelRatio;
182
+ this.sourceLayerIndex = options.sourceLayerIndex;
183
+ this.hasPattern = false;
184
+
185
+ const layer = this.layers[0];
186
+ const unevaluatedLayoutValues = layer._unevaluatedLayout._values;
187
+
188
+ this.textSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['text-size']);
189
+ this.iconSizeData = getSizeData(this.zoom, unevaluatedLayoutValues['icon-size']);
190
+
191
+ const layout = this.layers[0].layout;
192
+ this.sortFeaturesByY =
193
+ layout.get('text-allow-overlap') ||
194
+ layout.get('icon-allow-overlap') ||
195
+ layout.get('text-ignore-placement') ||
196
+ layout.get('icon-ignore-placement');
197
+
198
+ this.sourceID = options.sourceID;
199
+ }
200
+
201
+ createArrays() {
202
+ this.text = new SymbolBuffers(
203
+ new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, property =>
204
+ /^text/.test(property)
205
+ )
206
+ );
207
+ this.icon = new SymbolBuffers(
208
+ new ProgramConfigurationSet(symbolLayoutAttributes.members, this.layers, this.zoom, property =>
209
+ /^icon/.test(property)
210
+ )
211
+ );
212
+
213
+ this.collisionBox = new CollisionBuffers(CollisionBoxLayoutArray, collisionBoxLayout.members, LineIndexArray);
214
+ this.collisionCircle = new CollisionBuffers(
215
+ CollisionCircleLayoutArray,
216
+ collisionCircleLayout.members,
217
+ TriangleIndexArray
218
+ );
219
+
220
+ this.glyphOffsetArray = new GlyphOffsetArray();
221
+ this.lineVertexArray = new SymbolLineVertexArray();
222
+ }
223
+
224
+ populate(features, options) {
225
+ const layer = this.layers[0];
226
+ const layout = layer.layout;
227
+
228
+ const textFont = layout.get('text-font');
229
+ const textField = layout.get('text-field');
230
+ const iconImage = layout.get('icon-image');
231
+ const hasText =
232
+ (textField.value.kind !== 'constant' || textField.value.value.length > 0) &&
233
+ (textFont.value.kind !== 'constant' || textFont.value.value.length > 0);
234
+ const hasIcon = iconImage.value.kind !== 'constant' || (iconImage.value.value && iconImage.value.value.length > 0);
235
+
236
+ this.features = [];
237
+
238
+ if (!hasText && !hasIcon) {
239
+ return;
240
+ }
241
+
242
+ const icons = options.iconDependencies;
243
+ const stacks = options.glyphDependencies;
244
+ const globalProperties = new EvaluationParameters(this.zoom);
245
+
246
+ for (const { feature, index, sourceLayerIndex } of features) {
247
+ if (!layer._featureFilter(globalProperties, feature)) {
248
+ continue;
249
+ }
250
+
251
+ let text;
252
+ if (hasText) {
253
+ text = layer.getValueAndResolveTokens('text-field', feature);
254
+ text = transformText(text, layer, feature);
255
+ }
256
+
257
+ let icon;
258
+ if (hasIcon) {
259
+ icon = layer.getValueAndResolveTokens('icon-image', feature);
260
+ }
261
+
262
+ if (!text && !icon) {
263
+ continue;
264
+ }
265
+
266
+ const symbolFeature = {
267
+ text,
268
+ icon,
269
+ index,
270
+ sourceLayerIndex,
271
+ geometry: loadGeometry(feature),
272
+ properties: feature.properties,
273
+ type: vectorTileFeatureTypes[feature.type]
274
+ };
275
+ if (typeof feature.id !== 'undefined') {
276
+ symbolFeature.id = feature.id;
277
+ }
278
+ this.features.push(symbolFeature);
279
+
280
+ if (icon) {
281
+ icons[icon] = true;
282
+ }
283
+
284
+ if (text) {
285
+ const fontStack = textFont.evaluate(feature, {}).join(',');
286
+ const stack = (stacks[fontStack] = stacks[fontStack] || {});
287
+ const textAlongLine =
288
+ layout.get('text-rotation-alignment') === 'map' && layout.get('symbol-placement') !== 'point';
289
+ const doesAllowVerticalWritingMode = allowsVerticalWritingMode(text);
290
+ for (let i = 0; i < text.length; i++) {
291
+ stack[text.charCodeAt(i)] = true;
292
+ if (textAlongLine && doesAllowVerticalWritingMode) {
293
+ const verticalChar = verticalizedCharacterMap[text.charAt(i)];
294
+ if (verticalChar) {
295
+ stack[verticalChar.charCodeAt(0)] = true;
296
+ }
297
+ }
298
+ }
299
+ }
300
+ }
301
+
302
+ if (layout.get('symbol-placement') === 'line') {
303
+ // Merge adjacent lines with the same text to improve labelling.
304
+ // It's better to place labels on one long line than on many short segments.
305
+ this.features = mergeLines(this.features);
306
+ }
307
+ }
308
+
309
+ update(states, vtLayer, imagePositions) {
310
+ if (!this.stateDependentLayers.length) return;
311
+ this.text.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
312
+ this.icon.programConfigurations.updatePaintArrays(states, vtLayer, this.layers, imagePositions);
313
+ }
314
+
315
+ isEmpty() {
316
+ return this.symbolInstances.length === 0;
317
+ }
318
+
319
+ uploadPending() {
320
+ return !this.uploaded || this.text.programConfigurations.needsUpload || this.icon.programConfigurations.needsUpload;
321
+ }
322
+
323
+ upload(context) {
324
+ if (!this.uploaded) {
325
+ this.collisionBox.upload(context);
326
+ this.collisionCircle.upload(context);
327
+ }
328
+ this.text.upload(context, this.sortFeaturesByY, !this.uploaded, this.text.programConfigurations.needsUpload);
329
+ this.icon.upload(context, this.sortFeaturesByY, !this.uploaded, this.icon.programConfigurations.needsUpload);
330
+ this.uploaded = true;
331
+ }
332
+
333
+ destroy() {
334
+ this.text.destroy();
335
+ this.icon.destroy();
336
+ this.collisionBox.destroy();
337
+ this.collisionCircle.destroy();
338
+ }
339
+
340
+ addToLineVertexArray(anchor, line) {
341
+ const lineStartIndex = this.lineVertexArray.length;
342
+ if (anchor.segment !== undefined) {
343
+ let sumForwardLength = anchor.dist(line[anchor.segment + 1]);
344
+ let sumBackwardLength = anchor.dist(line[anchor.segment]);
345
+ const vertices = {};
346
+ for (let i = anchor.segment + 1; i < line.length; i++) {
347
+ vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumForwardLength };
348
+ if (i < line.length - 1) {
349
+ sumForwardLength += line[i + 1].dist(line[i]);
350
+ }
351
+ }
352
+ for (let i = anchor.segment || 0; i >= 0; i--) {
353
+ vertices[i] = { x: line[i].x, y: line[i].y, tileUnitDistanceFromAnchor: sumBackwardLength };
354
+ if (i > 0) {
355
+ sumBackwardLength += line[i - 1].dist(line[i]);
356
+ }
357
+ }
358
+ for (let i = 0; i < line.length; i++) {
359
+ const vertex = vertices[i];
360
+ this.lineVertexArray.emplaceBack(vertex.x, vertex.y, vertex.tileUnitDistanceFromAnchor);
361
+ }
362
+ }
363
+ return {
364
+ lineStartIndex: lineStartIndex,
365
+ lineLength: this.lineVertexArray.length - lineStartIndex
366
+ };
367
+ }
368
+
369
+ addSymbols(
370
+ arrays,
371
+ quads,
372
+ sizeVertex,
373
+ lineOffset,
374
+ alongLine,
375
+ feature,
376
+ writingMode,
377
+ labelAnchor,
378
+ lineStartIndex,
379
+ lineLength
380
+ ) {
381
+ const indexArray = arrays.indexArray;
382
+ const layoutVertexArray = arrays.layoutVertexArray;
383
+ const dynamicLayoutVertexArray = arrays.dynamicLayoutVertexArray;
384
+
385
+ const segment = arrays.segments.prepareSegment(4 * quads.length, arrays.layoutVertexArray, arrays.indexArray);
386
+ const glyphOffsetArrayStart = this.glyphOffsetArray.length;
387
+ const vertexStartIndex = segment.vertexLength;
388
+
389
+ for (const symbol of quads) {
390
+ const tl = symbol.tl;
391
+ const tr = symbol.tr;
392
+ const bl = symbol.bl;
393
+ const br = symbol.br;
394
+ const tex = symbol.tex;
395
+
396
+ const index = segment.vertexLength;
397
+
398
+ const y = symbol.glyphOffset[1];
399
+ addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tl.x, y + tl.y, tex.x, tex.y, sizeVertex);
400
+ addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, tr.x, y + tr.y, tex.x + tex.w, tex.y, sizeVertex);
401
+ addVertex(layoutVertexArray, labelAnchor.x, labelAnchor.y, bl.x, y + bl.y, tex.x, tex.y + tex.h, sizeVertex);
402
+ addVertex(
403
+ layoutVertexArray,
404
+ labelAnchor.x,
405
+ labelAnchor.y,
406
+ br.x,
407
+ y + br.y,
408
+ tex.x + tex.w,
409
+ tex.y + tex.h,
410
+ sizeVertex
411
+ );
412
+
413
+ addDynamicAttributes(dynamicLayoutVertexArray, labelAnchor, 0);
414
+
415
+ indexArray.emplaceBack(index, index + 1, index + 2);
416
+ indexArray.emplaceBack(index + 1, index + 2, index + 3);
417
+
418
+ segment.vertexLength += 4;
419
+ segment.primitiveLength += 2;
420
+
421
+ this.glyphOffsetArray.emplaceBack(symbol.glyphOffset[0]);
422
+ }
423
+
424
+ arrays.placedSymbolArray.emplaceBack(
425
+ labelAnchor.x,
426
+ labelAnchor.y,
427
+ glyphOffsetArrayStart,
428
+ this.glyphOffsetArray.length - glyphOffsetArrayStart,
429
+ vertexStartIndex,
430
+ lineStartIndex,
431
+ lineLength,
432
+ labelAnchor.segment,
433
+ sizeVertex ? sizeVertex[0] : 0,
434
+ sizeVertex ? sizeVertex[1] : 0,
435
+ lineOffset[0],
436
+ lineOffset[1],
437
+ writingMode,
438
+ false
439
+ );
440
+
441
+ arrays.programConfigurations.populatePaintArrays(arrays.layoutVertexArray.length, feature, feature.index, {});
442
+ }
443
+
444
+ _addCollisionDebugVertex(layoutVertexArray, collisionVertexArray, point, anchor, extrude) {
445
+ collisionVertexArray.emplaceBack(0, 0);
446
+ return layoutVertexArray.emplaceBack(
447
+ // pos
448
+ point.x,
449
+ point.y,
450
+ // a_anchor_pos
451
+ anchor.x,
452
+ anchor.y,
453
+ // extrude
454
+ Math.round(extrude.x),
455
+ Math.round(extrude.y)
456
+ );
457
+ }
458
+
459
+ addCollisionDebugVertices(x1, y1, x2, y2, arrays, boxAnchorPoint, symbolInstance, isCircle) {
460
+ const segment = arrays.segments.prepareSegment(4, arrays.layoutVertexArray, arrays.indexArray);
461
+ const index = segment.vertexLength;
462
+
463
+ const layoutVertexArray = arrays.layoutVertexArray;
464
+ const collisionVertexArray = arrays.collisionVertexArray;
465
+
466
+ this._addCollisionDebugVertex(
467
+ layoutVertexArray,
468
+ collisionVertexArray,
469
+ boxAnchorPoint,
470
+ symbolInstance.anchor,
471
+ new Point(x1, y1)
472
+ );
473
+ this._addCollisionDebugVertex(
474
+ layoutVertexArray,
475
+ collisionVertexArray,
476
+ boxAnchorPoint,
477
+ symbolInstance.anchor,
478
+ new Point(x2, y1)
479
+ );
480
+ this._addCollisionDebugVertex(
481
+ layoutVertexArray,
482
+ collisionVertexArray,
483
+ boxAnchorPoint,
484
+ symbolInstance.anchor,
485
+ new Point(x2, y2)
486
+ );
487
+ this._addCollisionDebugVertex(
488
+ layoutVertexArray,
489
+ collisionVertexArray,
490
+ boxAnchorPoint,
491
+ symbolInstance.anchor,
492
+ new Point(x1, y2)
493
+ );
494
+
495
+ segment.vertexLength += 4;
496
+ if (isCircle) {
497
+ const indexArray = arrays.indexArray;
498
+ indexArray.emplaceBack(index, index + 1, index + 2);
499
+ indexArray.emplaceBack(index, index + 2, index + 3);
500
+
501
+ segment.primitiveLength += 2;
502
+ } else {
503
+ const indexArray = arrays.indexArray;
504
+ indexArray.emplaceBack(index, index + 1);
505
+ indexArray.emplaceBack(index + 1, index + 2);
506
+ indexArray.emplaceBack(index + 2, index + 3);
507
+ indexArray.emplaceBack(index + 3, index);
508
+
509
+ segment.primitiveLength += 4;
510
+ }
511
+ }
512
+
513
+ generateCollisionDebugBuffers() {
514
+ for (const symbolInstance of this.symbolInstances) {
515
+ symbolInstance.textCollisionFeature = {
516
+ boxStartIndex: symbolInstance.textBoxStartIndex,
517
+ boxEndIndex: symbolInstance.textBoxEndIndex
518
+ };
519
+ symbolInstance.iconCollisionFeature = {
520
+ boxStartIndex: symbolInstance.iconBoxStartIndex,
521
+ boxEndIndex: symbolInstance.iconBoxEndIndex
522
+ };
523
+
524
+ for (let i = 0; i < 2; i++) {
525
+ const feature = symbolInstance[i === 0 ? 'textCollisionFeature' : 'iconCollisionFeature'];
526
+ if (!feature) continue;
527
+
528
+ for (let b = feature.boxStartIndex; b < feature.boxEndIndex; b++) {
529
+ const box = this.collisionBoxArray.get(b);
530
+ const x1 = box.x1;
531
+ const y1 = box.y1;
532
+ const x2 = box.x2;
533
+ const y2 = box.y2;
534
+
535
+ // If the radius > 0, this collision box is actually a circle
536
+ // The data we add to the buffers is exactly the same, but we'll render with a different shader.
537
+ const isCircle = box.radius > 0;
538
+ this.addCollisionDebugVertices(
539
+ x1,
540
+ y1,
541
+ x2,
542
+ y2,
543
+ isCircle ? this.collisionCircle : this.collisionBox,
544
+ box.anchorPoint,
545
+ symbolInstance,
546
+ isCircle
547
+ );
548
+ }
549
+ }
550
+ }
551
+ }
552
+
553
+ // These flat arrays are meant to be quicker to iterate over than the source
554
+ // CollisionBoxArray
555
+ deserializeCollisionBoxes(collisionBoxArray, textStartIndex, textEndIndex, iconStartIndex, iconEndIndex) {
556
+ const collisionArrays = {};
557
+ for (let k = textStartIndex; k < textEndIndex; k++) {
558
+ const box = collisionBoxArray.get(k);
559
+ if (box.radius === 0) {
560
+ collisionArrays.textBox = {
561
+ x1: box.x1,
562
+ y1: box.y1,
563
+ x2: box.x2,
564
+ y2: box.y2,
565
+ anchorPointX: box.anchorPointX,
566
+ anchorPointY: box.anchorPointY
567
+ };
568
+ collisionArrays.textFeatureIndex = box.featureIndex;
569
+ break; // Only one box allowed per instance
570
+ }
571
+ if (!collisionArrays.textCircles) {
572
+ collisionArrays.textCircles = [];
573
+ collisionArrays.textFeatureIndex = box.featureIndex;
574
+ }
575
+ const used = 1; // May be updated at collision detection time
576
+ collisionArrays.textCircles.push(
577
+ box.anchorPointX,
578
+ box.anchorPointY,
579
+ box.radius,
580
+ box.signedDistanceFromAnchor,
581
+ used
582
+ );
583
+ }
584
+ for (let k = iconStartIndex; k < iconEndIndex; k++) {
585
+ // An icon can only have one box now, so this indexing is a bit vestigial...
586
+ const box = collisionBoxArray.get(k);
587
+ if (box.radius === 0) {
588
+ collisionArrays.iconBox = {
589
+ x1: box.x1,
590
+ y1: box.y1,
591
+ x2: box.x2,
592
+ y2: box.y2,
593
+ anchorPointX: box.anchorPointX,
594
+ anchorPointY: box.anchorPointY
595
+ };
596
+ collisionArrays.iconFeatureIndex = box.featureIndex;
597
+ break; // Only one box allowed per instance
598
+ }
599
+ }
600
+ return collisionArrays;
601
+ }
602
+
603
+ hasTextData() {
604
+ return this.text.segments.get().length > 0;
605
+ }
606
+
607
+ hasIconData() {
608
+ return this.icon.segments.get().length > 0;
609
+ }
610
+
611
+ hasCollisionBoxData() {
612
+ return this.collisionBox.segments.get().length > 0;
613
+ }
614
+
615
+ hasCollisionCircleData() {
616
+ return this.collisionCircle.segments.get().length > 0;
617
+ }
618
+
619
+ sortFeatures(angle) {
620
+ if (!this.sortFeaturesByY) return;
621
+
622
+ if (this.sortedAngle === angle) return;
623
+ this.sortedAngle = angle;
624
+
625
+ // The current approach to sorting doesn't sort across segments so don't try.
626
+ // Sorting within segments separately seemed not to be worth the complexity.
627
+ if (this.text.segments.get().length > 1 || this.icon.segments.get().length > 1) return;
628
+
629
+ // If the symbols are allowed to overlap sort them by their vertical screen position.
630
+ // The index array buffer is rewritten to reference the (unchanged) vertices in the
631
+ // sorted order.
632
+
633
+ // To avoid sorting the actual symbolInstance array we sort an array of indexes.
634
+ const symbolInstanceIndexes = [];
635
+ for (let i = 0; i < this.symbolInstances.length; i++) {
636
+ symbolInstanceIndexes.push(i);
637
+ }
638
+
639
+ const sin = Math.sin(angle);
640
+ const cos = Math.cos(angle);
641
+
642
+ symbolInstanceIndexes.sort((aIndex, bIndex) => {
643
+ const a = this.symbolInstances[aIndex];
644
+ const b = this.symbolInstances[bIndex];
645
+ const aRotated = (sin * a.anchor.x + cos * a.anchor.y) | 0;
646
+ const bRotated = (sin * b.anchor.x + cos * b.anchor.y) | 0;
647
+ return aRotated - bRotated || b.featureIndex - a.featureIndex;
648
+ });
649
+
650
+ this.text.indexArray.clear();
651
+ this.icon.indexArray.clear();
652
+
653
+ this.featureSortOrder = [];
654
+
655
+ for (const i of symbolInstanceIndexes) {
656
+ const symbolInstance = this.symbolInstances[i];
657
+ this.featureSortOrder.push(symbolInstance.featureIndex);
658
+
659
+ for (const placedTextSymbolIndex of symbolInstance.placedTextSymbolIndices) {
660
+ const placedSymbol = this.text.placedSymbolArray.get(placedTextSymbolIndex);
661
+
662
+ const endIndex = placedSymbol.vertexStartIndex + placedSymbol.numGlyphs * 4;
663
+ for (let vertexIndex = placedSymbol.vertexStartIndex; vertexIndex < endIndex; vertexIndex += 4) {
664
+ this.text.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2);
665
+ this.text.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);
666
+ }
667
+ }
668
+
669
+ const placedIcon = this.icon.placedSymbolArray.get(i);
670
+ if (placedIcon.numGlyphs) {
671
+ const vertexIndex = placedIcon.vertexStartIndex;
672
+ this.icon.indexArray.emplaceBack(vertexIndex, vertexIndex + 1, vertexIndex + 2);
673
+ this.icon.indexArray.emplaceBack(vertexIndex + 1, vertexIndex + 2, vertexIndex + 3);
674
+ }
675
+ }
676
+
677
+ if (this.text.indexBuffer) this.text.indexBuffer.updateData(this.text.indexArray);
678
+ if (this.icon.indexBuffer) this.icon.indexBuffer.updateData(this.icon.indexArray);
679
+ }
680
+ }
681
+
682
+ register('SymbolBucket', SymbolBucket, {
683
+ omit: ['layers', 'collisionBoxArray', 'features', 'compareText'],
684
+ shallow: ['symbolInstances']
685
+ });
686
+
687
+ // this constant is based on the size of StructArray indexes used in a symbol
688
+ // bucket--namely, glyphOffsetArrayStart
689
+ // eg the max valid UInt16 is 65,535
690
+ // See https://github.com/mapbox/mapbox-gl-js/issues/2907 for motivation
691
+ // lineStartIndex and textBoxStartIndex could potentially be concerns
692
+ // but we expect there to be many fewer boxes/lines than glyphs
693
+ SymbolBucket.MAX_GLYPHS = 65535;
694
+
695
+ SymbolBucket.addDynamicAttributes = addDynamicAttributes;
696
+
697
+ module.exports = SymbolBucket;