@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,529 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { binTile, drapeCellWorkBudget } from './binning.js';
4
+ /** The number of style texels per element */
5
+ export const DRAPE_STYLE_TEXELS = 4;
6
+ /**
7
+ * The index of the texel the selection highlight uses within the style table
8
+ *
9
+ * 0 = fill, 1 = stroke, 2 = specifications (width, kind, source, reference zoom), 3 =
10
+ * selection. The selection alone is put in a separate texel so that the index (the binning)
11
+ * need not be touched at all when the selection changes. Mixing it into the same texel as the
12
+ * color or the width would mean rebuilding the other values too on every rewrite.
13
+ */
14
+ export const DRAPE_SELECTION_TEXEL = 3;
15
+ /** The upper bound on the tiles retained (beyond it, those outside the view are dropped and
16
+ * the arrays are repacked) */
17
+ const MAX_CACHED_TILES = 96;
18
+ /** The upper bound on the number of edge texels (16 bytes per texel, so 1M is 16MB) */
19
+ export const DRAPE_MAX_EDGE_TEXELS = 1048576;
20
+ /** The key of a tile */
21
+ export function drapeTileKey(tile) {
22
+ return `${tile.z}/${tile.x}/${tile.y}`;
23
+ }
24
+ /**
25
+ * The arrays packed into the data textures (append-only)
26
+ *
27
+ * Adding a tile only piles it onto the end, so the transfer to the GPU is limited to the rows
28
+ * that were added (the renderer remembers the position it has transferred up to).
29
+ */
30
+ export class DrapePackBuilder {
31
+ constructor() {
32
+ /** The identity of this version (with which the renderer tells whether it has been
33
+ * transferred) */
34
+ Object.defineProperty(this, "id", {
35
+ enumerable: true,
36
+ configurable: true,
37
+ writable: true,
38
+ value: DrapePackBuilder.nextId++
39
+ });
40
+ Object.defineProperty(this, "edges", {
41
+ enumerable: true,
42
+ configurable: true,
43
+ writable: true,
44
+ value: new Float32Array(4 * 4096)
45
+ });
46
+ Object.defineProperty(this, "edgeCount", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: 0
51
+ });
52
+ Object.defineProperty(this, "runs", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: new Float32Array(4 * 2048)
57
+ });
58
+ Object.defineProperty(this, "runCount", {
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true,
62
+ value: 0
63
+ });
64
+ Object.defineProperty(this, "cells", {
65
+ enumerable: true,
66
+ configurable: true,
67
+ writable: true,
68
+ value: new Float32Array(4 * 4096)
69
+ });
70
+ Object.defineProperty(this, "cellCount", {
71
+ enumerable: true,
72
+ configurable: true,
73
+ writable: true,
74
+ value: 0
75
+ });
76
+ Object.defineProperty(this, "styles", {
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true,
80
+ value: new Float32Array(0)
81
+ });
82
+ Object.defineProperty(this, "elementCount", {
83
+ enumerable: true,
84
+ configurable: true,
85
+ writable: true,
86
+ value: 0
87
+ });
88
+ /**
89
+ * The version of the selection (when it changes, the style table is sent again)
90
+ *
91
+ * Edges, runs and cells are append-only so sending only the added rows is enough, but the
92
+ * selection rewrites rows that have already been sent. The renderer tells a rewrite apart by
93
+ * this version.
94
+ */
95
+ Object.defineProperty(this, "selectionVersion", {
96
+ enumerable: true,
97
+ configurable: true,
98
+ writable: true,
99
+ value: 0
100
+ });
101
+ /** The number of elements with the selection mark raised (for diagnostics) */
102
+ Object.defineProperty(this, "markedCount", {
103
+ enumerable: true,
104
+ configurable: true,
105
+ writable: true,
106
+ value: 0
107
+ });
108
+ }
109
+ /** Builds the style table (only when the element order changes) */
110
+ setElements(elements) {
111
+ const styles = new Float32Array(Math.max(1, elements.length) * DRAPE_STYLE_TEXELS * 4);
112
+ for (let f = 0; f < elements.length; f++) {
113
+ const at = f * DRAPE_STYLE_TEXELS * 4;
114
+ const element = elements[f];
115
+ styles[at] = element.fill[0];
116
+ styles[at + 1] = element.fill[1];
117
+ styles[at + 2] = element.fill[2];
118
+ styles[at + 3] = element.fill[3];
119
+ styles[at + 4] = element.stroke[0];
120
+ styles[at + 5] = element.stroke[1];
121
+ styles[at + 6] = element.stroke[2];
122
+ styles[at + 7] = element.stroke[3];
123
+ // The width has already been converted into physical pixels at dataset time
124
+ styles[at + 8] = element.strokeWidthPx;
125
+ styles[at + 9] = element.kind;
126
+ styles[at + 10] = element.source;
127
+ styles[at + 11] = element.widthZoom;
128
+ }
129
+ this.styles = styles;
130
+ this.elementCount = elements.length;
131
+ }
132
+ /**
133
+ * Rewrites the marks of the selection highlight
134
+ *
135
+ * What is rewritten is only one texel of the style table (`DRAPE_SELECTION_TEXEL`); the
136
+ * index (edges, runs, cells) is not touched at all. The selection changes with a single
137
+ * click, whereas rebuilding the index takes several hundred milliseconds for 8,172
138
+ * administrative boundaries, so it cannot be rebuilt on every selection.
139
+ *
140
+ * @returns Whether anything actually changed (it is transferred again only when it did)
141
+ */
142
+ setSelection(elements, selected) {
143
+ let changed = false;
144
+ let marked = 0;
145
+ const count = Math.min(elements.length, this.elementCount);
146
+ for (let f = 0; f < count; f++) {
147
+ const key = elements[f].selectionKey;
148
+ const on = key !== '' && selected.has(key) ? 1 : 0;
149
+ if (on === 1)
150
+ marked++;
151
+ const at = (f * DRAPE_STYLE_TEXELS + DRAPE_SELECTION_TEXEL) * 4;
152
+ if (this.styles[at] === on)
153
+ continue;
154
+ this.styles[at] = on;
155
+ changed = true;
156
+ }
157
+ this.markedCount = marked;
158
+ if (changed)
159
+ this.selectionVersion++;
160
+ return changed;
161
+ }
162
+ /** Piles one tile onto the end */
163
+ addTile(bins) {
164
+ const edgeBase = this.edgeCount;
165
+ const runBase = this.runCount;
166
+ const cellOffset = this.cellCount;
167
+ const edgeTexels = bins.edges.length / 4;
168
+ this.edges = ensureCapacity(this.edges, (this.edgeCount + edgeTexels) * 4);
169
+ this.edges.set(bins.edges, edgeBase * 4);
170
+ this.edgeCount += edgeTexels;
171
+ const runTexels = bins.runs.length / 4;
172
+ this.runs = ensureCapacity(this.runs, (this.runCount + runTexels) * 4);
173
+ for (let i = 0; i < runTexels; i++) {
174
+ const at = (runBase + i) * 4;
175
+ this.runs[at] = bins.runs[i * 4];
176
+ this.runs[at + 1] = bins.runs[i * 4 + 1] + edgeBase;
177
+ this.runs[at + 2] = bins.runs[i * 4 + 2];
178
+ this.runs[at + 3] = bins.runs[i * 4 + 3];
179
+ }
180
+ this.runCount += runTexels;
181
+ const cellTexels = bins.grid * bins.grid;
182
+ this.cells = ensureCapacity(this.cells, (this.cellCount + cellTexels) * 4);
183
+ for (let c = 0; c < cellTexels; c++) {
184
+ const at = (cellOffset + c) * 4;
185
+ this.cells[at] = bins.cells[c * 2] + runBase;
186
+ this.cells[at + 1] = bins.cells[c * 2 + 1];
187
+ this.cells[at + 2] = 0;
188
+ this.cells[at + 3] = 0;
189
+ }
190
+ this.cellCount += cellTexels;
191
+ return cellOffset;
192
+ }
193
+ }
194
+ Object.defineProperty(DrapePackBuilder, "nextId", {
195
+ enumerable: true,
196
+ configurable: true,
197
+ writable: true,
198
+ value: 1
199
+ });
200
+ /** Doubles the capacity and copies when it is not enough */
201
+ function ensureCapacity(array, needed) {
202
+ if (array.length >= needed)
203
+ return array;
204
+ let size = Math.max(1024, array.length);
205
+ while (size < needed)
206
+ size *= 2;
207
+ const out = new Float32Array(size);
208
+ out.set(array);
209
+ return out;
210
+ }
211
+ /** The set used when nothing is selected (so that one is not created every time) */
212
+ const EMPTY_SELECTION = new Set();
213
+ /** Whether the selection sets are the same (judged by the size and the elements) */
214
+ function sameSelection(a, b) {
215
+ if (a === b)
216
+ return true;
217
+ if (a.size !== b.size)
218
+ return false;
219
+ for (const key of a) {
220
+ if (!b.has(key))
221
+ return false;
222
+ }
223
+ return true;
224
+ }
225
+ /**
226
+ * The current time (in ms)
227
+ */
228
+ function nowMs() {
229
+ return typeof performance !== 'undefined' ? performance.now() : Date.now();
230
+ }
231
+ /**
232
+ * The store of the tile indices
233
+ */
234
+ export class DrapeTileStore {
235
+ constructor() {
236
+ Object.defineProperty(this, "active", {
237
+ enumerable: true,
238
+ configurable: true,
239
+ writable: true,
240
+ value: null
241
+ });
242
+ Object.defineProperty(this, "pending", {
243
+ enumerable: true,
244
+ configurable: true,
245
+ writable: true,
246
+ value: null
247
+ });
248
+ Object.defineProperty(this, "frame", {
249
+ enumerable: true,
250
+ configurable: true,
251
+ writable: true,
252
+ value: 0
253
+ });
254
+ /** The keys of the features currently selected (drapeSelectionKey in `binning.ts`) */
255
+ Object.defineProperty(this, "selection", {
256
+ enumerable: true,
257
+ configurable: true,
258
+ writable: true,
259
+ value: EMPTY_SELECTION
260
+ });
261
+ }
262
+ /**
263
+ * Announces the element order
264
+ *
265
+ * When the version changes, a new version is started. The old version can keep being drawn
266
+ * as it is.
267
+ */
268
+ sync(revision, elements, quadBreaks = [], entryStarts = new Map(), aboveStoreStart = elements.length) {
269
+ if (this.active && this.active.revision === revision) {
270
+ if (this.pending)
271
+ this.pending = null;
272
+ return;
273
+ }
274
+ if (this.pending?.revision === revision)
275
+ return;
276
+ const state = createState(revision, elements, quadBreaks, entryStarts, aboveStoreStart);
277
+ // The current selection is copied into the version that was just started too (without
278
+ // this, the highlight drops for exactly one frame right after the element order changes)
279
+ state.builder.setSelection(state.elements, this.selection);
280
+ if (this.active)
281
+ this.pending = state;
282
+ else
283
+ this.active = state;
284
+ }
285
+ /**
286
+ * Announces the targets of the selection highlight (the rendering side calls it every frame)
287
+ *
288
+ * It does nothing when the contents are the same. Scanning all the elements every frame with
289
+ * the same set would be a wasted scan per frame for 8,172 administrative boundaries. How
290
+ * they are drawn is held in the per-version style table, so the same selection is copied
291
+ * into the version under construction (pending) as well.
292
+ */
293
+ setSelection(selected) {
294
+ if (sameSelection(this.selection, selected))
295
+ return;
296
+ // A copy is held so that it does not waver if the caller later rewrites the set it
297
+ // passes around
298
+ this.selection = new Set(selected);
299
+ if (this.active)
300
+ this.active.builder.setSelection(this.active.elements, this.selection);
301
+ if (this.pending)
302
+ this.pending.builder.setSelection(this.pending.elements, this.selection);
303
+ }
304
+ /**
305
+ * Prepares the indices of the tiles of the view
306
+ *
307
+ * @param tiles The terrain tiles of the view
308
+ * @param budgetMs The time that may be used in this frame (at least one tile is always
309
+ * built; at 0 or less, not a single one is built)
310
+ * @param zoom The current zoom (used to estimate the line width, which decides the margin of
311
+ * the index)
312
+ */
313
+ prepare(tiles, budgetMs, zoom = 0) {
314
+ this.frame++;
315
+ const target = this.pending ?? this.active;
316
+ if (!target) {
317
+ return {
318
+ complete: false,
319
+ pending: false,
320
+ overflow: false,
321
+ built: 0,
322
+ maxTileEdges: 0,
323
+ maxEdgesPerCell: 0,
324
+ maxRunsPerCell: 0,
325
+ truncatedCells: 0,
326
+ unfitTiles: 0,
327
+ };
328
+ }
329
+ const start = nowMs();
330
+ // The screen is shared among the tiles, so the more tiles there are the fewer pixels
331
+ // each one has
332
+ const maxCellWork = drapeCellWorkBudget(tiles.length);
333
+ let built = 0;
334
+ for (const tile of tiles) {
335
+ const key = drapeTileKey(tile);
336
+ const hit = target.entries.get(key);
337
+ if (hit) {
338
+ hit.lastUsed = this.frame;
339
+ continue;
340
+ }
341
+ // A budget of 0 or less is an explicit skip meaning "build not a single one"
342
+ // (the deferral while the camera is moving). With a normal budget at least one is
343
+ // always built (so that progress does not stall).
344
+ if (budgetMs <= 0)
345
+ continue;
346
+ if (built > 0 && nowMs() - start >= budgetMs)
347
+ continue;
348
+ const bins = binTile(target.elements, tile, { maxCellWork, zoom });
349
+ const cellOffset = target.builder.addTile(bins);
350
+ target.entries.set(key, {
351
+ unfit: bins.overflow,
352
+ grid: bins.grid,
353
+ cellOffset,
354
+ bins,
355
+ lastUsed: this.frame,
356
+ });
357
+ built++;
358
+ }
359
+ // The new version replaces the old one once it covers the view better.
360
+ //
361
+ // The principle is "draw with the old version until it is ready", but when the old version
362
+ // does not cover the current view at all (the zoom or the place moved a lot), waiting for
363
+ // the old version only leaves the fill missing. Comparing the number of tiles covered
364
+ // picks "whichever can draw more" in either case.
365
+ if (this.pending && this.active) {
366
+ const covered = (state) => {
367
+ let n = 0;
368
+ for (const tile of tiles)
369
+ if (state.entries.has(drapeTileKey(tile)))
370
+ n++;
371
+ return n;
372
+ };
373
+ if (covered(this.pending) >= covered(this.active)) {
374
+ this.active = this.pending;
375
+ this.pending = null;
376
+ }
377
+ }
378
+ const active = this.active;
379
+ if (active) {
380
+ this.compactIfNeeded(active, tiles);
381
+ // Whether there are still tiles not built in the current version
382
+ let activeMissing = 0;
383
+ let unfit = 0;
384
+ let maxTileEdges = 0;
385
+ let maxEdgesPerCell = 0;
386
+ let maxRunsPerCell = 0;
387
+ let truncatedCells = 0;
388
+ for (const tile of tiles) {
389
+ const entry = active.entries.get(drapeTileKey(tile));
390
+ if (!entry) {
391
+ activeMissing++;
392
+ continue;
393
+ }
394
+ if (entry.unfit)
395
+ unfit++;
396
+ maxTileEdges = Math.max(maxTileEdges, entry.bins.edgeEstimate);
397
+ maxEdgesPerCell = Math.max(maxEdgesPerCell, entry.bins.maxEdgesPerCell);
398
+ maxRunsPerCell = Math.max(maxRunsPerCell, entry.bins.maxRunsPerCell);
399
+ truncatedCells += entry.bins.truncatedCells;
400
+ }
401
+ // Once the tiles that do not go through the analytic evaluation exceed a quarter of the
402
+ // view, the whole map is handed to the vertex displacement path (a zoomed-out view falls
403
+ // into this case; each tile is so wide that dropping a single one loses half the
404
+ // picture). In a pitched view a single coarse tile in the distance can fall out, and
405
+ // that one tile is simply not drawn (it is a strip at the corner of the screen, and the
406
+ // rest can be kept on the analytic evaluation)
407
+ return {
408
+ complete: activeMissing === 0,
409
+ pending: activeMissing > 0 || this.pending !== null,
410
+ overflow: tiles.length > 0 && unfit * 4 > tiles.length,
411
+ built,
412
+ maxTileEdges,
413
+ maxEdgesPerCell,
414
+ maxRunsPerCell,
415
+ truncatedCells,
416
+ unfitTiles: unfit,
417
+ };
418
+ }
419
+ return {
420
+ complete: false,
421
+ pending: true,
422
+ overflow: false,
423
+ built,
424
+ maxTileEdges: 0,
425
+ maxEdgesPerCell: 0,
426
+ maxRunsPerCell: 0,
427
+ truncatedCells: 0,
428
+ unfitTiles: 0,
429
+ };
430
+ }
431
+ /** The version used for rendering */
432
+ get pack() {
433
+ return this.active?.builder ?? null;
434
+ }
435
+ /** The number of elements of the version used for rendering */
436
+ get elementCount() {
437
+ return this.active?.elements.length ?? 0;
438
+ }
439
+ /**
440
+ * The breaks in the stacking order of the version used for rendering (the positions of the
441
+ * images)
442
+ *
443
+ * It returns those of the version being drawn right now, not of the version that was just
444
+ * collected. While a rebuild is in progress the old version keeps being drawn, so making
445
+ * only the breaks new would make the indices disagree with the element list and the
446
+ * segmented rendering would paint a different element or paint nothing.
447
+ */
448
+ get quadBreaks() {
449
+ return this.active?.quadBreaks ?? [];
450
+ }
451
+ /** The starting position of each entry of the stack, in the version being drawn */
452
+ get entryStarts() {
453
+ return this.active?.entryStarts ?? EMPTY_ENTRY_STARTS;
454
+ }
455
+ /** The index at which the datasets above the stack begin, in the version being drawn */
456
+ get aboveStoreStart() {
457
+ return this.active?.aboveStoreStart ?? this.elementCount;
458
+ }
459
+ /** The position of one tile */
460
+ entryOf(tile) {
461
+ return this.active?.entries.get(drapeTileKey(tile));
462
+ }
463
+ /** Throws everything away */
464
+ clear() {
465
+ this.active = null;
466
+ this.pending = null;
467
+ }
468
+ /**
469
+ * Once the amount retained exceeds the upper bound, keeps only the tiles of the view and
470
+ * repacks
471
+ *
472
+ * The bins are still held, so it takes only a repacking of the arrays, not a rebuild.
473
+ */
474
+ compactIfNeeded(state, tiles) {
475
+ if (state.entries.size <= MAX_CACHED_TILES &&
476
+ state.builder.edgeCount <= DRAPE_MAX_EDGE_TEXELS) {
477
+ return;
478
+ }
479
+ const keep = new Set(tiles.map(drapeTileKey));
480
+ const builder = new DrapePackBuilder();
481
+ builder.setElements(state.elements);
482
+ // The repacked builder rebuilds the style table, so the selection marks are copied again
483
+ // as well. Forgetting to copy them means setSelection returns early as long as the set
484
+ // does not change and the highlight never comes back (it shows up as a selection that
485
+ // "disappears when you zoom")
486
+ builder.setSelection(state.elements, this.selection);
487
+ const entries = new Map();
488
+ for (const [key, entry] of state.entries) {
489
+ if (!keep.has(key))
490
+ continue;
491
+ const cellOffset = builder.addTile(entry.bins);
492
+ entries.set(key, { ...entry, cellOffset });
493
+ }
494
+ const replaced = {
495
+ revision: state.revision,
496
+ elements: state.elements,
497
+ quadBreaks: state.quadBreaks,
498
+ entryStarts: state.entryStarts,
499
+ aboveStoreStart: state.aboveStoreStart,
500
+ builder,
501
+ entries,
502
+ overflow: state.overflow,
503
+ };
504
+ // If it still does not fit after repacking, the view itself exceeds the budget. The
505
+ // degradation flag is raised and it is handed to the vertex displacement path
506
+ if (builder.edgeCount > DRAPE_MAX_EDGE_TEXELS)
507
+ replaced.overflow = true;
508
+ if (this.active === state)
509
+ this.active = replaced;
510
+ if (this.pending === state)
511
+ this.pending = replaced;
512
+ }
513
+ }
514
+ /** Starts a version */
515
+ function createState(revision, elements, quadBreaks, entryStarts, aboveStoreStart) {
516
+ const builder = new DrapePackBuilder();
517
+ builder.setElements(elements);
518
+ return {
519
+ revision,
520
+ elements,
521
+ quadBreaks,
522
+ entryStarts,
523
+ aboveStoreStart,
524
+ builder,
525
+ entries: new Map(),
526
+ overflow: false,
527
+ };
528
+ }
529
+ const EMPTY_ENTRY_STARTS = new Map();