@sakuzu/maplibre-gl-draw 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (636) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/LICENSE +661 -0
  3. package/README.ja.md +248 -0
  4. package/README.md +255 -0
  5. package/THIRD_PARTY_NOTICES.md +275 -0
  6. package/dist/api/api.d.ts +1259 -0
  7. package/dist/api/api.js +86 -0
  8. package/dist/api/context.d.ts +173 -0
  9. package/dist/api/context.js +193 -0
  10. package/dist/api/display-api.d.ts +1 -0
  11. package/dist/api/display-api.js +23 -0
  12. package/dist/api/event-api.d.ts +13 -0
  13. package/dist/api/event-api.js +17 -0
  14. package/dist/api/extension-api.d.ts +46 -0
  15. package/dist/api/extension-api.js +85 -0
  16. package/dist/api/feature-api.d.ts +11 -0
  17. package/dist/api/feature-api.js +101 -0
  18. package/dist/api/geometry/apply.d.ts +51 -0
  19. package/dist/api/geometry/apply.js +114 -0
  20. package/dist/api/geometry/boolean.d.ts +28 -0
  21. package/dist/api/geometry/boolean.js +65 -0
  22. package/dist/api/geometry/buffer.d.ts +11 -0
  23. package/dist/api/geometry/buffer.js +105 -0
  24. package/dist/api/geometry/split.d.ts +16 -0
  25. package/dist/api/geometry/split.js +75 -0
  26. package/dist/api/geometry/targets.d.ts +76 -0
  27. package/dist/api/geometry/targets.js +158 -0
  28. package/dist/api/geometry/types.d.ts +31 -0
  29. package/dist/api/geometry/types.js +3 -0
  30. package/dist/api/geometry-operations.d.ts +162 -0
  31. package/dist/api/geometry-operations.js +94 -0
  32. package/dist/api/group-api.d.ts +10 -0
  33. package/dist/api/group-api.js +78 -0
  34. package/dist/api/import-export/constants.d.ts +29 -0
  35. package/dist/api/import-export/constants.js +40 -0
  36. package/dist/api/import-export/embedded-file.d.ts +13 -0
  37. package/dist/api/import-export/embedded-file.js +31 -0
  38. package/dist/api/import-export/file-name.d.ts +10 -0
  39. package/dist/api/import-export/file-name.js +20 -0
  40. package/dist/api/import-export/format-detection.d.ts +12 -0
  41. package/dist/api/import-export/format-detection.js +29 -0
  42. package/dist/api/import-export/geojson-export.d.ts +19 -0
  43. package/dist/api/import-export/geojson-export.js +262 -0
  44. package/dist/api/import-export/geojson-import.d.ts +34 -0
  45. package/dist/api/import-export/geojson-import.js +538 -0
  46. package/dist/api/import-export/geometry-validation.d.ts +20 -0
  47. package/dist/api/import-export/geometry-validation.js +107 -0
  48. package/dist/api/import-export/image-import.d.ts +12 -0
  49. package/dist/api/import-export/image-import.js +53 -0
  50. package/dist/api/import-export/index.d.ts +9 -0
  51. package/dist/api/import-export/index.js +107 -0
  52. package/dist/api/import-export/native-format.d.ts +15 -0
  53. package/dist/api/import-export/native-format.js +126 -0
  54. package/dist/api/import-export/native-validation.d.ts +28 -0
  55. package/dist/api/import-export/native-validation.js +212 -0
  56. package/dist/api/import-export/own-property.d.ts +10 -0
  57. package/dist/api/import-export/own-property.js +19 -0
  58. package/dist/api/import-export/style-validation.d.ts +27 -0
  59. package/dist/api/import-export/style-validation.js +49 -0
  60. package/dist/api/import-export/types.d.ts +26 -0
  61. package/dist/api/import-export/types.js +3 -0
  62. package/dist/api/index.d.ts +15 -0
  63. package/dist/api/index.js +3 -0
  64. package/dist/api/input-api.d.ts +158 -0
  65. package/dist/api/input-api.js +144 -0
  66. package/dist/api/instance-api.d.ts +38 -0
  67. package/dist/api/instance-api.js +136 -0
  68. package/dist/api/layer-api.d.ts +12 -0
  69. package/dist/api/layer-api.js +62 -0
  70. package/dist/api/selection-api.d.ts +7 -0
  71. package/dist/api/selection-api.js +78 -0
  72. package/dist/api/snapping-api.d.ts +125 -0
  73. package/dist/api/snapping-api.js +50 -0
  74. package/dist/api/topology-api.d.ts +30 -0
  75. package/dist/api/topology-api.js +16 -0
  76. package/dist/api/tracing-api.d.ts +31 -0
  77. package/dist/api/tracing-api.js +16 -0
  78. package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
  79. package/dist/dispatcher/hit-test/box-strategies.js +275 -0
  80. package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
  81. package/dist/dispatcher/hit-test/box-strategy.js +37 -0
  82. package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
  83. package/dist/dispatcher/hit-test/globe-shape.js +70 -0
  84. package/dist/dispatcher/hit-test/index.d.ts +14 -0
  85. package/dist/dispatcher/hit-test/index.js +9 -0
  86. package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
  87. package/dist/dispatcher/hit-test/local-frame.js +112 -0
  88. package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
  89. package/dist/dispatcher/hit-test/segment-grid.js +79 -0
  90. package/dist/dispatcher/hit-test/service.d.ts +120 -0
  91. package/dist/dispatcher/hit-test/service.js +333 -0
  92. package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
  93. package/dist/dispatcher/hit-test/strategies/base.js +66 -0
  94. package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
  95. package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
  96. package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
  97. package/dist/dispatcher/hit-test/strategies/image.js +115 -0
  98. package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
  99. package/dist/dispatcher/hit-test/strategies/index.js +10 -0
  100. package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
  101. package/dist/dispatcher/hit-test/strategies/line.js +30 -0
  102. package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
  103. package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
  104. package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
  105. package/dist/dispatcher/hit-test/strategies/point.js +29 -0
  106. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
  107. package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
  108. package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
  109. package/dist/dispatcher/hit-test/topmost.js +157 -0
  110. package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
  111. package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
  112. package/dist/dispatcher/index.d.ts +15 -0
  113. package/dist/dispatcher/index.js +3 -0
  114. package/dist/dispatcher/input-router.d.ts +1 -0
  115. package/dist/dispatcher/input-router.js +288 -0
  116. package/dist/dispatcher/normalizer.d.ts +1 -0
  117. package/dist/dispatcher/normalizer.js +513 -0
  118. package/dist/dispatcher/types.d.ts +144 -0
  119. package/dist/dispatcher/types.js +15 -0
  120. package/dist/display/chunk-set.d.ts +24 -0
  121. package/dist/display/chunk-set.js +533 -0
  122. package/dist/display/chunk.d.ts +1 -0
  123. package/dist/display/chunk.js +104 -0
  124. package/dist/display/columnar/index.d.ts +12 -0
  125. package/dist/display/columnar/index.js +13 -0
  126. package/dist/display/columnar/prepare.d.ts +42 -0
  127. package/dist/display/columnar/prepare.js +116 -0
  128. package/dist/display/columnar/source.d.ts +1 -0
  129. package/dist/display/columnar/source.js +531 -0
  130. package/dist/display/columnar/table.d.ts +1 -0
  131. package/dist/display/columnar/table.js +471 -0
  132. package/dist/display/columnar/types.d.ts +223 -0
  133. package/dist/display/columnar/types.js +3 -0
  134. package/dist/display/dataset.d.ts +2 -0
  135. package/dist/display/dataset.js +891 -0
  136. package/dist/display/index.d.ts +13 -0
  137. package/dist/display/index.js +3 -0
  138. package/dist/display/interaction.d.ts +1 -0
  139. package/dist/display/interaction.js +90 -0
  140. package/dist/display/manager.d.ts +1 -0
  141. package/dist/display/manager.js +440 -0
  142. package/dist/display/packed-rtree.d.ts +1 -0
  143. package/dist/display/packed-rtree.js +244 -0
  144. package/dist/display/partition.d.ts +1 -0
  145. package/dist/display/partition.js +226 -0
  146. package/dist/display/provider.d.ts +1 -0
  147. package/dist/display/provider.js +342 -0
  148. package/dist/display/retained.d.ts +40 -0
  149. package/dist/display/retained.js +898 -0
  150. package/dist/display/selection.d.ts +13 -0
  151. package/dist/display/selection.js +226 -0
  152. package/dist/display/source.d.ts +1 -0
  153. package/dist/display/source.js +119 -0
  154. package/dist/display/spatial.d.ts +1 -0
  155. package/dist/display/spatial.js +71 -0
  156. package/dist/display/style.d.ts +1 -0
  157. package/dist/display/style.js +126 -0
  158. package/dist/display/thinning.d.ts +65 -0
  159. package/dist/display/thinning.js +910 -0
  160. package/dist/display/triangulation.d.ts +1 -0
  161. package/dist/display/triangulation.js +0 -0
  162. package/dist/display/types.d.ts +561 -0
  163. package/dist/display/types.js +43 -0
  164. package/dist/extension/feature-handler.d.ts +182 -0
  165. package/dist/extension/feature-handler.js +3 -0
  166. package/dist/extension/index.d.ts +9 -0
  167. package/dist/extension/index.js +3 -0
  168. package/dist/extension/renderers.d.ts +208 -0
  169. package/dist/extension/renderers.js +3 -0
  170. package/dist/geometry/angle.d.ts +47 -0
  171. package/dist/geometry/angle.js +44 -0
  172. package/dist/geometry/bbox.d.ts +48 -0
  173. package/dist/geometry/bbox.js +83 -0
  174. package/dist/geometry/boolean.d.ts +162 -0
  175. package/dist/geometry/boolean.js +331 -0
  176. package/dist/geometry/buffer.d.ts +72 -0
  177. package/dist/geometry/buffer.js +218 -0
  178. package/dist/geometry/circle.d.ts +55 -0
  179. package/dist/geometry/circle.js +107 -0
  180. package/dist/geometry/coords.d.ts +97 -0
  181. package/dist/geometry/coords.js +149 -0
  182. package/dist/geometry/distance.d.ts +79 -0
  183. package/dist/geometry/distance.js +111 -0
  184. package/dist/geometry/errors.d.ts +74 -0
  185. package/dist/geometry/errors.js +104 -0
  186. package/dist/geometry/index.d.ts +28 -0
  187. package/dist/geometry/index.js +38 -0
  188. package/dist/geometry/measure.d.ts +81 -0
  189. package/dist/geometry/measure.js +236 -0
  190. package/dist/geometry/predicates.d.ts +62 -0
  191. package/dist/geometry/predicates.js +132 -0
  192. package/dist/geometry/simplify.d.ts +74 -0
  193. package/dist/geometry/simplify.js +159 -0
  194. package/dist/geometry/split.d.ts +68 -0
  195. package/dist/geometry/split.js +430 -0
  196. package/dist/geometry/types.d.ts +95 -0
  197. package/dist/geometry/types.js +3 -0
  198. package/dist/geometry/units.d.ts +35 -0
  199. package/dist/geometry/units.js +41 -0
  200. package/dist/index.d.ts +72 -0
  201. package/dist/index.js +20 -0
  202. package/dist/maplibre-gl-draw.d.ts +47 -0
  203. package/dist/maplibre-gl-draw.js +407 -0
  204. package/dist/messages.d.ts +64 -0
  205. package/dist/messages.js +36 -0
  206. package/dist/modes/cursor.d.ts +1 -0
  207. package/dist/modes/cursor.js +72 -0
  208. package/dist/modes/draw/circle.d.ts +1 -0
  209. package/dist/modes/draw/circle.js +222 -0
  210. package/dist/modes/draw/commit-layer.d.ts +26 -0
  211. package/dist/modes/draw/commit-layer.js +31 -0
  212. package/dist/modes/draw/freehand.d.ts +1 -0
  213. package/dist/modes/draw/freehand.js +264 -0
  214. package/dist/modes/draw/image.d.ts +1 -0
  215. package/dist/modes/draw/image.js +60 -0
  216. package/dist/modes/draw/index.d.ts +9 -0
  217. package/dist/modes/draw/index.js +11 -0
  218. package/dist/modes/draw/line.d.ts +1 -0
  219. package/dist/modes/draw/line.js +363 -0
  220. package/dist/modes/draw/point.d.ts +1 -0
  221. package/dist/modes/draw/point.js +87 -0
  222. package/dist/modes/draw/polygon.d.ts +1 -0
  223. package/dist/modes/draw/polygon.js +378 -0
  224. package/dist/modes/draw/trace-support.d.ts +79 -0
  225. package/dist/modes/draw/trace-support.js +161 -0
  226. package/dist/modes/handler.d.ts +285 -0
  227. package/dist/modes/handler.js +3 -0
  228. package/dist/modes/index.d.ts +7 -0
  229. package/dist/modes/index.js +3 -0
  230. package/dist/modes/manager.d.ts +15 -0
  231. package/dist/modes/manager.js +196 -0
  232. package/dist/modes/select/box-selection.d.ts +52 -0
  233. package/dist/modes/select/box-selection.js +140 -0
  234. package/dist/modes/select/click-handler.d.ts +32 -0
  235. package/dist/modes/select/click-handler.js +166 -0
  236. package/dist/modes/select/cursor-handler.d.ts +15 -0
  237. package/dist/modes/select/cursor-handler.js +59 -0
  238. package/dist/modes/select/drag/auxiliary.d.ts +26 -0
  239. package/dist/modes/select/drag/auxiliary.js +56 -0
  240. package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
  241. package/dist/modes/select/drag/intermediate-writes.js +171 -0
  242. package/dist/modes/select/drag/move.d.ts +24 -0
  243. package/dist/modes/select/drag/move.js +59 -0
  244. package/dist/modes/select/drag/operation.d.ts +30 -0
  245. package/dist/modes/select/drag/operation.js +18 -0
  246. package/dist/modes/select/drag/radius.d.ts +15 -0
  247. package/dist/modes/select/drag/radius.js +49 -0
  248. package/dist/modes/select/drag/transform.d.ts +17 -0
  249. package/dist/modes/select/drag/transform.js +155 -0
  250. package/dist/modes/select/drag/vertex.d.ts +17 -0
  251. package/dist/modes/select/drag/vertex.js +163 -0
  252. package/dist/modes/select/drag-handler.d.ts +1 -0
  253. package/dist/modes/select/drag-handler.js +254 -0
  254. package/dist/modes/select/hit-helpers.d.ts +40 -0
  255. package/dist/modes/select/hit-helpers.js +51 -0
  256. package/dist/modes/select/mode.d.ts +1 -0
  257. package/dist/modes/select/mode.js +397 -0
  258. package/dist/modes/select/shortcut-handler.d.ts +40 -0
  259. package/dist/modes/select/shortcut-handler.js +128 -0
  260. package/dist/operations/index.d.ts +9 -0
  261. package/dist/operations/index.js +3 -0
  262. package/dist/operations/layer-operations.d.ts +1 -0
  263. package/dist/operations/layer-operations.js +350 -0
  264. package/dist/operations/resize.d.ts +71 -0
  265. package/dist/operations/resize.js +252 -0
  266. package/dist/operations/rotate.d.ts +17 -0
  267. package/dist/operations/rotate.js +166 -0
  268. package/dist/operations/selection-operations.d.ts +20 -0
  269. package/dist/operations/selection-operations.js +159 -0
  270. package/dist/operations/shared-vertex.d.ts +1 -0
  271. package/dist/operations/shared-vertex.js +210 -0
  272. package/dist/operations/trace-graph.d.ts +96 -0
  273. package/dist/operations/trace-graph.js +283 -0
  274. package/dist/operations/vertex.d.ts +1 -0
  275. package/dist/operations/vertex.js +538 -0
  276. package/dist/plugins/index.d.ts +10 -0
  277. package/dist/plugins/index.js +3 -0
  278. package/dist/plugins/mutation-hooks.d.ts +28 -0
  279. package/dist/plugins/mutation-hooks.js +84 -0
  280. package/dist/plugins/plugin-context.d.ts +1 -0
  281. package/dist/plugins/plugin-context.js +367 -0
  282. package/dist/plugins/plugin-manager.d.ts +103 -0
  283. package/dist/plugins/plugin-manager.js +316 -0
  284. package/dist/plugins/plugin.d.ts +529 -0
  285. package/dist/plugins/plugin.js +3 -0
  286. package/dist/shared/config/constants.d.ts +66 -0
  287. package/dist/shared/config/constants.js +60 -0
  288. package/dist/shared/config/feature-style.d.ts +155 -0
  289. package/dist/shared/config/feature-style.js +154 -0
  290. package/dist/shared/config/index.d.ts +17 -0
  291. package/dist/shared/config/index.js +8 -0
  292. package/dist/shared/config/rendering.d.ts +107 -0
  293. package/dist/shared/config/rendering.js +33 -0
  294. package/dist/shared/config/selection-highlight.d.ts +29 -0
  295. package/dist/shared/config/selection-highlight.js +35 -0
  296. package/dist/shared/config/selection.d.ts +273 -0
  297. package/dist/shared/config/selection.js +266 -0
  298. package/dist/shared/config/topology.d.ts +33 -0
  299. package/dist/shared/config/topology.js +17 -0
  300. package/dist/shared/config/trace.d.ts +40 -0
  301. package/dist/shared/config/trace.js +17 -0
  302. package/dist/shared/math/angle.d.ts +21 -0
  303. package/dist/shared/math/angle.js +34 -0
  304. package/dist/shared/math/circle.d.ts +6 -0
  305. package/dist/shared/math/circle.js +10 -0
  306. package/dist/shared/math/constants.d.ts +48 -0
  307. package/dist/shared/math/constants.js +59 -0
  308. package/dist/shared/math/distance.d.ts +78 -0
  309. package/dist/shared/math/distance.js +147 -0
  310. package/dist/shared/math/globe-subdivision.d.ts +62 -0
  311. package/dist/shared/math/globe-subdivision.js +99 -0
  312. package/dist/shared/math/index.d.ts +17 -0
  313. package/dist/shared/math/index.js +21 -0
  314. package/dist/shared/math/intersection.d.ts +63 -0
  315. package/dist/shared/math/intersection.js +236 -0
  316. package/dist/shared/math/longitude.d.ts +20 -0
  317. package/dist/shared/math/longitude.js +31 -0
  318. package/dist/shared/math/mercator-plane.d.ts +27 -0
  319. package/dist/shared/math/mercator-plane.js +26 -0
  320. package/dist/shared/math/obb.d.ts +65 -0
  321. package/dist/shared/math/obb.js +107 -0
  322. package/dist/shared/math/rotation.d.ts +93 -0
  323. package/dist/shared/math/rotation.js +186 -0
  324. package/dist/shared/math/segment-grid.d.ts +69 -0
  325. package/dist/shared/math/segment-grid.js +159 -0
  326. package/dist/shared/math/transform.d.ts +140 -0
  327. package/dist/shared/math/transform.js +189 -0
  328. package/dist/shared/types/events.d.ts +128 -0
  329. package/dist/shared/types/events.js +3 -0
  330. package/dist/shared/types/model.d.ts +950 -0
  331. package/dist/shared/types/model.js +3 -0
  332. package/dist/shared/types/selection-box.d.ts +23 -0
  333. package/dist/shared/types/selection-box.js +3 -0
  334. package/dist/shared/types/style.d.ts +68 -0
  335. package/dist/shared/types/style.js +3 -0
  336. package/dist/shared/utils/color.d.ts +49 -0
  337. package/dist/shared/utils/color.js +180 -0
  338. package/dist/shared/utils/coordinates.d.ts +52 -0
  339. package/dist/shared/utils/coordinates.js +75 -0
  340. package/dist/shared/utils/embedded-image.d.ts +34 -0
  341. package/dist/shared/utils/embedded-image.js +161 -0
  342. package/dist/shared/utils/event-emitter.d.ts +262 -0
  343. package/dist/shared/utils/event-emitter.js +44 -0
  344. package/dist/shared/utils/feature-bbox.d.ts +8 -0
  345. package/dist/shared/utils/feature-bbox.js +207 -0
  346. package/dist/shared/utils/feature-segments.d.ts +23 -0
  347. package/dist/shared/utils/feature-segments.js +179 -0
  348. package/dist/shared/utils/id.d.ts +1 -0
  349. package/dist/shared/utils/id.js +35 -0
  350. package/dist/shared/utils/image.d.ts +34 -0
  351. package/dist/shared/utils/image.js +106 -0
  352. package/dist/shared/utils/index.d.ts +15 -0
  353. package/dist/shared/utils/index.js +24 -0
  354. package/dist/shared/utils/map.d.ts +26 -0
  355. package/dist/shared/utils/map.js +35 -0
  356. package/dist/shared/utils/name-generator.d.ts +197 -0
  357. package/dist/shared/utils/name-generator.js +337 -0
  358. package/dist/shared/utils/pixel-ratio.d.ts +111 -0
  359. package/dist/shared/utils/pixel-ratio.js +85 -0
  360. package/dist/shared/utils/property.d.ts +88 -0
  361. package/dist/shared/utils/property.js +140 -0
  362. package/dist/shared/utils/vertex-ref.d.ts +23 -0
  363. package/dist/shared/utils/vertex-ref.js +20 -0
  364. package/dist/snapping/custom-targets.d.ts +1 -0
  365. package/dist/snapping/custom-targets.js +21 -0
  366. package/dist/snapping/geometry.d.ts +1 -0
  367. package/dist/snapping/geometry.js +61 -0
  368. package/dist/snapping/index.d.ts +14 -0
  369. package/dist/snapping/index.js +4 -0
  370. package/dist/snapping/indicator.d.ts +19 -0
  371. package/dist/snapping/indicator.js +145 -0
  372. package/dist/snapping/providers/display.d.ts +72 -0
  373. package/dist/snapping/providers/display.js +268 -0
  374. package/dist/snapping/providers/guide.d.ts +69 -0
  375. package/dist/snapping/providers/guide.js +187 -0
  376. package/dist/snapping/providers/intersection.d.ts +1 -0
  377. package/dist/snapping/providers/intersection.js +92 -0
  378. package/dist/snapping/providers/shared.d.ts +39 -0
  379. package/dist/snapping/providers/shared.js +146 -0
  380. package/dist/snapping/providers/store.d.ts +1 -0
  381. package/dist/snapping/providers/store.js +132 -0
  382. package/dist/snapping/service.d.ts +1 -0
  383. package/dist/snapping/service.js +272 -0
  384. package/dist/snapping/types.d.ts +267 -0
  385. package/dist/snapping/types.js +66 -0
  386. package/dist/store/change-merger.d.ts +1 -0
  387. package/dist/store/change-merger.js +102 -0
  388. package/dist/store/draw-store.d.ts +1 -0
  389. package/dist/store/draw-store.js +396 -0
  390. package/dist/store/event-bridge.d.ts +1 -0
  391. package/dist/store/event-bridge.js +161 -0
  392. package/dist/store/index.d.ts +12 -0
  393. package/dist/store/index.js +4 -0
  394. package/dist/store/local-visibility.d.ts +21 -0
  395. package/dist/store/local-visibility.js +27 -0
  396. package/dist/store/lock.d.ts +67 -0
  397. package/dist/store/lock.js +54 -0
  398. package/dist/store/memory/change-bus.d.ts +60 -0
  399. package/dist/store/memory/change-bus.js +232 -0
  400. package/dist/store/memory/file-store.d.ts +15 -0
  401. package/dist/store/memory/file-store.js +33 -0
  402. package/dist/store/memory/frozen.d.ts +21 -0
  403. package/dist/store/memory/frozen.js +51 -0
  404. package/dist/store/memory/ui-state.d.ts +51 -0
  405. package/dist/store/memory/ui-state.js +223 -0
  406. package/dist/store/memory.d.ts +26 -0
  407. package/dist/store/memory.js +708 -0
  408. package/dist/store/spatial/index.d.ts +6 -0
  409. package/dist/store/spatial/index.js +4 -0
  410. package/dist/store/spatial/spatial-index.d.ts +90 -0
  411. package/dist/store/spatial/spatial-index.js +148 -0
  412. package/dist/store/spatial/store-spatial-index.d.ts +60 -0
  413. package/dist/store/spatial/store-spatial-index.js +125 -0
  414. package/dist/store/store.d.ts +417 -0
  415. package/dist/store/store.js +3 -0
  416. package/dist/store/types.d.ts +8 -0
  417. package/dist/store/types.js +3 -0
  418. package/dist/store/writable-layer.d.ts +35 -0
  419. package/dist/store/writable-layer.js +20 -0
  420. package/dist/view/cache/buffer.d.ts +28 -0
  421. package/dist/view/cache/buffer.js +176 -0
  422. package/dist/view/cache/earcut.d.ts +1 -0
  423. package/dist/view/cache/earcut.js +122 -0
  424. package/dist/view/cache/style-rule.d.ts +1 -0
  425. package/dist/view/cache/style-rule.js +97 -0
  426. package/dist/view/cache/terrain-fill.d.ts +30 -0
  427. package/dist/view/cache/terrain-fill.js +60 -0
  428. package/dist/view/cache/texture.d.ts +14 -0
  429. package/dist/view/cache/texture.js +292 -0
  430. package/dist/view/coordinator.d.ts +27 -0
  431. package/dist/view/coordinator.js +72 -0
  432. package/dist/view/feature-companion.d.ts +173 -0
  433. package/dist/view/feature-companion.js +108 -0
  434. package/dist/view/globe-subdivision.d.ts +78 -0
  435. package/dist/view/globe-subdivision.js +128 -0
  436. package/dist/view/index.d.ts +47 -0
  437. package/dist/view/index.js +20 -0
  438. package/dist/view/layer/attach.d.ts +20 -0
  439. package/dist/view/layer/attach.js +47 -0
  440. package/dist/view/layer/blend.d.ts +57 -0
  441. package/dist/view/layer/blend.js +14 -0
  442. package/dist/view/layer/custom-layer.d.ts +1 -0
  443. package/dist/view/layer/custom-layer.js +509 -0
  444. package/dist/view/layer/depth-state.d.ts +14 -0
  445. package/dist/view/layer/depth-state.js +44 -0
  446. package/dist/view/layer/display-list.d.ts +1 -0
  447. package/dist/view/layer/display-list.js +111 -0
  448. package/dist/view/layer/drape-planner.d.ts +139 -0
  449. package/dist/view/layer/drape-planner.js +726 -0
  450. package/dist/view/layer/frame-render.d.ts +57 -0
  451. package/dist/view/layer/frame-render.js +209 -0
  452. package/dist/view/layer/frame-state.d.ts +147 -0
  453. package/dist/view/layer/frame-state.js +484 -0
  454. package/dist/view/layer/gl-state.d.ts +77 -0
  455. package/dist/view/layer/gl-state.js +132 -0
  456. package/dist/view/layer/index.d.ts +6 -0
  457. package/dist/view/layer/index.js +5 -0
  458. package/dist/view/layer/render-scope.d.ts +30 -0
  459. package/dist/view/layer/render-scope.js +28 -0
  460. package/dist/view/layer/render.d.ts +87 -0
  461. package/dist/view/layer/render.js +187 -0
  462. package/dist/view/layer/renderers.d.ts +81 -0
  463. package/dist/view/layer/renderers.js +142 -0
  464. package/dist/view/layer/slot-manager.d.ts +26 -0
  465. package/dist/view/layer/slot-manager.js +133 -0
  466. package/dist/view/layer/slots.d.ts +33 -0
  467. package/dist/view/layer/slots.js +50 -0
  468. package/dist/view/layer/store-retained-bbox.d.ts +36 -0
  469. package/dist/view/layer/store-retained-bbox.js +188 -0
  470. package/dist/view/layer/store-retained-chunk.d.ts +97 -0
  471. package/dist/view/layer/store-retained-chunk.js +94 -0
  472. package/dist/view/layer/store-retained-classify.d.ts +34 -0
  473. package/dist/view/layer/store-retained-classify.js +88 -0
  474. package/dist/view/layer/store-retained-collect.d.ts +24 -0
  475. package/dist/view/layer/store-retained-collect.js +121 -0
  476. package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
  477. package/dist/view/layer/store-retained-coord-patch.js +168 -0
  478. package/dist/view/layer/store-retained-immediate.d.ts +63 -0
  479. package/dist/view/layer/store-retained-immediate.js +49 -0
  480. package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
  481. package/dist/view/layer/store-retained-invalidation.js +192 -0
  482. package/dist/view/layer/store-retained.d.ts +198 -0
  483. package/dist/view/layer/store-retained.js +430 -0
  484. package/dist/view/layer/terrain-resolver.d.ts +1 -0
  485. package/dist/view/layer/terrain-resolver.js +174 -0
  486. package/dist/view/renderers/batch-manager.d.ts +61 -0
  487. package/dist/view/renderers/batch-manager.js +718 -0
  488. package/dist/view/renderers/draw-factors.d.ts +60 -0
  489. package/dist/view/renderers/draw-factors.js +35 -0
  490. package/dist/view/renderers/drawer.d.ts +1 -0
  491. package/dist/view/renderers/drawer.js +346 -0
  492. package/dist/view/renderers/image.d.ts +1 -0
  493. package/dist/view/renderers/image.js +255 -0
  494. package/dist/view/renderers/line/dash.d.ts +31 -0
  495. package/dist/view/renderers/line/dash.js +152 -0
  496. package/dist/view/renderers/line/line-geometry.d.ts +39 -0
  497. package/dist/view/renderers/line/line-geometry.js +460 -0
  498. package/dist/view/renderers/line/line-gl.d.ts +1 -0
  499. package/dist/view/renderers/line/line-gl.js +236 -0
  500. package/dist/view/renderers/line/line-shader.d.ts +1 -0
  501. package/dist/view/renderers/line/line-shader.js +364 -0
  502. package/dist/view/renderers/line/line-types.d.ts +43 -0
  503. package/dist/view/renderers/line/line-types.js +3 -0
  504. package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
  505. package/dist/view/renderers/line/line-uniforms.js +390 -0
  506. package/dist/view/renderers/line/sdf-line.d.ts +92 -0
  507. package/dist/view/renderers/line/sdf-line.js +567 -0
  508. package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
  509. package/dist/view/renderers/point/billboard-depth.js +56 -0
  510. package/dist/view/renderers/point/point-instance.d.ts +124 -0
  511. package/dist/view/renderers/point/point-instance.js +738 -0
  512. package/dist/view/renderers/point/point-sdf.d.ts +58 -0
  513. package/dist/view/renderers/point/point-sdf.js +170 -0
  514. package/dist/view/renderers/point/point-shape.d.ts +99 -0
  515. package/dist/view/renderers/point/point-shape.js +504 -0
  516. package/dist/view/renderers/point/point-style.d.ts +1 -0
  517. package/dist/view/renderers/point/point-style.js +46 -0
  518. package/dist/view/renderers/polygon/batch.d.ts +26 -0
  519. package/dist/view/renderers/polygon/batch.js +336 -0
  520. package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
  521. package/dist/view/renderers/polygon/earcut-input.js +55 -0
  522. package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
  523. package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
  524. package/dist/view/renderers/polygon/fill.d.ts +74 -0
  525. package/dist/view/renderers/polygon/fill.js +251 -0
  526. package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
  527. package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
  528. package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
  529. package/dist/view/renderers/polygon/terrain-cull.js +14 -0
  530. package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
  531. package/dist/view/renderers/polygon/triangulator.js +3 -0
  532. package/dist/view/renderers/retained.d.ts +43 -0
  533. package/dist/view/renderers/retained.js +3 -0
  534. package/dist/view/renderers/stroke.d.ts +121 -0
  535. package/dist/view/renderers/stroke.js +621 -0
  536. package/dist/view/shaders/frame.d.ts +8 -0
  537. package/dist/view/shaders/frame.js +37 -0
  538. package/dist/view/shaders/helpers.d.ts +238 -0
  539. package/dist/view/shaders/helpers.js +611 -0
  540. package/dist/view/shaders/initializer.d.ts +27 -0
  541. package/dist/view/shaders/initializer.js +125 -0
  542. package/dist/view/shaders/projection.d.ts +123 -0
  543. package/dist/view/shaders/projection.js +299 -0
  544. package/dist/view/shaders/quad-grid.d.ts +77 -0
  545. package/dist/view/shaders/quad-grid.js +128 -0
  546. package/dist/view/shaders/quad.d.ts +189 -0
  547. package/dist/view/shaders/quad.js +582 -0
  548. package/dist/view/shaders/retained-origin.d.ts +50 -0
  549. package/dist/view/shaders/retained-origin.js +67 -0
  550. package/dist/view/shaders/terrain-shade.d.ts +23 -0
  551. package/dist/view/shaders/terrain-shade.js +93 -0
  552. package/dist/view/style-rule.d.ts +166 -0
  553. package/dist/view/style-rule.js +300 -0
  554. package/dist/view/terrain/anchor.d.ts +135 -0
  555. package/dist/view/terrain/anchor.js +226 -0
  556. package/dist/view/terrain/context.d.ts +132 -0
  557. package/dist/view/terrain/context.js +437 -0
  558. package/dist/view/terrain/dem-atlas.d.ts +97 -0
  559. package/dist/view/terrain/dem-atlas.js +534 -0
  560. package/dist/view/terrain/detect.d.ts +126 -0
  561. package/dist/view/terrain/detect.js +198 -0
  562. package/dist/view/terrain/drape/bin-store.d.ts +179 -0
  563. package/dist/view/terrain/drape/bin-store.js +529 -0
  564. package/dist/view/terrain/drape/binning.d.ts +259 -0
  565. package/dist/view/terrain/drape/binning.js +604 -0
  566. package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
  567. package/dist/view/terrain/drape/edge-constrain.js +175 -0
  568. package/dist/view/terrain/drape/geometry.d.ts +95 -0
  569. package/dist/view/terrain/drape/geometry.js +260 -0
  570. package/dist/view/terrain/drape/mesh.d.ts +50 -0
  571. package/dist/view/terrain/drape/mesh.js +86 -0
  572. package/dist/view/terrain/drape/pass.d.ts +122 -0
  573. package/dist/view/terrain/drape/pass.js +379 -0
  574. package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
  575. package/dist/view/terrain/drape/quad-glyphs.js +117 -0
  576. package/dist/view/terrain/drape/quad.d.ts +249 -0
  577. package/dist/view/terrain/drape/quad.js +835 -0
  578. package/dist/view/terrain/drape/renderer.d.ts +184 -0
  579. package/dist/view/terrain/drape/renderer.js +706 -0
  580. package/dist/view/terrain/drape/shared.d.ts +80 -0
  581. package/dist/view/terrain/drape/shared.js +173 -0
  582. package/dist/view/terrain/drape/stitch.d.ts +155 -0
  583. package/dist/view/terrain/drape/stitch.js +228 -0
  584. package/dist/view/terrain/ground.d.ts +72 -0
  585. package/dist/view/terrain/ground.js +151 -0
  586. package/dist/view/terrain/metrics.d.ts +180 -0
  587. package/dist/view/terrain/metrics.js +231 -0
  588. package/dist/view/terrain/occlusion.d.ts +11 -0
  589. package/dist/view/terrain/occlusion.js +129 -0
  590. package/dist/view/terrain/polygon.d.ts +86 -0
  591. package/dist/view/terrain/polygon.js +301 -0
  592. package/dist/view/terrain/shade.d.ts +48 -0
  593. package/dist/view/terrain/shade.js +45 -0
  594. package/dist/view/terrain/state.d.ts +99 -0
  595. package/dist/view/terrain/state.js +186 -0
  596. package/dist/view/terrain/tessellation.d.ts +265 -0
  597. package/dist/view/terrain/tessellation.js +924 -0
  598. package/dist/view/terrain/tiling.d.ts +56 -0
  599. package/dist/view/terrain/tiling.js +155 -0
  600. package/dist/view/terrain/upstream-terrain.d.ts +82 -0
  601. package/dist/view/terrain/upstream-terrain.js +116 -0
  602. package/dist/view/ui/auxiliary-handles.d.ts +151 -0
  603. package/dist/view/ui/auxiliary-handles.js +22 -0
  604. package/dist/view/ui/bounds.d.ts +53 -0
  605. package/dist/view/ui/bounds.js +149 -0
  606. package/dist/view/ui/box-selection.d.ts +1 -0
  607. package/dist/view/ui/box-selection.js +83 -0
  608. package/dist/view/ui/handle-test.d.ts +1 -0
  609. package/dist/view/ui/handle-test.js +437 -0
  610. package/dist/view/ui/handle-thinning.d.ts +122 -0
  611. package/dist/view/ui/handle-thinning.js +430 -0
  612. package/dist/view/ui/handles.d.ts +25 -0
  613. package/dist/view/ui/handles.js +673 -0
  614. package/dist/view/ui/helper.d.ts +19 -0
  615. package/dist/view/ui/helper.js +76 -0
  616. package/dist/view/ui/index.d.ts +15 -0
  617. package/dist/view/ui/index.js +15 -0
  618. package/dist/view/ui/selection-scope.d.ts +25 -0
  619. package/dist/view/ui/selection-scope.js +34 -0
  620. package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
  621. package/dist/view/ui/selection-ui/bounding-box.js +240 -0
  622. package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
  623. package/dist/view/ui/selection-ui/extension-registry.js +78 -0
  624. package/dist/view/ui/selection-ui/index.d.ts +12 -0
  625. package/dist/view/ui/selection-ui/index.js +12 -0
  626. package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
  627. package/dist/view/ui/selection-ui/renderer.js +227 -0
  628. package/dist/view/ui/selection-ui/types.d.ts +55 -0
  629. package/dist/view/ui/selection-ui/types.js +3 -0
  630. package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
  631. package/dist/view/ui/selection-ui-drawer.js +329 -0
  632. package/dist/view/ui/tentative.d.ts +1 -0
  633. package/dist/view/ui/tentative.js +320 -0
  634. package/dist/view/viewport.d.ts +119 -0
  635. package/dist/view/viewport.js +254 -0
  636. package/package.json +113 -0
