@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,24 @@
1
+ import { type TessellationStep } from '../view/terrain/tessellation.js';
2
+ import { type DisplayChunk } from './chunk.js';
3
+ /**
4
+ * Whether this chunk has to be re-baked
5
+ *
6
+ * The decision is a single fingerprint of the tile composition. The fingerprint contains "the
7
+ * zoom composition of the tiles that cover its patch", "the coarsening factor" and "the relation
8
+ * to the region of the subdivision" (tilingSignature in view/terrain/tiling.ts).
9
+ *
10
+ * Moving the camera changes the zoom of the tiles used in the distance. Since the step is matched
11
+ * to the real mesh of the tiles, a surface already baked is stale once the composition changes.
12
+ * This was the truth behind the observation that the geometry is correct and yet "it is clean
13
+ * only right after a reload, and reaching the same place by panning or zooming shows dotted
14
+ * punch-through and seams on the ridges and the valleys".
15
+ *
16
+ * Conversely, nothing is re-baked while the composition is the same. Re-baking every chunk just
17
+ * because the region shifted or the zoom moved slightly would give a frame of several hundred
18
+ * milliseconds on every pan.
19
+ */
20
+ export declare function needsRetessellation(state: {
21
+ builtGrid: number;
22
+ builtTilingKey: string | null;
23
+ chunk: DisplayChunk;
24
+ }, step: TessellationStep | null): boolean;
@@ -0,0 +1,533 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { resolvePixelRatio } from '../shared/utils/pixel-ratio.js';
4
+ import { getSurfaceTessellationStep } from '../view/globe-subdivision.js';
5
+ import { boundsCenter, rebasedRetainedOrigin } from '../view/shaders/retained-origin.js';
6
+ import { getAnchorElevationGeneration } from '../view/terrain/anchor.js';
7
+ import { isTerrainCameraMoving, reportTerrainCoarsening } from '../view/terrain/state.js';
8
+ import { mercatorX, mercatorY } from '../view/terrain/tessellation.js';
9
+ import { tilingSignature } from '../view/terrain/tiling.js';
10
+ import { boundsIntersect } from './chunk.js';
11
+ import { createChunkBuildJob, disposeChunkBatches, drawChunkBatches, rebuildChunkPoints, } from './retained.js';
12
+ import { sameRowsInMasks } from './thinning.js';
13
+ import { createChunkTriangulator, globalTriangulationScheduler, } from './triangulation.js';
14
+ /**
15
+ * Whether this chunk has to be re-baked
16
+ *
17
+ * The decision is a single fingerprint of the tile composition. The fingerprint contains "the
18
+ * zoom composition of the tiles that cover its patch", "the coarsening factor" and "the relation
19
+ * to the region of the subdivision" (tilingSignature in view/terrain/tiling.ts).
20
+ *
21
+ * Moving the camera changes the zoom of the tiles used in the distance. Since the step is matched
22
+ * to the real mesh of the tiles, a surface already baked is stale once the composition changes.
23
+ * This was the truth behind the observation that the geometry is correct and yet "it is clean
24
+ * only right after a reload, and reaching the same place by panning or zooming shows dotted
25
+ * punch-through and seams on the ridges and the valleys".
26
+ *
27
+ * Conversely, nothing is re-baked while the composition is the same. Re-baking every chunk just
28
+ * because the region shifted or the zoom moved slightly would give a frame of several hundred
29
+ * milliseconds on every pan.
30
+ */
31
+ export function needsRetessellation(state, step) {
32
+ if (!step)
33
+ return false;
34
+ // A shape baked uncut (no terrain, no globe) is re-baked once the terrain is alive or the globe
35
+ // is drawn
36
+ if (state.builtGrid <= 0)
37
+ return true;
38
+ return state.builtTilingKey !== chunkTilingKey(state.chunk, step);
39
+ }
40
+ /**
41
+ * Fingerprint of the tile composition that covers the patch of a chunk
42
+ */
43
+ function chunkTilingKey(chunk, step) {
44
+ const bounds = chunk.bounds;
45
+ return tilingSignature(step.tiling ?? null, step.region ?? null, step.coarsen && step.coarsen > 1 ? step.coarsen : 1, step.grid, mercatorX(bounds.minX),
46
+ // The mercator y decreases as the latitude increases
47
+ mercatorY(bounds.maxY), mercatorX(bounds.maxX), mercatorY(bounds.minY));
48
+ }
49
+ /**
50
+ * Time that may be spent building the retained batches in one frame (milliseconds)
51
+ *
52
+ * The weight of building a chunk changes by orders of magnitude with its contents. With terrain
53
+ * the work of cutting the surfaces along the grid of the terrain mesh is added, and without it
54
+ * there is still earcut and the packing of the arrays. Slicing by the number of features would
55
+ * make it wait for nothing when it is light and blow a frame with a single chunk when it is
56
+ * heavy.
57
+ *
58
+ * It is therefore sliced by "the time spent". What exceeds the budget is deferred to the next
59
+ * frame and the chunks not built yet appear over several frames (looking the same as tiles
60
+ * arriving one after another). A chunk whose step has merely gone stale keeps drawing the
61
+ * retained batch of the previous step until it is re-baked.
62
+ *
63
+ * Building everything without a budget made a single frame reach 3.2 seconds (terrain off) to
64
+ * over 30 seconds (terrain on) on this map (8,172 administrative boundaries, 64 chunks).
65
+ * Exactly one chunk is always built (progress is made even with a budget of 0).
66
+ *
67
+ * A host that draws a frame to read it back turns the time slicing off (`buildBudgetMs` of the
68
+ * host is then infinite): every chunk in view is built in the frame.
69
+ */
70
+ const CHUNK_BUILD_BUDGET_MS = 12;
71
+ /**
72
+ * A monotonic clock (it works even when the test environment has no performance)
73
+ */
74
+ function nowMs() {
75
+ return typeof performance !== 'undefined' ? performance.now() : Date.now();
76
+ }
77
+ /**
78
+ * The retained chunks of one dataset
79
+ *
80
+ * @internal
81
+ */
82
+ export class DisplayChunkSet {
83
+ constructor(host) {
84
+ Object.defineProperty(this, "host", {
85
+ enumerable: true,
86
+ configurable: true,
87
+ writable: true,
88
+ value: host
89
+ });
90
+ /** The chunks (in draw order) */
91
+ Object.defineProperty(this, "chunks", {
92
+ enumerable: true,
93
+ configurable: true,
94
+ writable: true,
95
+ value: []
96
+ });
97
+ /**
98
+ * The full set of renderers used in the most recent draw
99
+ *
100
+ * It is remembered so that the GPU resources can be released on dispose and when the layer is
101
+ * disposed.
102
+ */
103
+ Object.defineProperty(this, "renderers", {
104
+ enumerable: true,
105
+ configurable: true,
106
+ writable: true,
107
+ value: null
108
+ });
109
+ /** The devicePixelRatio the retained batches were built with (null when not built) */
110
+ Object.defineProperty(this, "builtDevicePixelRatio", {
111
+ enumerable: true,
112
+ configurable: true,
113
+ writable: true,
114
+ value: null
115
+ });
116
+ /** The generation of the anchor elevation baked into the retained batches (-1 = not yet) */
117
+ Object.defineProperty(this, "builtAnchorElevationGeneration", {
118
+ enumerable: true,
119
+ configurable: true,
120
+ writable: true,
121
+ value: -1
122
+ });
123
+ /**
124
+ * Generation of the set of features
125
+ *
126
+ * The completion notification of the triangulation arrives seconds or tens of seconds later.
127
+ * If the contents have been replaced by then (if the generation has advanced), nothing is done.
128
+ */
129
+ Object.defineProperty(this, "featuresGeneration", {
130
+ enumerable: true,
131
+ configurable: true,
132
+ writable: true,
133
+ value: 0
134
+ });
135
+ Object.defineProperty(this, "disposed", {
136
+ enumerable: true,
137
+ configurable: true,
138
+ writable: true,
139
+ value: false
140
+ });
141
+ /** Whether the most recent draw left a chunk unbuilt */
142
+ Object.defineProperty(this, "lastPending", {
143
+ enumerable: true,
144
+ configurable: true,
145
+ writable: true,
146
+ value: false
147
+ });
148
+ }
149
+ /** Generation of the set of features (advances on every `replace`) */
150
+ get generation() {
151
+ return this.featuresGeneration;
152
+ }
153
+ /** The renderers used in the most recent draw (null before the first draw or after release) */
154
+ get retainedRenderers() {
155
+ return this.renderers;
156
+ }
157
+ /**
158
+ * Whether the most recent draw left a chunk unbuilt (a later frame builds it)
159
+ *
160
+ * It stays true while the chunks are being built over several frames and turns false at the
161
+ * first frame that leaves nothing unbuilt, so a caller can tell when everything is drawn.
162
+ */
163
+ get hasPendingBuild() {
164
+ return this.lastPending;
165
+ }
166
+ /**
167
+ * Takes new contents split into chunks (the old chunks and their GPU resources are released)
168
+ *
169
+ * @param chunks The spatial chunks of the contents (in draw order)
170
+ */
171
+ replace(chunks) {
172
+ this.disposeChunks();
173
+ this.featuresGeneration++;
174
+ this.lastPending = chunks.length > 0;
175
+ this.chunks = chunks.map((chunk) => ({
176
+ chunk,
177
+ batches: null,
178
+ job: null,
179
+ jobGrid: 0,
180
+ jobTilingKey: null,
181
+ builtGrid: 0,
182
+ builtTilingKey: null,
183
+ builtDraped: false,
184
+ jobDraped: false,
185
+ origin: null,
186
+ jobOrigin: null,
187
+ viewOrigin: null,
188
+ onTriangulated: null,
189
+ pointsMask: null,
190
+ jobMask: null,
191
+ }));
192
+ }
193
+ /**
194
+ * Draws the chunks that intersect the viewport
195
+ *
196
+ * It only draws the retained batches of the chunks that intersect (building them the first time
197
+ * when necessary). The features that cannot be retained are sent to the immediate-mode path per
198
+ * chunk.
199
+ */
200
+ draw(frame) {
201
+ const { target, renderers, terrain, projectionData, zoom, bounds, factors } = frame;
202
+ this.renderers = renderers;
203
+ this.syncDevicePixelRatio();
204
+ this.syncAnchorElevationGeneration(terrain);
205
+ // The building of the retained batches is limited to one chunk in this frame (the build
206
+ // budget of a frame, see the time budget above). While the camera is moving, the old step keeps
207
+ // being drawn and the re-bake is deferred (it would be redone anyway once the movement ends).
208
+ // A limit on the slices is needed only when there is terrain. Without terrain, building is
209
+ // just earcut and the packing of the arrays, and building every visible chunk at once takes a
210
+ // few milliseconds (the behaviour before is kept).
211
+ // The step of the terrain, or on the globe the cell of its fills
212
+ const step = getSurfaceTessellationStep(terrain, 'fill');
213
+ const drapedFills = this.host.drapedFills();
214
+ const drawn = this.host.drawnRows();
215
+ const budget = this.host.buildBudgetMs ?? CHUNK_BUILD_BUDGET_MS;
216
+ const budgetStart = nowMs();
217
+ let builtHere = 0;
218
+ /** Whether more may still be built in this frame (at least one is built) */
219
+ const canBuild = () => builtHere === 0 || nowMs() - budgetStart < budget;
220
+ const settled = !isTerrainCameraMoving(terrain);
221
+ /** Whether anything is left over (the next frame is requested by itself) */
222
+ let pending = false;
223
+ for (const state of this.chunks) {
224
+ if (!boundsIntersect(state.chunk.bounds, bounds))
225
+ continue;
226
+ // Whether a rebuild is needed. If it is, a job is started and advanced by the budget of the
227
+ // frame. The batches of the previous version keep being drawn until the job finishes, so
228
+ // even a large surface covering the view does not stall a frame and the picture being drawn
229
+ // is not missing anything.
230
+ // A chunk whose way of handing over the polygons and lines changed is re-baked as well (the
231
+ // analytic drape being switched on or off)
232
+ // A chunk seen far from its origin at high zoom is built again around the view (the batches
233
+ // it has keep being drawn until then)
234
+ const rebased = state.batches !== null && !state.job
235
+ ? rebasedRetainedOrigin(chunkOrigin(state), state.chunk.bounds, bounds, zoom)
236
+ : null;
237
+ if (rebased)
238
+ state.viewOrigin = rebased;
239
+ const stale = state.batches !== null &&
240
+ (needsRetessellation(state, step) || state.builtDraped !== drapedFills || rebased !== null);
241
+ // Building a new chunk is also deferred until the camera stops (treated the same as a
242
+ // re-bake). Zooming out lets new chunks enter all at once as the view widens (137 of them
243
+ // measured), and a build of 20 to 50 ms per step while moving makes the gesture stutter
244
+ // (measured). Starting to build while moving leaves a blank until it is finished anyway, so
245
+ // building after it stops costs only one beat at the start. The drawing of the existing
246
+ // batches continues below as before (the appearance is unchanged).
247
+ if (!settled && (state.job || !state.batches || stale))
248
+ pending = true;
249
+ if (settled && !state.job && (!state.batches || stale)) {
250
+ const origin = state.viewOrigin ?? boundsCenter(state.chunk.bounds);
251
+ state.jobOrigin = origin;
252
+ // Nothing is walked here: the job walks the rows of the chunk when it is stepped, within
253
+ // the budget of the frame (walking every visible chunk at once would put the resolution
254
+ // of the styles of the whole view on one frame)
255
+ state.job = createChunkBuildJob(this.host.collector(state.chunk.rows, {
256
+ isExternallyRenderedPoint: this.host.externalPointFilter(),
257
+ skipDrapedFills: drapedFills,
258
+ }, drawn), renderers, origin, this.chunkTriangulator(state));
259
+ state.jobMask = drawn;
260
+ state.jobGrid = step?.grid ?? 0;
261
+ state.jobTilingKey = step ? chunkTilingKey(state.chunk, step) : null;
262
+ state.jobDraped = drapedFills;
263
+ }
264
+ // A job in progress is not advanced while the camera is moving either (a single step can
265
+ // blow through the budget, and paying it during a gesture always stutters).
266
+ if (state.job && !settled)
267
+ pending = true;
268
+ if (state.job && settled) {
269
+ if (canBuild()) {
270
+ builtHere++;
271
+ const done = state.job.step(budgetStart + budget, nowMs);
272
+ if (done) {
273
+ const built = state.job.take();
274
+ state.job = null;
275
+ if (built) {
276
+ // The old version is discarded only after the new one is complete (no flicker)
277
+ if (state.batches)
278
+ disposeChunkBatches(state.batches, renderers);
279
+ state.batches = built;
280
+ state.origin = state.jobOrigin;
281
+ state.builtGrid = state.jobGrid;
282
+ state.builtTilingKey = state.jobTilingKey;
283
+ state.builtDraped = state.jobDraped;
284
+ state.pointsMask = state.jobMask;
285
+ }
286
+ // When it could not be built (the shaders are not initialized) it is rebuilt on the
287
+ // next frame
288
+ }
289
+ else {
290
+ pending = true;
291
+ }
292
+ }
293
+ else {
294
+ pending = true;
295
+ }
296
+ }
297
+ // A chunk that has never been built has nothing to draw at this point
298
+ if (!state.batches)
299
+ continue;
300
+ // The points follow the rows drawn now before the chunk is drawn, in every frame, while
301
+ // the camera moves as well: until they do, the points of another zoom band would be drawn
302
+ // at this scale (after a large zoom out, piled up into a solid patch). Only the point part
303
+ // is rebuilt, so the cost is a walk over the rows of the chunk plus the packing of the
304
+ // points it draws, which the thinning bounds by what fits on screen. A chunk whose rows are
305
+ // drawn alike in both masks (no point, or no change of its points) rebuilds nothing
306
+ if (state.pointsMask !== drawn && !this.rebuildPoints(state, renderers, drawn)) {
307
+ pending = true;
308
+ }
309
+ // Report to the depth bias how coarse the shape being drawn is. If the step has got finer
310
+ // than when it was baked, the shape being drawn is coarse by that ratio
311
+ if (step && state.builtGrid > step.grid) {
312
+ reportTerrainCoarsening(terrain, state.builtGrid / step.grid);
313
+ }
314
+ drawChunkBatches(state.batches, renderers, zoom, projectionData, factors);
315
+ // The features that cannot be retained are drawn immediately, right after the retained
316
+ // batches of the chunk, the points last (the immediate-mode path is not multiplied by the
317
+ // factors)
318
+ const { fallback, pointFallback } = state.batches;
319
+ if (fallback.length > 0 || pointFallback.length > 0) {
320
+ target.beginFrame(projectionData, zoom);
321
+ for (const feature of fallback)
322
+ target.processFeature(feature, false);
323
+ for (const feature of pointFallback)
324
+ target.processFeature(feature, false);
325
+ target.endFrame();
326
+ }
327
+ }
328
+ // If any chunk was left unbuilt, one more frame is asked for
329
+ this.lastPending = pending;
330
+ if (pending)
331
+ this.host.requestRepaint();
332
+ }
333
+ /**
334
+ * Discards the retained batches of every chunk (the splitting is kept and they are rebuilt on
335
+ * the next draw)
336
+ *
337
+ * The queue of the triangulation is not touched. Discarding the work in progress on every
338
+ * rebuild would keep the triangulation of a huge polygon from ever finishing.
339
+ */
340
+ invalidateAll() {
341
+ this.host.onInvalidateAll();
342
+ for (const state of this.chunks) {
343
+ this.invalidate(state);
344
+ }
345
+ }
346
+ /**
347
+ * Releases only the GPU resources (the chunks are built again on the next draw)
348
+ *
349
+ * It is called when the rendering layer is disposed.
350
+ */
351
+ releaseRetained() {
352
+ this.invalidateAll();
353
+ this.renderers = null;
354
+ }
355
+ /**
356
+ * Releases everything: the GPU resources, the chunks and the waiting for the triangulation
357
+ *
358
+ * A notification of the triangulation that arrives afterwards does nothing.
359
+ */
360
+ dispose() {
361
+ this.disposed = true;
362
+ this.forgetTriangulation();
363
+ this.disposeChunks();
364
+ this.renderers = null;
365
+ }
366
+ /**
367
+ * Discards the retained batches of a single chunk (they are rebuilt on the next draw)
368
+ */
369
+ invalidate(state) {
370
+ // The build in progress is discarded too. Now that the contents changed, what is half built
371
+ // is stale
372
+ if (state.job) {
373
+ if (this.renderers)
374
+ state.job.dispose(this.renderers);
375
+ state.job = null;
376
+ }
377
+ if (!state.batches)
378
+ return;
379
+ if (this.renderers) {
380
+ disposeChunkBatches(state.batches, this.renderers);
381
+ }
382
+ state.batches = null;
383
+ }
384
+ /**
385
+ * Discards the chunks themselves (the GPU resources are released as well)
386
+ */
387
+ disposeChunks() {
388
+ this.invalidateAll();
389
+ this.chunks = [];
390
+ }
391
+ /**
392
+ * Creates the receiver of the triangulation for a single chunk
393
+ *
394
+ * A polygon whose vertex count exceeds the threshold is not triangulated on the spot but queued
395
+ * into the time-sliced list (the fill of that polygon does not appear yet). Once the
396
+ * triangulation is finished, only the retained batches of this chunk are rebuilt and a repaint
397
+ * is requested.
398
+ */
399
+ chunkTriangulator(state) {
400
+ // The contents may have been replaced by the time the notification arrives. The generation
401
+ // watches for that
402
+ const generation = this.featuresGeneration;
403
+ const onReady = () => {
404
+ if (this.disposed || generation !== this.featuresGeneration)
405
+ return;
406
+ this.invalidate(state);
407
+ this.host.requestRepaint();
408
+ };
409
+ state.onTriangulated = onReady;
410
+ return createChunkTriangulator(onReady, this.scheduler());
411
+ }
412
+ /**
413
+ * Takes the receivers of this chunk set off the queue of the triangulation
414
+ *
415
+ * The scheduler discards a job nobody waits for any more (the triangulation is not kept running
416
+ * for a dataset that has been removed). It is called only on disposal (not on a rebuild).
417
+ */
418
+ forgetTriangulation() {
419
+ const scheduler = this.scheduler();
420
+ for (const state of this.chunks) {
421
+ if (!state.onTriangulated)
422
+ continue;
423
+ scheduler.forget(state.onTriangulated);
424
+ state.onTriangulated = null;
425
+ }
426
+ }
427
+ scheduler() {
428
+ return this.host.triangulationScheduler ?? globalTriangulationScheduler;
429
+ }
430
+ /**
431
+ * Follows the changes of the rendering pixel ratio
432
+ *
433
+ * Line widths and point sizes are converted to physical pixels and baked into the retained
434
+ * batches, so they have to be rebuilt when the display scale or the display itself changes. It
435
+ * is an insurance against a change of the rendering environment rather than of the features or
436
+ * the rules, and it normally never happens. When the ratio is injected it is a fixed value, so
437
+ * it is always "unchanged" and nothing is ever rebuilt.
438
+ */
439
+ syncDevicePixelRatio() {
440
+ const dpr = resolvePixelRatio(this.host.pixelRatio);
441
+ if (this.builtDevicePixelRatio === dpr)
442
+ return;
443
+ if (this.builtDevicePixelRatio !== null) {
444
+ this.invalidateAll();
445
+ }
446
+ this.builtDevicePixelRatio = dpr;
447
+ }
448
+ /**
449
+ * Rebuilds the retained batches of the points as the DEMs arrive
450
+ *
451
+ * A point bakes the elevation of its anchor into the instance (a_instance_elevation_m of
452
+ * point-instance). DEM tiles arrive asynchronously, so at the moment of the first bake most of
453
+ * the points still have an elevation of 0. Without a re-bake, only the points are left behind
454
+ * at sea level and stay buried in the terrain.
455
+ *
456
+ * core advances the generation by one whenever the coverage of the DEM changes
457
+ * (getAnchorElevationGeneration). The retained cache on the store side (syncTerrainGeneration
458
+ * of store-retained) and the retained batches of custom renderers look at the same
459
+ * generation; only the datasets did not.
460
+ *
461
+ * The first time (= nothing has been baked yet) nothing is rebuilt. It is about to be baked, so
462
+ * there is nothing to discard.
463
+ *
464
+ * Polygons and lines do not refer to the terrain elevation at all, so they are not touched when
465
+ * the DEM coverage changes. Discarding the whole retained batches regardless of the type
466
+ * (`invalidateAll`) would, for a dataset with large surfaces, stall the main thread for
467
+ * seconds on every change of the DEM coverage by rebuilding every chunk including earcut. Only
468
+ * the retained batches of the points are rebuilt with `rebuildChunkPoints`.
469
+ */
470
+ syncAnchorElevationGeneration(terrain) {
471
+ const generation = getAnchorElevationGeneration(terrain);
472
+ if (this.builtAnchorElevationGeneration === generation)
473
+ return;
474
+ if (this.builtAnchorElevationGeneration !== -1) {
475
+ this.refreshPointElevations();
476
+ }
477
+ this.builtAnchorElevationGeneration = generation;
478
+ }
479
+ /**
480
+ * Rebuilds only the retained batches of the points with the latest DEM elevations
481
+ *
482
+ * For a chunk whose retained batches have never been built (`state.batches === null`) nothing
483
+ * happens here, because the build of the next draw uses the latest elevations of that moment
484
+ * directly. The rows drawn are those the point part was built with (a change of them is the
485
+ * business of the draw loop).
486
+ */
487
+ refreshPointElevations() {
488
+ const renderers = this.renderers;
489
+ if (!renderers)
490
+ return;
491
+ for (const state of this.chunks) {
492
+ if (!state.batches)
493
+ continue;
494
+ // A chunk without a single baked point has nothing to rewrite when the elevations change.
495
+ // For a dataset of polygons only (administrative boundaries, for example) every chunk
496
+ // drops out here and a change of the DEM coverage costs nothing. The points drawn in
497
+ // immediate mode look their elevation up every frame, so they are never left behind.
498
+ if (state.batches.points.length === 0)
499
+ continue;
500
+ this.rebuildPointPart(state, renderers, state.pointsMask);
501
+ }
502
+ }
503
+ /**
504
+ * Brings the point part of a built chunk to the rows `drawn`
505
+ *
506
+ * @returns false when it could not be rebuilt (the shaders are not ready; the previous point
507
+ * part is kept and it is tried again on the next draw)
508
+ */
509
+ rebuildPoints(state, renderers, drawn) {
510
+ if (!sameRowsInMasks(state.pointsMask, drawn, state.chunk.rows)) {
511
+ if (!this.rebuildPointPart(state, renderers, drawn))
512
+ return false;
513
+ }
514
+ state.pointsMask = drawn;
515
+ return true;
516
+ }
517
+ /** Rebuilds the point part of a built chunk with the rows `drawn` */
518
+ rebuildPointPart(state, renderers, drawn) {
519
+ return rebuildChunkPoints(state.batches, this.host.collector(state.chunk.rows, { isExternallyRenderedPoint: this.host.externalPointFilter(), pointsOnly: true }, drawn), renderers, chunkOrigin(state));
520
+ }
521
+ }
522
+ /**
523
+ * The origin of the relative coordinates of the built batches of a chunk
524
+ *
525
+ * The coordinates of a retained batch are baked relative to this origin. Passing a different
526
+ * origin to the re-bake of the points alone (rebuildChunkPoints) than to the build would shift
527
+ * every re-baked point by the difference of the origins, so both read the origin recorded with
528
+ * the batches. A build starts from the center of the chunk bounds, or from the origin chosen for
529
+ * the view.
530
+ */
531
+ function chunkOrigin(state) {
532
+ return state.origin ?? boundsCenter(state.chunk.bounds);
533
+ }
@@ -0,0 +1 @@
1
+ export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from './partition.js';
@@ -0,0 +1,104 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { getBoundingBox } from '../shared/utils/feature-bbox.js';
4
+ import { CHUNK_TARGET_SIZE, partitionRows } from './partition.js';
5
+ export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from './partition.js';
6
+ /**
7
+ * Whether two bboxes intersect
8
+ *
9
+ * @internal
10
+ */
11
+ export function boundsIntersect(a, b) {
12
+ return a.minX <= b.maxX && a.maxX >= b.minX && a.minY <= b.maxY && a.maxY >= b.minY;
13
+ }
14
+ /**
15
+ * Number of vertices of a feature (an estimate of the amount of work)
16
+ *
17
+ * @internal
18
+ */
19
+ export function countVertices(feature) {
20
+ const geometry = feature;
21
+ const walk = (value, depth) => {
22
+ if (!Array.isArray(value))
23
+ return 0;
24
+ if (depth === 0)
25
+ return 1;
26
+ let total = 0;
27
+ for (const item of value)
28
+ total += walk(item, depth - 1);
29
+ return total;
30
+ };
31
+ switch (geometry.type) {
32
+ case 'Point':
33
+ return 1;
34
+ case 'LineString':
35
+ case 'MultiPoint':
36
+ return walk(geometry.coordinates, 1);
37
+ case 'Polygon':
38
+ case 'MultiLineString':
39
+ return walk(geometry.coordinates, 2);
40
+ case 'MultiPolygon':
41
+ return walk(geometry.coordinates, 3);
42
+ default:
43
+ return 1;
44
+ }
45
+ }
46
+ /**
47
+ * Computes the bboxes of the features all at once, `[minX, minY, maxX, maxY]` per feature
48
+ *
49
+ * The spatial index and the splitting both read this one array (it is not computed twice).
50
+ *
51
+ * @internal
52
+ */
53
+ export function computeFeatureBounds(features) {
54
+ const bounds = new Float64Array(features.length * 4);
55
+ for (let i = 0; i < features.length; i++) {
56
+ const bbox = getBoundingBox(features[i]);
57
+ bounds[i * 4] = bbox.minX;
58
+ bounds[i * 4 + 1] = bbox.minY;
59
+ bounds[i * 4 + 2] = bbox.maxX;
60
+ bounds[i * 4 + 3] = bbox.maxY;
61
+ }
62
+ return bounds;
63
+ }
64
+ /**
65
+ * Turns the flat result of the splitting into chunks
66
+ *
67
+ * @internal
68
+ */
69
+ export function toDisplayChunks(partitioned) {
70
+ const { rows, offsets, bounds } = partitioned;
71
+ const chunks = new Array(offsets.length - 1);
72
+ for (let c = 0; c < chunks.length; c++) {
73
+ const chunkRows = rows.subarray(offsets[c], offsets[c + 1]);
74
+ chunks[c] = {
75
+ rows: chunkRows,
76
+ bounds: {
77
+ minX: bounds[c * 4],
78
+ minY: bounds[c * 4 + 1],
79
+ maxX: bounds[c * 4 + 2],
80
+ maxY: bounds[c * 4 + 3],
81
+ },
82
+ firstIndex: chunkRows[0],
83
+ };
84
+ }
85
+ return chunks;
86
+ }
87
+ /**
88
+ * Splits the features into spatial chunks (`partitionRows` over their bboxes)
89
+ *
90
+ * @param features The features in draw order
91
+ * @param targetSize The target number of features per chunk
92
+ * @param featureBounds The precomputed bboxes (computed here when omitted)
93
+ *
94
+ * @internal
95
+ */
96
+ export function partitionIntoChunks(features, targetSize = CHUNK_TARGET_SIZE, featureBounds) {
97
+ if (features.length === 0)
98
+ return [];
99
+ const bounds = featureBounds ?? computeFeatureBounds(features);
100
+ const vertexCounts = new Float64Array(features.length);
101
+ for (let i = 0; i < features.length; i++)
102
+ vertexCounts[i] = countVertices(features[i]);
103
+ return toDisplayChunks(partitionRows(bounds, vertexCounts, targetSize));
104
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The subpath `@sakuzu/maplibre-gl-draw/columnar`
3
+ *
4
+ * The parts of the columnar input of the datasets that can run in a Worker: the
5
+ * preparation of a table and the list of its buffers for `postMessage`, with the types of the
6
+ * table. It depends on neither maplibre nor WebGL nor the DOM, so a Worker that reads a file can
7
+ * import it without pulling in the engine.
8
+ *
9
+ * @module columnar
10
+ */
11
+ export { columnarTransferables, prepareDatasetColumnar } from './prepare.js';
12
+ export type { DatasetColumn, DatasetColumnarGeometry, DatasetColumnarGeometryType, DatasetColumnarInput, DatasetColumnarMixedGeometry, DatasetColumnarPrepared, DatasetDictionaryCodes, DatasetDictionaryColumn, } from './types.js';