@@ -0,0 +1,898 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { generateCirclePolygon } from '../shared/math/index.js';
4
+ import { getCircleRadius, getCreatedZoom } from '../shared/utils/property.js';
5
+ import { toLineBatchItem, toPointInstanceData } from '../view/renderers/batch-manager.js';
6
+ import { NEUTRAL_DRAW_FACTORS } from '../view/renderers/draw-factors.js';
7
+ import { PACKED_POINT_STYLE_STRIDE, toInstancedPointShape, } from '../view/renderers/point/point-instance.js';
8
+ /**
9
+ * Base zoom of the line width (for the features without createdZoom)
10
+ *
11
+ * @internal
12
+ *
13
+ * Baking in the zoom at build time would change the line width when the zoom changes. Fixing
14
+ * createdZoom at 0 and passing 0 to u_zoom at draw time makes `2^(zoom - createdZoom) = 1`, that
15
+ * is, the line width on screen stays constant. This looks the same as immediate mode (which puts
16
+ * the current zoom into createdZoom every frame).
17
+ */
18
+ export const FIXED_WIDTH_ZOOM = 0;
19
+ /**
20
+ * Points packed into growing typed arrays (one shape)
21
+ *
22
+ * @internal
23
+ */
24
+ export class PackedPointsBuilder {
25
+ constructor() {
26
+ Object.defineProperty(this, "size", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: 0
31
+ });
32
+ Object.defineProperty(this, "lngLat", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: new Float64Array(128)
37
+ });
38
+ Object.defineProperty(this, "style", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: new Float64Array(64 * PACKED_POINT_STYLE_STRIDE)
43
+ });
44
+ }
45
+ /** The number of points pushed */
46
+ get count() {
47
+ return this.size;
48
+ }
49
+ /** Pushes a point with its packed style (`toPackedPointStyle`) */
50
+ push(lng, lat, style) {
51
+ const i = this.size;
52
+ if ((i + 1) * 2 > this.lngLat.length) {
53
+ this.lngLat = grow(this.lngLat, (i + 1) * 2);
54
+ this.style = grow(this.style, (i + 1) * PACKED_POINT_STYLE_STRIDE);
55
+ }
56
+ this.lngLat[i * 2] = lng;
57
+ this.lngLat[i * 2 + 1] = lat;
58
+ this.style.set(style, i * PACKED_POINT_STYLE_STRIDE);
59
+ this.size = i + 1;
60
+ }
61
+ /** The points pushed so far */
62
+ view() {
63
+ return { count: this.size, lngLat: this.lngLat, style: this.style };
64
+ }
65
+ }
66
+ /**
67
+ * Lines packed into growing typed arrays; the coordinates stay in the buffer they come from
68
+ *
69
+ * While every line comes from one buffer, the lines are read from it without a copy. When a line
70
+ * comes from another buffer (a table whose rows are read from geometry columns of several types),
71
+ * the coordinates of the lines pushed so far and of every later line are copied into a buffer of
72
+ * the builder, in the same order, so the lines read the same values.
73
+ *
74
+ * @internal
75
+ */
76
+ export class PackedLinesBuilder {
77
+ constructor() {
78
+ Object.defineProperty(this, "size", {
79
+ enumerable: true,
80
+ configurable: true,
81
+ writable: true,
82
+ value: 0
83
+ });
84
+ Object.defineProperty(this, "start", {
85
+ enumerable: true,
86
+ configurable: true,
87
+ writable: true,
88
+ value: new Int32Array(64)
89
+ });
90
+ Object.defineProperty(this, "end", {
91
+ enumerable: true,
92
+ configurable: true,
93
+ writable: true,
94
+ value: new Int32Array(64)
95
+ });
96
+ Object.defineProperty(this, "strokeWidth", {
97
+ enumerable: true,
98
+ configurable: true,
99
+ writable: true,
100
+ value: new Float64Array(64)
101
+ });
102
+ Object.defineProperty(this, "createdZoom", {
103
+ enumerable: true,
104
+ configurable: true,
105
+ writable: true,
106
+ value: new Float64Array(64)
107
+ });
108
+ Object.defineProperty(this, "color", {
109
+ enumerable: true,
110
+ configurable: true,
111
+ writable: true,
112
+ value: new Float64Array(256)
113
+ });
114
+ /** The buffer the lines are read from (null before the first line) */
115
+ Object.defineProperty(this, "coords", {
116
+ enumerable: true,
117
+ configurable: true,
118
+ writable: true,
119
+ value: null
120
+ });
121
+ /** The number of values per coordinate in `coords` */
122
+ Object.defineProperty(this, "stride", {
123
+ enumerable: true,
124
+ configurable: true,
125
+ writable: true,
126
+ value: 2
127
+ });
128
+ /** The coordinates written into the buffer of the builder (-1 while it reads the caller's) */
129
+ Object.defineProperty(this, "copied", {
130
+ enumerable: true,
131
+ configurable: true,
132
+ writable: true,
133
+ value: -1
134
+ });
135
+ }
136
+ /** The number of lines pushed */
137
+ get count() {
138
+ return this.size;
139
+ }
140
+ /**
141
+ * Pushes a line: the coordinates `[start, end)` of a buffer
142
+ *
143
+ * @param coords The buffer of the coordinates (interleaved)
144
+ * @param stride The number of values per coordinate in `coords` (2 or 3)
145
+ * @param strokeWidth The width in CSS px with the sign convention of `LineBatchItemBase`
146
+ * @param color The instance color (`toLineInstanceColor`)
147
+ */
148
+ push(coords, stride, start, end, strokeWidth, createdZoom, color) {
149
+ if (this.coords === null) {
150
+ this.coords = coords;
151
+ this.stride = stride;
152
+ }
153
+ else if (this.copied >= 0 || coords !== this.coords || stride !== this.stride) {
154
+ if (this.copied < 0)
155
+ this.copyPushed();
156
+ const at = this.append(coords, stride, start, end);
157
+ end = at + (end - start);
158
+ start = at;
159
+ }
160
+ const i = this.size;
161
+ if (i + 1 > this.start.length) {
162
+ this.start = grow(this.start, i + 1);
163
+ this.end = grow(this.end, i + 1);
164
+ this.strokeWidth = grow(this.strokeWidth, i + 1);
165
+ this.createdZoom = grow(this.createdZoom, i + 1);
166
+ this.color = grow(this.color, (i + 1) * 4);
167
+ }
168
+ this.start[i] = start;
169
+ this.end[i] = end;
170
+ this.strokeWidth[i] = strokeWidth;
171
+ this.createdZoom[i] = createdZoom;
172
+ this.color[i * 4] = color[0];
173
+ this.color[i * 4 + 1] = color[1];
174
+ this.color[i * 4 + 2] = color[2];
175
+ this.color[i * 4 + 3] = color[3];
176
+ this.size = i + 1;
177
+ }
178
+ /** The lines pushed so far */
179
+ view() {
180
+ return {
181
+ count: this.size,
182
+ coords: this.coords ?? new Float64Array(0),
183
+ stride: this.stride,
184
+ start: this.start,
185
+ end: this.end,
186
+ strokeWidth: this.strokeWidth,
187
+ createdZoom: this.createdZoom,
188
+ color: this.color,
189
+ };
190
+ }
191
+ /** Moves the coordinates of the lines pushed so far into a buffer of the builder */
192
+ copyPushed() {
193
+ const from = this.coords;
194
+ const stride = this.stride;
195
+ let total = 0;
196
+ for (let i = 0; i < this.size; i++)
197
+ total += this.end[i] - this.start[i];
198
+ this.coords = new Float64Array(Math.max(256, total * 4));
199
+ this.stride = 2;
200
+ this.copied = 0;
201
+ for (let i = 0; i < this.size; i++) {
202
+ const at = this.append(from, stride, this.start[i], this.end[i]);
203
+ this.end[i] = at + (this.end[i] - this.start[i]);
204
+ this.start[i] = at;
205
+ }
206
+ }
207
+ /**
208
+ * Appends the coordinates `[start, end)` of a buffer to the buffer of the builder
209
+ *
210
+ * @returns Where they start in the buffer of the builder
211
+ */
212
+ append(from, stride, start, end) {
213
+ const at = this.copied;
214
+ const next = at + (end - start);
215
+ let coords = this.coords;
216
+ if (next * 2 > coords.length) {
217
+ coords = grow(coords, next * 2);
218
+ this.coords = coords;
219
+ }
220
+ for (let v = start; v < end; v++) {
221
+ const to = (at + v - start) * 2;
222
+ coords[to] = from[v * stride];
223
+ coords[to + 1] = from[v * stride + 1];
224
+ }
225
+ this.copied = next;
226
+ return at;
227
+ }
228
+ }
229
+ /** A typed array of the same kind holding at least `length` elements (the contents kept) */
230
+ function grow(array, length) {
231
+ let size = array.length * 2;
232
+ while (size < length)
233
+ size *= 2;
234
+ const next = new array.constructor(size);
235
+ next.set(array);
236
+ return next;
237
+ }
238
+ /**
239
+ * Creates empty intermediate data
240
+ *
241
+ * @internal
242
+ */
243
+ export function createChunkDraft() {
244
+ return {
245
+ fixedPolygons: [],
246
+ scaledPolygons: [],
247
+ fixedLines: [],
248
+ scaledLines: [],
249
+ packedFixedLines: null,
250
+ packedScaledLines: null,
251
+ points: new Map(),
252
+ packedPoints: new Map(),
253
+ fallback: [],
254
+ pointFallback: [],
255
+ };
256
+ }
257
+ /**
258
+ * The number of rows collected between two looks at the clock
259
+ *
260
+ * @internal
261
+ */
262
+ export const COLLECT_SLICE_ROWS = 512;
263
+ /**
264
+ * The collector of features (the features with the style rules applied, in draw order)
265
+ *
266
+ * @param count The number of rows
267
+ * @param featureOf The feature of a row with the rule colors applied, or null when it is not
268
+ * drawn (thinned away). It is called as the dataset advances, so the preparation of the
269
+ * features is sliced by the budget of the frame as well
270
+ *
271
+ * @internal
272
+ */
273
+ export function collectFeatures(count, featureOf, options = {}) {
274
+ let next = 0;
275
+ return {
276
+ collect(draft, styles, deadline, now) {
277
+ while (next < count) {
278
+ const end = Math.min(count, next + COLLECT_SLICE_ROWS);
279
+ for (; next < end; next++) {
280
+ const feature = featureOf(next);
281
+ if (!feature?.visible)
282
+ continue;
283
+ if (options.pointsOnly && feature.type !== 'Point' && feature.type !== 'MultiPoint') {
284
+ continue;
285
+ }
286
+ collectFeature(feature, draft, styles, options.isExternallyRenderedPoint, options.skipDrapedFills);
287
+ }
288
+ if (now() >= deadline)
289
+ break;
290
+ }
291
+ return next >= count;
292
+ },
293
+ };
294
+ }
295
+ /**
296
+ * The collector of an array of features
297
+ *
298
+ * @internal
299
+ */
300
+ export function collectFeatureArray(features, options = {}) {
301
+ return collectFeatures(features.length, (index) => features[index], options);
302
+ }
303
+ /**
304
+ * Whether the set of retained batches is empty (nothing at all to draw)
305
+ *
306
+ * @internal
307
+ */
308
+ export function isEmptyChunkBatches(batches) {
309
+ return (batches.polygons.length === 0 &&
310
+ batches.lines.length === 0 &&
311
+ batches.points.length === 0 &&
312
+ batches.fallback.length === 0 &&
313
+ batches.pointFallback.length === 0);
314
+ }
315
+ /**
316
+ * Builds the retained batches of a chunk
317
+ *
318
+ * @param features The features with the colors of the style rules applied (in draw order)
319
+ * @param renderers The full set of renderers of retained mode
320
+ * @param origin The origin of the relative coordinates (the representative point of the chunk)
321
+ * @param triangulator The entry point of the triangulation of huge polygons (synchronous when
322
+ * omitted)
323
+ * @param isExternallyRenderedPoint Predicate that returns whether a point is drawn by an external
324
+ * renderer (every point is pushed when omitted). A point for which it is true goes neither onto
325
+ * a batch nor into fallback
326
+ * @param skipDrapedFills Do not push the solid polygons and lines (a frame where the analytic
327
+ * drape draws them as ground pixels)
328
+ * @returns The batches that were built. When the GPU resources could not be created (the shaders
329
+ * are not initialized) null is returned and the caller rebuilds them on the next frame
330
+ *
331
+ * @internal
332
+ */
333
+ export function buildChunkBatches(features, renderers, origin, triangulator, isExternallyRenderedPoint, skipDrapedFills = false) {
334
+ const draft = createChunkDraft();
335
+ collectFeatureArray(features, { isExternallyRenderedPoint, skipDrapedFills }).collect(draft, renderers.styles, Number.POSITIVE_INFINITY, () => 0);
336
+ const batches = {
337
+ polygons: [],
338
+ lines: [],
339
+ points: [],
340
+ fallback: draft.fallback,
341
+ pointFallback: draft.pointFallback,
342
+ };
343
+ // Polygons (drawn in the order fixed width → createdZoom)
344
+ //
345
+ // With a polygon waiting for triangulation, the result can be "not a single triangle to fill".
346
+ // That is different from the shaders not being initialized (which needs a rebuild), so it is
347
+ // not treated as a failure (rebuilding every frame would repeat the flattening of a huge
348
+ // polygon forever).
349
+ if (draft.fixedPolygons.length > 0) {
350
+ const batch = renderers.polygon.buildRetained(draft.fixedPolygons, {
351
+ origin,
352
+ widthZoom: FIXED_WIDTH_ZOOM,
353
+ triangulator,
354
+ });
355
+ if (!batch && !triangulator?.hasDeferred())
356
+ return null;
357
+ if (batch)
358
+ batches.polygons.push(batch);
359
+ }
360
+ if (draft.scaledPolygons.length > 0) {
361
+ const batch = renderers.polygon.buildRetained(draft.scaledPolygons, { origin, triangulator });
362
+ if (!batch && !triangulator?.hasDeferred())
363
+ return null;
364
+ if (batch)
365
+ batches.polygons.push(batch);
366
+ }
367
+ // Lines (solid only; dashes are sent to immediate mode) and points (per shape)
368
+ for (const task of lineAndPointTasks(draft, renderers, origin, batches)) {
369
+ if (!task())
370
+ return null;
371
+ }
372
+ return batches;
373
+ }
374
+ /**
375
+ * The tasks that build the lines (fixed width, then createdZoom) and the points (per shape) of
376
+ * the intermediate data, in draw order. A task returns false when the build failed
377
+ */
378
+ function lineAndPointTasks(draft, renderers, origin, batches) {
379
+ const tasks = [];
380
+ const solid = { lineStyle: 'solid' };
381
+ const lineGroups = [
382
+ [draft.fixedLines, draft.packedFixedLines, { origin, widthZoom: FIXED_WIDTH_ZOOM }],
383
+ [draft.scaledLines, draft.packedScaledLines, { origin }],
384
+ ];
385
+ for (const [items, packed, options] of lineGroups) {
386
+ if (items.length > 0) {
387
+ tasks.push(() => {
388
+ const batch = renderers.line.buildRetainedBatch(items, solid, options);
389
+ if (!batch)
390
+ return false;
391
+ batches.lines.push(batch);
392
+ return true;
393
+ });
394
+ }
395
+ if (packed && packed.count > 0) {
396
+ tasks.push(() => {
397
+ const lines = packed.view();
398
+ const batch = renderers.line.buildRetainedPackedBatch
399
+ ? renderers.line.buildRetainedPackedBatch(lines, solid, options)
400
+ : renderers.line.buildRetainedBatch(unpackLines(lines), solid, options);
401
+ if (!batch)
402
+ return false;
403
+ batches.lines.push(batch);
404
+ return true;
405
+ });
406
+ }
407
+ }
408
+ for (const [shape, points] of draft.points) {
409
+ if (points.length === 0)
410
+ continue;
411
+ tasks.push(() => {
412
+ const batch = renderers.point.buildRetained(points, shape, { origin });
413
+ if (!batch)
414
+ return false;
415
+ batches.points.push(batch);
416
+ return true;
417
+ });
418
+ }
419
+ for (const [shape, builder] of draft.packedPoints) {
420
+ if (builder.count === 0)
421
+ continue;
422
+ tasks.push(() => {
423
+ const batch = buildPackedPoints(renderers, builder.view(), shape, origin);
424
+ if (!batch)
425
+ return false;
426
+ batches.points.push(batch);
427
+ return true;
428
+ });
429
+ }
430
+ return tasks;
431
+ }
432
+ /** Builds packed points (as objects when the renderer has no packed builder) */
433
+ function buildPackedPoints(renderers, points, shape, origin) {
434
+ return renderers.point.buildRetainedPacked
435
+ ? renderers.point.buildRetainedPacked(points, shape, { origin })
436
+ : renderers.point.buildRetained(unpackPoints(points), shape, { origin });
437
+ }
438
+ /**
439
+ * The packed points as objects (the same values)
440
+ *
441
+ * @internal
442
+ */
443
+ export function unpackPoints(points) {
444
+ const out = new Array(points.count);
445
+ const { lngLat, style } = points;
446
+ for (let i = 0; i < points.count; i++) {
447
+ const s = i * PACKED_POINT_STYLE_STRIDE;
448
+ out[i] = {
449
+ coord: [lngLat[i * 2], lngLat[i * 2 + 1]],
450
+ fillColor: [style[s], style[s + 1], style[s + 2], style[s + 3]],
451
+ strokeColor: [style[s + 4], style[s + 5], style[s + 6], style[s + 7]],
452
+ fillSize: style[s + 8],
453
+ strokeWidth: style[s + 9],
454
+ };
455
+ }
456
+ return out;
457
+ }
458
+ /**
459
+ * The packed lines as objects: the coordinates copied into arrays, the instance color with an
460
+ * opacity of 1 (the same instance color)
461
+ *
462
+ * @internal
463
+ */
464
+ export function unpackLines(lines) {
465
+ const out = new Array(lines.count);
466
+ const { coords, stride } = lines;
467
+ for (let i = 0; i < lines.count; i++) {
468
+ const positions = [];
469
+ for (let v = lines.start[i]; v < lines.end[i]; v++) {
470
+ positions.push([coords[v * stride], coords[v * stride + 1]]);
471
+ }
472
+ out[i] = {
473
+ coords: positions,
474
+ featureId: '',
475
+ closed: false,
476
+ strokeWidth: lines.strokeWidth[i],
477
+ createdZoom: lines.createdZoom[i],
478
+ color: [
479
+ lines.color[i * 4],
480
+ lines.color[i * 4 + 1],
481
+ lines.color[i * 4 + 2],
482
+ lines.color[i * 4 + 3],
483
+ ],
484
+ opacity: 1,
485
+ };
486
+ }
487
+ return out;
488
+ }
489
+ /**
490
+ * Target number of vertices of the polygons built in one slice
491
+ *
492
+ * With terrain, building a polygon includes the work of "cutting the surface along the grid of
493
+ * the real mesh of the tiles" and takes a few microseconds per original vertex. Building a single
494
+ * large surface that covers the view takes hundreds of milliseconds and stalls the frame (430 ms
495
+ * measured). Polygons are therefore bundled by vertex count and built one bundle at a time.
496
+ *
497
+ * A bundle becomes one retained batch, so making it too small increases the draw calls. 2,000 was
498
+ * taken from "5 to 10 ms per bundle, a few bundles per chunk".
499
+ */
500
+ const BUILD_SLICE_VERTICES = 2000;
501
+ /**
502
+ * Cuts the polygons into several bundles by vertex count
503
+ *
504
+ * The order within a bundle and between bundles is unchanged, so the draw order (z-order) does
505
+ * not change.
506
+ */
507
+ function sliceByVertices(polygons) {
508
+ if (polygons.length === 0)
509
+ return [];
510
+ const slices = [];
511
+ let current = [];
512
+ let vertices = 0;
513
+ for (const polygon of polygons) {
514
+ let count = 0;
515
+ for (const ring of polygon.coordinates)
516
+ count += ring.length;
517
+ // A surface that exceeds the budget on its own cannot be split any further, so it becomes a
518
+ // bundle of its own
519
+ if (current.length > 0 && vertices + count > BUILD_SLICE_VERTICES) {
520
+ slices.push(current);
521
+ current = [];
522
+ vertices = 0;
523
+ }
524
+ current.push(polygon);
525
+ vertices += count;
526
+ }
527
+ if (current.length > 0)
528
+ slices.push(current);
529
+ return slices;
530
+ }
531
+ /**
532
+ * Starts the job that builds the retained batches of a chunk in slices
533
+ *
534
+ * Nothing is done at the start. The first steps walk the rows (`collector`), then the GPU
535
+ * resources are built bundle by bundle; both are advanced by the budget of the frame, so neither
536
+ * the resolution of the styles nor the packing of a large chunk lands on one frame.
537
+ *
538
+ * @param collector Walks the rows of the chunk into the intermediate data
539
+ * @param renderers The full set of renderers of retained mode
540
+ * @param origin The origin of the relative coordinates (the representative point of the chunk)
541
+ * @param triangulator The entry point of the triangulation of huge polygons (synchronous when
542
+ * omitted)
543
+ *
544
+ * @internal
545
+ */
546
+ export function createChunkBuildJob(collector, renderers, origin, triangulator) {
547
+ const draft = createChunkDraft();
548
+ const batches = {
549
+ polygons: [],
550
+ lines: [],
551
+ points: [],
552
+ fallback: draft.fallback,
553
+ pointFallback: draft.pointFallback,
554
+ };
555
+ let collected = false;
556
+ /** The list of jobs advanced one at a time (planned once the rows are collected) */
557
+ let tasks = null;
558
+ let next = 0;
559
+ let failed = false;
560
+ return {
561
+ step(deadline, now) {
562
+ if (failed)
563
+ return true;
564
+ // The dataset is sliced by the deadline (at least one slice per call)
565
+ if (!collected) {
566
+ collected = collector.collect(draft, renderers.styles, deadline, now);
567
+ if (!collected)
568
+ return false;
569
+ }
570
+ tasks ?? (tasks = buildTasks(draft, renderers, origin, triangulator, batches));
571
+ while (next < tasks.length) {
572
+ if (!tasks[next]()) {
573
+ failed = true;
574
+ return true;
575
+ }
576
+ next++;
577
+ // Once the budget is exhausted, on to the next frame (at least one step has been taken)
578
+ if (now() >= deadline)
579
+ break;
580
+ }
581
+ return next >= tasks.length;
582
+ },
583
+ take() {
584
+ if (failed || !tasks || next < tasks.length)
585
+ return null;
586
+ return batches;
587
+ },
588
+ dispose(rendererSet) {
589
+ disposeChunkBatches(batches, rendererSet);
590
+ },
591
+ };
592
+ }
593
+ /**
594
+ * The tasks that build the retained batches from the collected intermediate data (polygons in
595
+ * bundles by vertex count, then lines, then points)
596
+ */
597
+ function buildTasks(draft, renderers, origin, triangulator, batches) {
598
+ const tasks = [];
599
+ // Polygons (drawn in the order fixed width → createdZoom). One batch per bundle
600
+ for (const slice of sliceByVertices(draft.fixedPolygons)) {
601
+ tasks.push(() => {
602
+ const batch = renderers.polygon.buildRetained(slice, {
603
+ origin,
604
+ widthZoom: FIXED_WIDTH_ZOOM,
605
+ triangulator,
606
+ });
607
+ // With a polygon waiting for triangulation, the result can be "not a single triangle to
608
+ // fill". That is different from the shaders not being initialized (which needs a rebuild),
609
+ // so it is not treated as a failure
610
+ if (!batch)
611
+ return triangulator?.hasDeferred() === true;
612
+ batches.polygons.push(batch);
613
+ return true;
614
+ });
615
+ }
616
+ for (const slice of sliceByVertices(draft.scaledPolygons)) {
617
+ tasks.push(() => {
618
+ const batch = renderers.polygon.buildRetained(slice, { origin, triangulator });
619
+ if (!batch)
620
+ return triangulator?.hasDeferred() === true;
621
+ batches.polygons.push(batch);
622
+ return true;
623
+ });
624
+ }
625
+ // Lines (solid only; dashes are sent to immediate mode) and points (per shape)
626
+ tasks.push(...lineAndPointTasks(draft, renderers, origin, batches));
627
+ return tasks;
628
+ }
629
+ /**
630
+ * Rebuilds only the point part of a chunk: its point batches and its points drawn in immediate
631
+ * mode (`pointFallback`)
632
+ *
633
+ * The polygons, the lines and `fallback` are not touched at all. Two things change the points
634
+ * alone: the anchor elevations baked into the point instances when DEM tiles arrive, and the
635
+ * rows the collision thinning draws (it only ever removes points). Rebuilding the polygons for
636
+ * them would re-triangulate every polygon through earcut, so the point part is rebuilt on its
637
+ * own; its cost is a walk over the rows of the chunk plus the packing of the points it draws.
638
+ *
639
+ * @param collector A collector of the points of the chunk (`pointsOnly`). The dataset uses
640
+ * the same code as the build, so the appearance at build time and at re-bake time cannot
641
+ * disagree
642
+ * @returns true when they could be rebuilt. When the retained-mode renderers do not have their
643
+ * shaders yet (the build failed) false is returned and the old point part is left as it is
644
+ */
645
+ export function rebuildChunkPoints(batches, collector, renderers, origin) {
646
+ const draft = createChunkDraft();
647
+ collector.collect(draft, renderers.styles, Number.POSITIVE_INFINITY, () => 0);
648
+ const newBatches = [];
649
+ const built = (batch) => {
650
+ // It could not be built, for example because the shaders are not initialized. The new batches
651
+ // built so far are referenced by nobody, so they are discarded and a failure is returned with
652
+ // the old batches left in place
653
+ if (!batch) {
654
+ for (const done of newBatches)
655
+ renderers.point.disposeRetained(done);
656
+ return false;
657
+ }
658
+ newBatches.push(batch);
659
+ return true;
660
+ };
661
+ for (const [shape, points] of draft.points) {
662
+ if (points.length === 0)
663
+ continue;
664
+ if (!built(renderers.point.buildRetained(points, shape, { origin })))
665
+ return false;
666
+ }
667
+ for (const [shape, builder] of draft.packedPoints) {
668
+ if (builder.count === 0)
669
+ continue;
670
+ if (!built(buildPackedPoints(renderers, builder.view(), shape, origin)))
671
+ return false;
672
+ }
673
+ for (const old of batches.points) {
674
+ renderers.point.disposeRetained(old);
675
+ }
676
+ batches.points = newBatches;
677
+ batches.pointFallback = draft.pointFallback;
678
+ return true;
679
+ }
680
+ /**
681
+ * Draws the retained batches of a chunk (it does not build them)
682
+ *
683
+ * @param factors The factors at draw time (when omitted, a scale of 1 and an opacity of 1, as
684
+ * before). The same factors apply to the fixed and the scaled batches alike, and to points,
685
+ * lines and polygons alike (so that no path a data surface takes is missed)
686
+ *
687
+ * @internal
688
+ */
689
+ export function drawChunkBatches(batches, renderers, zoom, projectionData, factors = NEUTRAL_DRAW_FACTORS) {
690
+ const viewport = renderers.viewport();
691
+ for (const batch of batches.polygons) {
692
+ renderers.polygon.drawRetained(batch, zoom, projectionData, viewport, factors);
693
+ }
694
+ for (const batch of batches.lines) {
695
+ renderers.line.drawRetainedBatch(batch, zoom, projectionData, factors);
696
+ }
697
+ for (const batch of batches.points) {
698
+ renderers.point.drawRetained(batch, zoom, projectionData, factors);
699
+ }
700
+ }
701
+ /**
702
+ * Disposes the retained batches of a chunk
703
+ *
704
+ * @internal
705
+ */
706
+ export function disposeChunkBatches(batches, renderers) {
707
+ for (const batch of batches.polygons) {
708
+ renderers.polygon.disposeRetained(batch);
709
+ }
710
+ for (const batch of batches.lines) {
711
+ renderers.line.disposeRetainedBatch(batch);
712
+ }
713
+ for (const batch of batches.points) {
714
+ renderers.point.disposeRetained(batch);
715
+ }
716
+ batches.polygons.length = 0;
717
+ batches.lines.length = 0;
718
+ batches.points.length = 0;
719
+ }
720
+ // === Internals of the building ===
721
+ /**
722
+ * Whether it is a type that the analytic drape draws as ground pixels
723
+ *
724
+ * It is paired with the dataset in `view/terrain/drape/pass.ts`. Changing only one of them
725
+ * would draw a surface twice or draw neither of them.
726
+ *
727
+ * @internal
728
+ */
729
+ export function isDrapedGeometry(feature) {
730
+ return (feature.type === 'Polygon' ||
731
+ feature.type === 'MultiPolygon' ||
732
+ feature.type === 'LineString' ||
733
+ feature.type === 'MultiLineString');
734
+ }
735
+ /**
736
+ * Pushes a feature into the intermediate data
737
+ *
738
+ * @internal
739
+ */
740
+ export function collectFeature(feature, draft, styles, isExternallyRenderedPoint, skipDrapedFills = false) {
741
+ const skipSolid = skipDrapedFills && isDrapedGeometry(feature);
742
+ switch (feature.type) {
743
+ case 'Point':
744
+ collectPoint(feature, feature.coordinates, draft, styles, isExternallyRenderedPoint);
745
+ return;
746
+ case 'MultiPoint':
747
+ // Whether the predicate applies to Point alone is up to the predicate itself (the test is
748
+ // in one place)
749
+ for (const coord of feature.coordinates) {
750
+ collectPoint(feature, coord, draft, styles, isExternallyRenderedPoint);
751
+ }
752
+ return;
753
+ case 'LineString':
754
+ case 'Freehand':
755
+ collectLine(feature, feature.coordinates, draft, styles, skipSolid);
756
+ return;
757
+ case 'MultiLineString':
758
+ for (const coords of feature.coordinates) {
759
+ collectLine(feature, coords, draft, styles, skipSolid);
760
+ }
761
+ return;
762
+ case 'Polygon':
763
+ collectPolygon(feature, feature.coordinates, draft, styles, 0, skipSolid);
764
+ return;
765
+ case 'MultiPolygon': {
766
+ const parts = feature.coordinates;
767
+ for (let i = 0; i < parts.length; i++) {
768
+ collectPolygon(feature, parts[i], draft, styles, i, skipSolid);
769
+ }
770
+ return;
771
+ }
772
+ case 'Circle': {
773
+ const radiusMeters = getCircleRadius(feature);
774
+ if (!radiusMeters || radiusMeters <= 0)
775
+ return;
776
+ const center = feature.coordinates;
777
+ collectPolygon(feature, [generateCirclePolygon(center, radiusMeters)], draft, styles);
778
+ return;
779
+ }
780
+ default:
781
+ // A kind that retained mode does not handle, such as Image, is sent to immediate mode
782
+ pushFallback(draft, feature);
783
+ }
784
+ }
785
+ /**
786
+ * Pushes a feature that is sent to immediate mode (a point goes to the point part,
787
+ * `pointFallback`; anything else to `fallback`)
788
+ *
789
+ * A Multi geometry is decided per part, so the same feature can come around several times in a
790
+ * row. The immediate-mode path draws every part of a feature at once, so it is not pushed twice.
791
+ *
792
+ * @internal
793
+ */
794
+ export function pushFallback(draft, feature) {
795
+ const list = feature.type === 'Point' || feature.type === 'MultiPoint'
796
+ ? draft.pointFallback
797
+ : draft.fallback;
798
+ if (list[list.length - 1] === feature)
799
+ return;
800
+ list.push(feature);
801
+ }
802
+ /**
803
+ * Pushes a point (a shape without instancing support is sent to immediate mode)
804
+ *
805
+ * A point drawn by an external renderer goes neither onto a batch nor into the immediate-mode
806
+ * list (core draws nothing; drawing it is the job of the external renderer).
807
+ */
808
+ function collectPoint(feature, coord, draft, styles, isExternallyRenderedPoint) {
809
+ if (isExternallyRenderedPoint?.(feature))
810
+ return;
811
+ const style = styles.getPointStyle(feature);
812
+ const shape = toInstancedPointShape(style.shape);
813
+ if (!shape) {
814
+ // The path that goes to immediate mode is not multiplied by the factors of zoomScale
815
+ pushFallback(draft, feature);
816
+ return;
817
+ }
818
+ let points = draft.points.get(shape);
819
+ if (!points) {
820
+ points = [];
821
+ draft.points.set(shape, points);
822
+ }
823
+ points.push(toPointInstanceData(coord, style));
824
+ }
825
+ /**
826
+ * Pushes a line (a dashed line is sent to immediate mode because its CPU-side splitting depends
827
+ * on the zoom)
828
+ */
829
+ function collectLine(feature, coords, draft, styles, skipSolid = false) {
830
+ if (coords.length < 2)
831
+ return;
832
+ const strokeStyle = styles.getLineStringStrokeStyle(feature);
833
+ if (strokeStyle.lineStyle !== 'solid') {
834
+ // The path that goes to immediate mode is not multiplied by the factors of zoomScale
835
+ pushFallback(draft, feature);
836
+ return;
837
+ }
838
+ // A solid line is drawn by the analytic drape as ground pixels (in this frame only)
839
+ if (skipSolid && strokeStyle.opacity > 0 && strokeStyle.width > 0)
840
+ return;
841
+ const createdZoom = getCreatedZoom(feature);
842
+ const target = createdZoom === undefined ? draft.fixedLines : draft.scaledLines;
843
+ const item = toLineBatchItem(coords, feature.id, strokeStyle, createdZoom ?? FIXED_WIDTH_ZOOM);
844
+ // A fixed line width is declared by the negative convention. With widthZoom 0 and createdZoom 0
845
+ // it would look the same through `2^(0 - 0) = 1`, but only a negative value says "a size fixed
846
+ // in screen pixels" and gets the factor of the rendering pixel ratio (renderScale) applied
847
+ // ("the two ratios" in shared/utils/pixel-ratio.ts).
848
+ if (createdZoom === undefined)
849
+ item.strokeWidth = -item.strokeWidth;
850
+ target.push(item);
851
+ }
852
+ /**
853
+ * Pushes a polygon (a dashed outline is sent to immediate mode)
854
+ *
855
+ * A fill-only polygon is also pushed as an SDFPolygon without an outline (immediate mode uses
856
+ * PolygonBatchRenderer, but the appearance of the fill is the same).
857
+ */
858
+ function collectPolygon(feature, rings, draft, styles, partIndex = 0, skipSolid = false) {
859
+ const outerRing = rings[0];
860
+ if (!outerRing || outerRing.length < 3)
861
+ return;
862
+ const { fillColor, strokeStyle } = styles.getPolygonStyles(feature);
863
+ const hasStroke = strokeStyle.opacity > 0 && strokeStyle.width > 0;
864
+ if (hasStroke && strokeStyle.lineStyle !== 'solid') {
865
+ // The path that goes to immediate mode is not multiplied by the factors of zoomScale
866
+ pushFallback(draft, feature);
867
+ return;
868
+ }
869
+ if (!hasStroke && fillColor[3] <= 0)
870
+ return;
871
+ // The solid fill and outline are drawn by the analytic drape as ground pixels (in this frame
872
+ // only)
873
+ if (skipSolid)
874
+ return;
875
+ const createdZoom = getCreatedZoom(feature);
876
+ const target = createdZoom === undefined ? draft.fixedPolygons : draft.scaledPolygons;
877
+ // A fixed line width is declared by the negative convention (the same reason as collectLine).
878
+ const strokeWidth = hasStroke
879
+ ? createdZoom === undefined
880
+ ? -strokeStyle.width
881
+ : strokeStyle.width
882
+ : 0;
883
+ target.push({
884
+ coordinates: rings,
885
+ style: {
886
+ fillColor,
887
+ fillOpacity: 1,
888
+ strokeColor: strokeStyle.color,
889
+ strokeWidth,
890
+ strokeOpacity: hasStroke ? 1 : 0,
891
+ },
892
+ createdZoom: createdZoom ?? FIXED_WIDTH_ZOOM,
893
+ // The build of retained mode does not use the global cache of earcut, so the featureId here
894
+ // is held only for identification
895
+ featureId: feature.id,
896
+ partIndex,
897
+ });
898
+ }