@sakuzu/maplibre-gl-draw 1.0.0 → 2.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 (540) hide show
  1. package/CHANGELOG.md +1016 -2
  2. package/README.ja.md +39 -19
  3. package/README.md +41 -21
  4. package/dist/api/datasets.d.ts +258 -0
  5. package/dist/api/document.d.ts +66 -0
  6. package/dist/api/draw.d.ts +135 -0
  7. package/dist/api/draw.js +18 -0
  8. package/dist/api/drawing.d.ts +87 -0
  9. package/dist/api/errors.d.ts +35 -0
  10. package/dist/api/errors.js +35 -0
  11. package/dist/api/events.d.ts +306 -0
  12. package/dist/api/extension/context.d.ts +247 -0
  13. package/dist/api/extension/feature-type.d.ts +129 -0
  14. package/dist/api/extension/mode.d.ts +123 -0
  15. package/dist/api/extension/plugin.d.ts +51 -0
  16. package/dist/api/extension/plugin.js +3 -0
  17. package/dist/api/extension/provider.d.ts +119 -0
  18. package/dist/api/extension/provider.js +3 -0
  19. package/dist/api/extension/render.d.ts +176 -0
  20. package/dist/api/extension/render.js +3 -0
  21. package/dist/api/extension/store.d.ts +190 -0
  22. package/dist/api/extension/store.js +3 -0
  23. package/dist/api/extensions.d.ts +306 -0
  24. package/dist/api/extensions.js +3 -0
  25. package/dist/api/features.d.ts +188 -0
  26. package/dist/api/features.js +3 -0
  27. package/dist/api/groups.d.ts +111 -0
  28. package/dist/api/groups.js +3 -0
  29. package/dist/api/hidden.d.ts +45 -0
  30. package/dist/api/hidden.js +3 -0
  31. package/dist/api/impl/adapters.js +463 -0
  32. package/dist/api/impl/contexts.js +466 -0
  33. package/dist/api/impl/create-draw.js +124 -0
  34. package/dist/api/impl/datasets.js +404 -0
  35. package/dist/api/impl/destroy-guard.js +74 -0
  36. package/dist/api/impl/document.js +280 -0
  37. package/dist/api/impl/drawing.js +180 -0
  38. package/dist/api/impl/engine-context.d.ts +7 -0
  39. package/dist/api/{context.js → impl/engine-context.js} +49 -38
  40. package/dist/{maplibre-gl-draw.js → api/impl/engine.js} +145 -177
  41. package/dist/api/impl/events.js +422 -0
  42. package/dist/api/impl/extension-host.js +361 -0
  43. package/dist/api/impl/extensions.js +229 -0
  44. package/dist/api/impl/features.js +445 -0
  45. package/dist/api/impl/geometry/apply.d.ts +32 -0
  46. package/dist/api/{geometry → impl/geometry}/apply.js +10 -27
  47. package/dist/api/{geometry → impl/geometry}/buffer.d.ts +4 -3
  48. package/dist/api/{geometry → impl/geometry}/buffer.js +12 -23
  49. package/dist/api/{geometry → impl/geometry}/split.d.ts +4 -3
  50. package/dist/api/{geometry → impl/geometry}/split.js +10 -21
  51. package/dist/api/{geometry → impl/geometry}/targets.d.ts +2 -20
  52. package/dist/api/{geometry → impl/geometry}/targets.js +8 -35
  53. package/dist/api/impl/geometry/types.js +3 -0
  54. package/dist/api/impl/groups.d.ts +3 -0
  55. package/dist/api/impl/groups.js +268 -0
  56. package/dist/api/impl/hidden.js +60 -0
  57. package/dist/api/impl/import-export/constants.d.ts +22 -0
  58. package/dist/api/impl/import-export/constants.js +24 -0
  59. package/dist/api/{import-export → impl/import-export}/embedded-file.js +2 -2
  60. package/dist/api/{import-export → impl/import-export}/format-detection.d.ts +1 -1
  61. package/dist/api/{import-export → impl/import-export}/format-detection.js +2 -1
  62. package/dist/api/impl/import-export/geojson-export.d.ts +19 -0
  63. package/dist/api/{import-export → impl/import-export}/geojson-export.js +71 -104
  64. package/dist/api/{import-export → impl/import-export}/geojson-import.d.ts +11 -7
  65. package/dist/api/{import-export → impl/import-export}/geojson-import.js +139 -97
  66. package/dist/api/{import-export → impl/import-export}/geometry-validation.d.ts +14 -0
  67. package/dist/api/{import-export → impl/import-export}/geometry-validation.js +45 -0
  68. package/dist/api/impl/import-export/image-import.d.ts +16 -0
  69. package/dist/api/impl/import-export/image-import.js +73 -0
  70. package/dist/api/impl/import-export/legacy-image-style.d.ts +16 -0
  71. package/dist/api/impl/import-export/legacy-image-style.js +49 -0
  72. package/dist/api/impl/import-export/native-format.d.ts +14 -0
  73. package/dist/api/{import-export → impl/import-export}/native-format.js +32 -22
  74. package/dist/api/impl/import-export/native-upgrade.d.ts +8 -0
  75. package/dist/api/impl/import-export/native-upgrade.js +139 -0
  76. package/dist/api/{import-export → impl/import-export}/native-validation.d.ts +1 -1
  77. package/dist/api/{import-export → impl/import-export}/native-validation.js +15 -14
  78. package/dist/api/impl/import-export/style-validation.d.ts +24 -0
  79. package/dist/api/impl/import-export/style-validation.js +86 -0
  80. package/dist/api/impl/import-export/types.d.ts +52 -0
  81. package/dist/api/impl/import-export/types.js +3 -0
  82. package/dist/api/impl/input.js +180 -0
  83. package/dist/api/impl/layers.js +307 -0
  84. package/dist/api/impl/metadata.d.ts +1 -0
  85. package/dist/api/impl/metadata.js +22 -0
  86. package/dist/api/impl/options.d.ts +1 -0
  87. package/dist/api/impl/options.js +822 -0
  88. package/dist/api/impl/placement.d.ts +1 -0
  89. package/dist/api/impl/placement.js +138 -0
  90. package/dist/api/impl/render-context.d.ts +13 -0
  91. package/dist/api/impl/render-context.js +272 -0
  92. package/dist/api/impl/rows.d.ts +1 -0
  93. package/dist/api/impl/rows.js +46 -0
  94. package/dist/api/impl/selection.d.ts +1 -0
  95. package/dist/api/impl/selection.js +186 -0
  96. package/dist/api/impl/shared.d.ts +64 -0
  97. package/dist/api/impl/shared.js +178 -0
  98. package/dist/api/impl/validate-extension.d.ts +1 -0
  99. package/dist/api/impl/validate-extension.js +159 -0
  100. package/dist/api/layers.d.ts +130 -0
  101. package/dist/api/layers.js +3 -0
  102. package/dist/api/metadata.d.ts +18 -0
  103. package/dist/api/metadata.js +3 -0
  104. package/dist/api/model.d.ts +487 -0
  105. package/dist/api/model.js +47 -0
  106. package/dist/api/options.d.ts +466 -0
  107. package/dist/api/options.js +3 -0
  108. package/dist/api/selection.d.ts +94 -0
  109. package/dist/api/selection.js +3 -0
  110. package/dist/api/state.d.ts +155 -0
  111. package/dist/api/state.js +12 -0
  112. package/dist/{display → dataset}/chunk.d.ts +1 -1
  113. package/dist/{display → dataset}/chunk.js +4 -3
  114. package/dist/{display → dataset}/dataset.js +18 -21
  115. package/dist/dataset/interaction.d.ts +1 -0
  116. package/dist/{display → dataset}/interaction.js +18 -6
  117. package/dist/dataset/manager.d.ts +1 -0
  118. package/dist/dataset/provider.d.ts +1 -0
  119. package/dist/{display → dataset}/retained.d.ts +1 -1
  120. package/dist/{display → dataset}/retained.js +8 -7
  121. package/dist/dataset/source.d.ts +1 -0
  122. package/dist/{display → dataset}/source.js +17 -4
  123. package/dist/dataset/spatial.d.ts +1 -0
  124. package/dist/{display → dataset}/spatial.js +1 -1
  125. package/dist/dataset/style.d.ts +1 -0
  126. package/dist/{display → dataset}/style.js +1 -1
  127. package/dist/dataset/table-source.d.ts +1 -0
  128. package/dist/{display/columnar/source.js → dataset/table-source.js} +53 -25
  129. package/dist/{display → dataset}/thinning.d.ts +0 -10
  130. package/dist/{display → dataset}/thinning.js +3 -2
  131. package/dist/dataset/triangulation.d.ts +1 -0
  132. package/dist/{display → dataset}/triangulation.js +0 -0
  133. package/dist/{display → dataset}/types.d.ts +82 -121
  134. package/dist/dataset/types.js +61 -0
  135. package/dist/dispatcher/hit-test/box-strategies.js +13 -13
  136. package/dist/dispatcher/hit-test/box-strategy.d.ts +2 -15
  137. package/dist/dispatcher/hit-test/globe-shape.js +5 -4
  138. package/dist/dispatcher/hit-test/service.d.ts +17 -0
  139. package/dist/dispatcher/hit-test/service.js +80 -16
  140. package/dist/dispatcher/hit-test/strategies/base.d.ts +13 -19
  141. package/dist/dispatcher/hit-test/strategies/circle.js +3 -2
  142. package/dist/dispatcher/hit-test/strategies/image.js +6 -18
  143. package/dist/dispatcher/hit-test/strategies/line.d.ts +0 -6
  144. package/dist/dispatcher/hit-test/strategies/line.js +9 -2
  145. package/dist/dispatcher/hit-test/strategies/multi.d.ts +0 -8
  146. package/dist/dispatcher/hit-test/strategies/multi.js +17 -8
  147. package/dist/dispatcher/hit-test/strategies/point.d.ts +9 -7
  148. package/dist/dispatcher/hit-test/strategies/point.js +8 -4
  149. package/dist/dispatcher/hit-test/strategies/polygon.d.ts +0 -7
  150. package/dist/dispatcher/hit-test/strategies/polygon.js +11 -3
  151. package/dist/dispatcher/hit-test/topmost.d.ts +1 -1
  152. package/dist/dispatcher/input-router.js +152 -69
  153. package/dist/dispatcher/normalizer.js +6 -2
  154. package/dist/dispatcher/types.d.ts +6 -1
  155. package/dist/extension/feature-handler.d.ts +1 -182
  156. package/dist/extension/index.d.ts +4 -7
  157. package/dist/extension/renderers.d.ts +1 -208
  158. package/dist/geometry/angle.d.ts +0 -8
  159. package/dist/geometry/angle.js +0 -8
  160. package/dist/geometry/bbox.d.ts +4 -12
  161. package/dist/geometry/bbox.js +4 -12
  162. package/dist/geometry/boolean.d.ts +0 -51
  163. package/dist/geometry/boolean.js +0 -51
  164. package/dist/geometry/buffer.d.ts +0 -26
  165. package/dist/geometry/buffer.js +0 -26
  166. package/dist/geometry/circle.d.ts +0 -9
  167. package/dist/geometry/circle.js +0 -9
  168. package/dist/geometry/coords.d.ts +0 -16
  169. package/dist/geometry/coords.js +0 -16
  170. package/dist/geometry/distance.d.ts +0 -24
  171. package/dist/geometry/distance.js +0 -24
  172. package/dist/geometry/errors.d.ts +21 -36
  173. package/dist/geometry/errors.js +49 -29
  174. package/dist/geometry/geojson.d.ts +81 -0
  175. package/dist/geometry/geojson.js +164 -0
  176. package/dist/geometry/index.d.ts +38 -23
  177. package/dist/geometry/index.js +43 -31
  178. package/dist/geometry/measure.d.ts +0 -27
  179. package/dist/geometry/measure.js +0 -27
  180. package/dist/geometry/predicates.d.ts +0 -9
  181. package/dist/geometry/predicates.js +0 -9
  182. package/dist/geometry/public-bounds.d.ts +26 -0
  183. package/dist/geometry/public-bounds.js +30 -0
  184. package/dist/geometry/public-combine.d.ts +78 -0
  185. package/dist/geometry/public-combine.js +82 -0
  186. package/dist/geometry/public-create.d.ts +54 -0
  187. package/dist/geometry/public-create.js +70 -0
  188. package/dist/geometry/public-measure.d.ts +170 -0
  189. package/dist/geometry/public-measure.js +283 -0
  190. package/dist/geometry/public-predicates.d.ts +54 -0
  191. package/dist/geometry/public-predicates.js +144 -0
  192. package/dist/geometry/public-repair.d.ts +75 -0
  193. package/dist/geometry/public-repair.js +77 -0
  194. package/dist/geometry/simplify.d.ts +0 -7
  195. package/dist/geometry/simplify.js +0 -7
  196. package/dist/geometry/split.d.ts +0 -20
  197. package/dist/geometry/split.js +0 -20
  198. package/dist/geometry/units.d.ts +20 -12
  199. package/dist/geometry/units.js +20 -12
  200. package/dist/index.d.ts +52 -66
  201. package/dist/index.js +6 -18
  202. package/dist/messages.d.ts +7 -7
  203. package/dist/modes/draw/circle.js +83 -207
  204. package/dist/modes/draw/commit-layer.d.ts +5 -16
  205. package/dist/modes/draw/commit-layer.js +2 -13
  206. package/dist/modes/draw/freehand.js +108 -246
  207. package/dist/modes/draw/image.js +4 -2
  208. package/dist/modes/draw/index.d.ts +5 -5
  209. package/dist/modes/draw/index.js +5 -5
  210. package/dist/modes/draw/line.js +18 -354
  211. package/dist/modes/draw/point.js +29 -78
  212. package/dist/modes/draw/polygon.js +23 -368
  213. package/dist/modes/draw/trace-support.d.ts +43 -36
  214. package/dist/modes/draw/trace-support.js +95 -98
  215. package/dist/modes/draw/vertex-drawing.d.ts +1 -0
  216. package/dist/modes/draw/vertex-drawing.js +176 -0
  217. package/dist/modes/handler.d.ts +1 -285
  218. package/dist/modes/manager.d.ts +2 -2
  219. package/dist/modes/manager.js +3 -0
  220. package/dist/modes/select/box-selection.d.ts +3 -3
  221. package/dist/modes/select/box-selection.js +2 -1
  222. package/dist/modes/select/click-handler.d.ts +5 -5
  223. package/dist/modes/select/click-handler.js +22 -20
  224. package/dist/modes/select/cursor-handler.d.ts +2 -2
  225. package/dist/modes/select/drag/intermediate-writes.js +1 -1
  226. package/dist/modes/select/drag/move.js +3 -3
  227. package/dist/modes/select/drag/operation.d.ts +3 -3
  228. package/dist/modes/select/drag/radius.js +5 -4
  229. package/dist/modes/select/drag/transform.d.ts +2 -2
  230. package/dist/modes/select/drag/transform.js +11 -5
  231. package/dist/modes/select/drag/vertex.d.ts +2 -2
  232. package/dist/modes/select/drag/vertex.js +13 -8
  233. package/dist/modes/select/drag-handler.js +44 -25
  234. package/dist/modes/select/mode.js +17 -17
  235. package/dist/modes/select/shortcut-handler.d.ts +8 -8
  236. package/dist/modes/select/shortcut-handler.js +9 -7
  237. package/dist/operations/layer-operations.js +29 -168
  238. package/dist/operations/resize.d.ts +2 -2
  239. package/dist/operations/resize.js +5 -5
  240. package/dist/operations/rotate.js +5 -5
  241. package/dist/operations/selection-operations.d.ts +16 -1
  242. package/dist/operations/selection-operations.js +28 -13
  243. package/dist/operations/shared-vertex.js +4 -2
  244. package/dist/operations/trace-graph.d.ts +0 -18
  245. package/dist/operations/trace-graph.js +0 -18
  246. package/dist/operations/vertex.js +36 -35
  247. package/dist/shared/color.d.ts +1 -0
  248. package/dist/shared/color.js +245 -0
  249. package/dist/shared/config/constants.d.ts +1 -54
  250. package/dist/shared/config/constants.js +1 -58
  251. package/dist/shared/config/feature-style.d.ts +16 -13
  252. package/dist/shared/config/feature-style.js +9 -0
  253. package/dist/shared/config/rendering.d.ts +3 -3
  254. package/dist/shared/config/selection-highlight.d.ts +0 -15
  255. package/dist/shared/config/selection-highlight.js +4 -7
  256. package/dist/shared/config/selection.d.ts +2 -32
  257. package/dist/shared/config/selection.js +0 -18
  258. package/dist/shared/config/topology.d.ts +2 -2
  259. package/dist/shared/config/trace.d.ts +4 -4
  260. package/dist/shared/math/angle.d.ts +1 -1
  261. package/dist/shared/math/angle.js +1 -1
  262. package/dist/shared/math/circle.d.ts +1 -1
  263. package/dist/shared/math/circle.js +1 -1
  264. package/dist/shared/math/distance.d.ts +2 -1
  265. package/dist/shared/math/distance.js +3 -2
  266. package/dist/shared/math/index.d.ts +1 -1
  267. package/dist/shared/math/index.js +1 -1
  268. package/dist/shared/math/transform.d.ts +23 -0
  269. package/dist/shared/math/transform.js +47 -28
  270. package/dist/shared/properties.d.ts +18 -0
  271. package/dist/shared/properties.js +129 -0
  272. package/dist/shared/types/events.d.ts +15 -7
  273. package/dist/shared/types/model.d.ts +109 -159
  274. package/dist/shared/types/style.d.ts +1 -1
  275. package/dist/shared/utils/color.d.ts +2 -36
  276. package/dist/shared/utils/color.js +13 -70
  277. package/dist/shared/utils/coordinates.d.ts +30 -4
  278. package/dist/shared/utils/coordinates.js +56 -10
  279. package/dist/shared/utils/event-emitter.d.ts +1 -262
  280. package/dist/shared/utils/event-emitter.js +4 -3
  281. package/dist/shared/utils/feature-bbox.js +8 -7
  282. package/dist/shared/utils/feature-segments.js +5 -4
  283. package/dist/shared/utils/image.d.ts +0 -4
  284. package/dist/shared/utils/image.js +0 -6
  285. package/dist/shared/utils/name-generator.d.ts +14 -20
  286. package/dist/shared/utils/name-generator.js +20 -3
  287. package/dist/shared/utils/pixel-ratio.d.ts +9 -3
  288. package/dist/shared/utils/pixel-ratio.js +13 -4
  289. package/dist/shared/utils/property.d.ts +7 -50
  290. package/dist/shared/utils/property.js +22 -87
  291. package/dist/snapping/custom-targets.js +21 -4
  292. package/dist/snapping/indicator.js +20 -11
  293. package/dist/snapping/providers/display.d.ts +6 -1
  294. package/dist/snapping/providers/display.js +2 -1
  295. package/dist/snapping/providers/guide.d.ts +3 -43
  296. package/dist/snapping/providers/guide.js +1 -44
  297. package/dist/snapping/providers/intersection.js +1 -1
  298. package/dist/snapping/providers/store.js +3 -3
  299. package/dist/snapping/service.js +18 -7
  300. package/dist/snapping/types.d.ts +9 -35
  301. package/dist/store/draw-store.js +233 -142
  302. package/dist/store/local-visibility.d.ts +11 -6
  303. package/dist/store/local-visibility.js +38 -7
  304. package/dist/store/lock.d.ts +0 -6
  305. package/dist/store/lock.js +0 -6
  306. package/dist/store/memory/change-bus.d.ts +3 -3
  307. package/dist/store/memory/change-bus.js +12 -0
  308. package/dist/store/memory/file-store.d.ts +2 -2
  309. package/dist/store/memory/ui-state.d.ts +1 -51
  310. package/dist/store/memory/ui-state.js +122 -134
  311. package/dist/store/memory.d.ts +1 -8
  312. package/dist/store/memory.js +249 -45
  313. package/dist/store/ordering.d.ts +9 -0
  314. package/dist/store/ordering.js +17 -0
  315. package/dist/store/spatial/spatial-index.d.ts +1 -1
  316. package/dist/store/spatial/spatial-index.js +1 -1
  317. package/dist/store/spatial/store-spatial-index.d.ts +3 -1
  318. package/dist/store/spatial/store-spatial-index.js +9 -3
  319. package/dist/store/store.d.ts +66 -107
  320. package/dist/store/types.d.ts +1 -1
  321. package/dist/store/writable-layer.d.ts +1 -1
  322. package/dist/store/writable-layer.js +2 -2
  323. package/dist/table/builder.d.ts +83 -0
  324. package/dist/table/builder.js +381 -0
  325. package/dist/table/index.d.ts +37 -0
  326. package/dist/table/index.js +5 -0
  327. package/dist/table/packed-rtree.d.ts +1 -0
  328. package/dist/{display → table}/packed-rtree.js +1 -1
  329. package/dist/table/partition.d.ts +1 -0
  330. package/dist/{display → table}/partition.js +3 -3
  331. package/dist/table/prepare.d.ts +44 -0
  332. package/dist/table/prepare.js +136 -0
  333. package/dist/table/table.d.ts +1 -0
  334. package/dist/{display/columnar → table}/table.js +29 -25
  335. package/dist/{display/columnar → table}/types.d.ts +68 -72
  336. package/dist/table/types.js +3 -0
  337. package/dist/view/coordinator.js +4 -3
  338. package/dist/view/feature-companion.d.ts +13 -7
  339. package/dist/view/feature-companion.js +11 -3
  340. package/dist/view/globe-subdivision.js +3 -3
  341. package/dist/view/layer/attach.d.ts +1 -1
  342. package/dist/view/layer/attach.js +1 -1
  343. package/dist/view/layer/custom-layer.js +40 -11
  344. package/dist/view/layer/display-list.js +2 -1
  345. package/dist/view/layer/drape-planner.d.ts +2 -2
  346. package/dist/view/layer/frame-render.d.ts +3 -3
  347. package/dist/view/layer/frame-render.js +7 -2
  348. package/dist/view/layer/frame-state.d.ts +6 -6
  349. package/dist/view/layer/index.d.ts +2 -2
  350. package/dist/view/layer/index.js +1 -1
  351. package/dist/view/layer/render.d.ts +4 -4
  352. package/dist/view/layer/render.js +3 -8
  353. package/dist/view/layer/renderers.d.ts +2 -2
  354. package/dist/view/layer/renderers.js +1 -1
  355. package/dist/view/layer/slot-manager.d.ts +2 -2
  356. package/dist/view/layer/slot-manager.js +4 -4
  357. package/dist/view/layer/slots.d.ts +2 -2
  358. package/dist/view/layer/slots.js +1 -1
  359. package/dist/view/layer/store-retained-bbox.js +3 -2
  360. package/dist/view/layer/store-retained-classify.d.ts +5 -7
  361. package/dist/view/layer/store-retained-classify.js +19 -7
  362. package/dist/view/layer/store-retained-collect.js +8 -7
  363. package/dist/view/layer/store-retained-coord-patch.d.ts +0 -8
  364. package/dist/view/layer/store-retained-coord-patch.js +13 -4
  365. package/dist/view/layer/store-retained-immediate.d.ts +3 -3
  366. package/dist/view/layer/store-retained-immediate.js +3 -8
  367. package/dist/view/layer/store-retained-invalidation.d.ts +2 -2
  368. package/dist/view/layer/store-retained.d.ts +2 -2
  369. package/dist/view/layer/store-retained.js +1 -1
  370. package/dist/view/renderers/batch-manager.js +8 -7
  371. package/dist/view/renderers/drawer.js +21 -15
  372. package/dist/view/renderers/image.js +13 -39
  373. package/dist/view/renderers/line/line-types.d.ts +3 -3
  374. package/dist/view/renderers/line/sdf-line.js +3 -1
  375. package/dist/view/renderers/point/billboard-depth.js +1 -1
  376. package/dist/view/renderers/point/point-instance.js +1 -1
  377. package/dist/view/renderers/point/point-shape.js +2 -2
  378. package/dist/view/renderers/point/point-style.js +48 -4
  379. package/dist/view/renderers/polygon/batch.js +1 -2
  380. package/dist/view/renderers/polygon/fill.js +3 -1
  381. package/dist/view/renderers/polygon/sdf-polygon.js +2 -3
  382. package/dist/view/renderers/polygon/triangulator.d.ts +1 -1
  383. package/dist/view/renderers/stroke.js +3 -1
  384. package/dist/view/shaders/helpers.d.ts +2 -42
  385. package/dist/view/shaders/helpers.js +0 -6
  386. package/dist/view/shaders/projection.d.ts +15 -7
  387. package/dist/view/shaders/projection.js +23 -6
  388. package/dist/view/shaders/quad.d.ts +16 -12
  389. package/dist/view/shaders/quad.js +34 -13
  390. package/dist/view/style-rule.d.ts +5 -42
  391. package/dist/view/style-rule.js +20 -44
  392. package/dist/view/terrain/binding.d.ts +1 -0
  393. package/dist/view/terrain/binding.js +29 -0
  394. package/dist/view/terrain/context.d.ts +3 -4
  395. package/dist/view/terrain/context.js +4 -5
  396. package/dist/view/terrain/drape/geometry.js +1 -1
  397. package/dist/view/terrain/drape/pass.d.ts +1 -1
  398. package/dist/view/terrain/drape/pass.js +8 -7
  399. package/dist/view/terrain/polygon.d.ts +9 -5
  400. package/dist/view/terrain/polygon.js +16 -2
  401. package/dist/view/terrain/state.d.ts +1 -1
  402. package/dist/view/terrain/state.js +1 -1
  403. package/dist/view/terrain/tessellation.d.ts +2 -2
  404. package/dist/view/terrain/tessellation.js +1 -1
  405. package/dist/view/ui/auxiliary-handles.d.ts +6 -29
  406. package/dist/view/ui/bounds.js +8 -12
  407. package/dist/view/ui/handle-test.js +2 -2
  408. package/dist/view/ui/handle-thinning.js +17 -17
  409. package/dist/view/ui/handles.js +21 -13
  410. package/dist/view/ui/helper.d.ts +1 -1
  411. package/dist/view/ui/helper.js +1 -1
  412. package/dist/view/ui/index.d.ts +1 -1
  413. package/dist/view/ui/selection-scope.js +4 -2
  414. package/dist/view/ui/selection-ui/bounding-box.js +6 -6
  415. package/dist/view/ui/selection-ui/extension-registry.d.ts +31 -20
  416. package/dist/view/ui/selection-ui/extension-registry.js +70 -7
  417. package/dist/view/ui/selection-ui/index.d.ts +2 -2
  418. package/dist/view/ui/selection-ui/index.js +1 -1
  419. package/dist/view/ui/selection-ui/renderer.js +15 -38
  420. package/dist/view/ui/selection-ui/types.d.ts +17 -2
  421. package/dist/view/ui/selection-ui-drawer.d.ts +8 -0
  422. package/dist/view/ui/selection-ui-drawer.js +63 -2
  423. package/dist/view/ui/tentative.js +1 -1
  424. package/dist/webgl/index.d.ts +65 -0
  425. package/dist/webgl/index.js +62 -0
  426. package/package.json +20 -9
  427. package/dist/api/api.d.ts +0 -1259
  428. package/dist/api/api.js +0 -86
  429. package/dist/api/context.d.ts +0 -173
  430. package/dist/api/display-api.js +0 -23
  431. package/dist/api/event-api.d.ts +0 -13
  432. package/dist/api/event-api.js +0 -17
  433. package/dist/api/extension-api.d.ts +0 -46
  434. package/dist/api/extension-api.js +0 -85
  435. package/dist/api/feature-api.d.ts +0 -11
  436. package/dist/api/feature-api.js +0 -101
  437. package/dist/api/geometry/apply.d.ts +0 -51
  438. package/dist/api/geometry/boolean.d.ts +0 -28
  439. package/dist/api/geometry/boolean.js +0 -65
  440. package/dist/api/geometry/types.d.ts +0 -31
  441. package/dist/api/geometry-operations.d.ts +0 -162
  442. package/dist/api/geometry-operations.js +0 -94
  443. package/dist/api/group-api.d.ts +0 -10
  444. package/dist/api/group-api.js +0 -78
  445. package/dist/api/import-export/constants.d.ts +0 -29
  446. package/dist/api/import-export/constants.js +0 -40
  447. package/dist/api/import-export/file-name.d.ts +0 -10
  448. package/dist/api/import-export/file-name.js +0 -20
  449. package/dist/api/import-export/geojson-export.d.ts +0 -19
  450. package/dist/api/import-export/image-import.d.ts +0 -12
  451. package/dist/api/import-export/image-import.js +0 -53
  452. package/dist/api/import-export/index.d.ts +0 -9
  453. package/dist/api/import-export/index.js +0 -107
  454. package/dist/api/import-export/native-format.d.ts +0 -15
  455. package/dist/api/import-export/style-validation.d.ts +0 -27
  456. package/dist/api/import-export/style-validation.js +0 -49
  457. package/dist/api/import-export/types.d.ts +0 -26
  458. package/dist/api/index.d.ts +0 -15
  459. package/dist/api/index.js +0 -3
  460. package/dist/api/input-api.d.ts +0 -158
  461. package/dist/api/input-api.js +0 -144
  462. package/dist/api/instance-api.d.ts +0 -38
  463. package/dist/api/instance-api.js +0 -136
  464. package/dist/api/layer-api.d.ts +0 -12
  465. package/dist/api/layer-api.js +0 -62
  466. package/dist/api/selection-api.d.ts +0 -7
  467. package/dist/api/selection-api.js +0 -78
  468. package/dist/api/snapping-api.d.ts +0 -125
  469. package/dist/api/snapping-api.js +0 -50
  470. package/dist/api/topology-api.d.ts +0 -30
  471. package/dist/api/topology-api.js +0 -16
  472. package/dist/api/tracing-api.d.ts +0 -31
  473. package/dist/api/tracing-api.js +0 -16
  474. package/dist/dispatcher/hit-test/index.d.ts +0 -14
  475. package/dist/dispatcher/hit-test/index.js +0 -9
  476. package/dist/dispatcher/index.d.ts +0 -15
  477. package/dist/dispatcher/index.js +0 -3
  478. package/dist/display/columnar/index.d.ts +0 -12
  479. package/dist/display/columnar/index.js +0 -13
  480. package/dist/display/columnar/prepare.d.ts +0 -42
  481. package/dist/display/columnar/prepare.js +0 -116
  482. package/dist/display/index.d.ts +0 -13
  483. package/dist/display/types.js +0 -43
  484. package/dist/maplibre-gl-draw.d.ts +0 -47
  485. package/dist/modes/cursor.js +0 -72
  486. package/dist/modes/index.d.ts +0 -7
  487. package/dist/operations/index.d.ts +0 -9
  488. package/dist/operations/index.js +0 -3
  489. package/dist/plugins/index.d.ts +0 -10
  490. package/dist/plugins/mutation-hooks.d.ts +0 -28
  491. package/dist/plugins/mutation-hooks.js +0 -84
  492. package/dist/plugins/plugin-context.js +0 -367
  493. package/dist/plugins/plugin-manager.d.ts +0 -103
  494. package/dist/plugins/plugin-manager.js +0 -316
  495. package/dist/plugins/plugin.d.ts +0 -529
  496. package/dist/shared/config/index.d.ts +0 -17
  497. package/dist/shared/config/index.js +0 -8
  498. package/dist/shared/utils/index.d.ts +0 -15
  499. package/dist/shared/utils/index.js +0 -24
  500. package/dist/snapping/index.d.ts +0 -14
  501. package/dist/snapping/index.js +0 -4
  502. package/dist/store/change-merger.js +0 -102
  503. package/dist/store/event-bridge.js +0 -161
  504. package/dist/store/index.d.ts +0 -12
  505. package/dist/store/index.js +0 -4
  506. package/dist/view/index.d.ts +0 -47
  507. package/dist/view/index.js +0 -20
  508. /package/dist/api/{geometry/types.js → datasets.js} +0 -0
  509. /package/dist/api/{import-export/types.js → document.js} +0 -0
  510. /package/dist/{display/columnar/types.js → api/drawing.js} +0 -0
  511. /package/dist/{display/index.js → api/events.js} +0 -0
  512. /package/dist/{modes/index.js → api/extension/context.js} +0 -0
  513. /package/dist/{plugins/index.js → api/extension/feature-type.js} +0 -0
  514. /package/dist/{plugins/plugin.js → api/extension/mode.js} +0 -0
  515. /package/dist/api/{display-api.d.ts → impl/adapters.d.ts} +0 -0
  516. /package/dist/{display/columnar/source.d.ts → api/impl/contexts.d.ts} +0 -0
  517. /package/dist/{display/columnar/table.d.ts → api/impl/create-draw.d.ts} +0 -0
  518. /package/dist/{display/interaction.d.ts → api/impl/datasets.d.ts} +0 -0
  519. /package/dist/{display/manager.d.ts → api/impl/destroy-guard.d.ts} +0 -0
  520. /package/dist/{display/packed-rtree.d.ts → api/impl/document.d.ts} +0 -0
  521. /package/dist/{display/partition.d.ts → api/impl/drawing.d.ts} +0 -0
  522. /package/dist/{display/provider.d.ts → api/impl/engine.d.ts} +0 -0
  523. /package/dist/{display/source.d.ts → api/impl/events.d.ts} +0 -0
  524. /package/dist/{display/spatial.d.ts → api/impl/extension-host.d.ts} +0 -0
  525. /package/dist/{display/style.d.ts → api/impl/extensions.d.ts} +0 -0
  526. /package/dist/{display/triangulation.d.ts → api/impl/features.d.ts} +0 -0
  527. /package/dist/{modes/cursor.d.ts → api/impl/geometry/types.d.ts} +0 -0
  528. /package/dist/{plugins/plugin-context.d.ts → api/impl/hidden.d.ts} +0 -0
  529. /package/dist/api/{import-export → impl/import-export}/embedded-file.d.ts +0 -0
  530. /package/dist/api/{import-export → impl/import-export}/own-property.d.ts +0 -0
  531. /package/dist/api/{import-export → impl/import-export}/own-property.js +0 -0
  532. /package/dist/{store/change-merger.d.ts → api/impl/input.d.ts} +0 -0
  533. /package/dist/{store/event-bridge.d.ts → api/impl/layers.d.ts} +0 -0
  534. /package/dist/{display → dataset}/chunk-set.d.ts +0 -0
  535. /package/dist/{display → dataset}/chunk-set.js +0 -0
  536. /package/dist/{display → dataset}/dataset.d.ts +0 -0
  537. /package/dist/{display → dataset}/manager.js +0 -0
  538. /package/dist/{display → dataset}/provider.js +0 -0
  539. /package/dist/{display → dataset}/selection.d.ts +0 -0
  540. /package/dist/{display → dataset}/selection.js +0 -0
@@ -14,7 +14,7 @@ import { buildFrameState, StyleZoom } from './frame-state.js';
14
14
  import { createRenderScope } from './render-scope.js';
15
15
  import { disposeRenderers, initRenderers } from './renderers.js';
16
16
  import { SlotManager } from './slot-manager.js';
17
- import { renderSlotLayerId } from './slots.js';
17
+ import { slotLayerId } from './slots.js';
18
18
  import { StoreRetainedCache } from './store-retained.js';
19
19
  import { isOpacityOnlyLayersChange } from './store-retained-invalidation.js';
20
20
  import { TerrainResolver } from './terrain-resolver.js';
@@ -66,7 +66,10 @@ export function createCustomLayer(deps) {
66
66
  store,
67
67
  terrain: terrainContext,
68
68
  datasets,
69
- timeSlicing: renderingConfig.timeSlicing,
69
+ // Read at each build, so a change of the rendering switches applies to the next one
70
+ get timeSlicing() {
71
+ return renderingConfig.timeSlicing;
72
+ },
70
73
  });
71
74
  const styleZoom = new StyleZoom();
72
75
  const slots = new SlotManager({
@@ -94,6 +97,14 @@ export function createCustomLayer(deps) {
94
97
  // Changes made while the layer was off the map were not seen
95
98
  displayList.invalidate();
96
99
  engine.unsubscribeStore = store.subscribe((changes) => {
100
+ // A replacement of the whole document drops every cache of the features, whatever the
101
+ // notification lists (the new document can reuse an ID with another shape)
102
+ if (changes.reset === true) {
103
+ renderScope.earcut.clear();
104
+ renderScope.styleRules.clear();
105
+ terrainContext.fillCache.clear();
106
+ engine.storeRetainedCache?.invalidateAll();
107
+ }
97
108
  engine.storeRetainedCache?.applyChanges(changes);
98
109
  displayList.applyChanges(changes);
99
110
  // The binning of the analytic drape is rebuilt only on a change of the geometry, the style,
@@ -293,7 +304,7 @@ export function createCustomLayer(deps) {
293
304
  // renderer; see shaders/frame.ts)
294
305
  beginRenderFrame();
295
306
  // While the camera is moving, the re-baking of the retained batches is deferred (read by
296
- // display/chunk-set.ts)
307
+ // dataset/chunk-set.ts)
297
308
  setTerrainCameraMoving(terrainContext, map?.isMoving?.() === true || map?.isZooming?.() === true);
298
309
  // The zoom that the rendering reads is the style zoom (a value that absorbs the steps of the
299
310
  // elevation settlement; frame-state.ts). The position of the camera (the altitude in meters)
@@ -319,7 +330,7 @@ export function createCustomLayer(deps) {
319
330
  // The cells the globe cuts the geometry into (none on a flat map; globe-subdivision.ts)
320
331
  updateGlobeSubdivision(terrainContext, renderOptions.defaultProjectionData.projectionTransition ?? 0, rawZoom);
321
332
  // Follow the changes of the rendering pixel ratio (moving to another display, or
322
- // draw.setRenderScale()). The widths of the already baked retained batches no longer match
333
+ // draw.setScaleFactor()). The widths of the already baked retained batches no longer match
323
334
  // when the ratio changes, so they are discarded.
324
335
  const dpr = resolvePixelRatio(pixelRatio);
325
336
  if (engine.builtPixelRatio !== dpr) {
@@ -389,7 +400,7 @@ export function createCustomLayer(deps) {
389
400
  /** Creates the CustomLayer of the slot at `index` (the first one is customLayer itself) */
390
401
  function makeSlotLayer(index) {
391
402
  return {
392
- id: renderSlotLayerId(index),
403
+ id: slotLayerId(index),
393
404
  type: 'custom',
394
405
  renderingMode: '3d',
395
406
  onAdd(mapInstance, glContext) {
@@ -412,7 +423,7 @@ export function createCustomLayer(deps) {
412
423
  return false;
413
424
  }
414
425
  const customLayer = {
415
- id: renderSlotLayerId(0),
426
+ id: slotLayerId(0),
416
427
  type: 'custom',
417
428
  renderingMode: '3d',
418
429
  onAdd(mapInstance, glContext) {
@@ -436,7 +447,7 @@ export function createCustomLayer(deps) {
436
447
  onRemove() {
437
448
  engineRemove();
438
449
  },
439
- addOverlayRenderer(renderer) {
450
+ addOverlay(renderer) {
440
451
  dynamicOverlayRenderers.push(renderer);
441
452
  // An element involved in the rendering was added, so the prepared retained batches are
442
453
  // rebuilt
@@ -445,9 +456,9 @@ export function createCustomLayer(deps) {
445
456
  if (engine.renderers && engine.gl && engine.mapInstance) {
446
457
  renderer.onAdd(engine.gl, engine.mapInstance);
447
458
  }
448
- return () => customLayer.removeOverlayRenderer(renderer);
459
+ return () => customLayer.removeOverlay(renderer);
449
460
  },
450
- removeOverlayRenderer(renderer) {
461
+ removeOverlay(renderer) {
451
462
  const index = dynamicOverlayRenderers.indexOf(renderer);
452
463
  if (index === -1)
453
464
  return;
@@ -481,8 +492,8 @@ export function createCustomLayer(deps) {
481
492
  engine.mapInstance?.triggerRepaint();
482
493
  };
483
494
  },
484
- getRenderSlots() {
485
- return slots.getRenderSlots();
495
+ getStackSlots() {
496
+ return slots.getStackSlots();
486
497
  },
487
498
  getSlotLayers() {
488
499
  return slots.getSlotLayers();
@@ -490,6 +501,9 @@ export function createCustomLayer(deps) {
490
501
  getTerrainContext() {
491
502
  return terrainContext;
492
503
  },
504
+ getGL() {
505
+ return engine.renderers ? engine.gl : null;
506
+ },
493
507
  hasPendingWork() {
494
508
  if (drape.hasPendingWork)
495
509
  return true;
@@ -501,6 +515,21 @@ export function createCustomLayer(deps) {
501
515
  }
502
516
  return false;
503
517
  },
518
+ refresh() {
519
+ renderScope.earcut.clear();
520
+ renderScope.styleRules.clear();
521
+ displayList.invalidate();
522
+ drape.invalidate();
523
+ if (!engine.mapInstance)
524
+ return;
525
+ // The renderers and the retained batches read the configuration when they are built
526
+ if (engine.renderers) {
527
+ releaseGpuResources();
528
+ buildGpuResources();
529
+ }
530
+ slots.sync();
531
+ engine.mapInstance.triggerRepaint();
532
+ },
504
533
  };
505
534
  // The first slot is customLayer itself. When there are separators, the following slots are
506
535
  // prepared here (the host adds them to the map in order from the first)
@@ -90,7 +90,8 @@ export class DisplayListCache {
90
90
  changes.groups !== undefined ||
91
91
  changes.layerReorder !== undefined ||
92
92
  changes.groupReorder !== undefined ||
93
- changes.uiStateChanged === true) {
93
+ changes.uiStateChanged === true ||
94
+ changes.reset === true) {
94
95
  this.invalidate();
95
96
  }
96
97
  }
@@ -92,8 +92,8 @@ export interface DrapePlannerDataset extends DrapeDatasetSource {
92
92
  /**
93
93
  * The datasets as the planner sees them
94
94
  *
95
- * The manager in `display/manager.ts` satisfies this shape. Only the structure is declared here,
96
- * so that the planner does not read a type from display/ (which sits above view/).
95
+ * The manager in `dataset/manager.ts` satisfies this shape. Only the structure is declared here,
96
+ * so that the planner does not read a type from dataset/ (which sits above view/).
97
97
  */
98
98
  export interface DrapePlannerDatasets {
99
99
  listInternal(): readonly DrapePlannerDataset[];
@@ -8,7 +8,7 @@
8
8
  * set and restored through gl-state.ts.
9
9
  */
10
10
  import type { Map as MapLibreMap } from 'maplibre-gl';
11
- import type { CustomFeatureHandler } from '../../extension/index.js';
11
+ import type { FeatureTypeHandler } from '../../extension/index.js';
12
12
  import type { Store } from '../../store/store.js';
13
13
  import type { FeatureCompanionRegistry } from '../feature-companion.js';
14
14
  import type { TerrainContext } from '../terrain/context.js';
@@ -20,7 +20,7 @@ import type { Renderers } from './renderers.js';
20
20
  import type { StoreRetainedCache } from './store-retained.js';
21
21
  /**
22
22
  * The datasets as the per-layer rendering takes them (the type is owned by
23
- * render.ts, so this file does not read a type from display/)
23
+ * render.ts, so this file does not read a type from dataset/)
24
24
  */
25
25
  type RenderedDatasets = Parameters<typeof renderLayers>[10];
26
26
  /** What the drawing of a frame reads (the engine of the layer, while its GPU side exists) */
@@ -31,7 +31,7 @@ export interface FrameRenderDeps {
31
31
  store: Store;
32
32
  terrainContext: TerrainContext;
33
33
  drape: DrapePlanner;
34
- customRenderers: Map<string, CustomFeatureHandler['renderer']>;
34
+ customRenderers: Map<string, FeatureTypeHandler['renderer']>;
35
35
  featureCompanions: FeatureCompanionRegistry;
36
36
  datasets?: RenderedDatasets;
37
37
  storeRetainedCache: StoreRetainedCache | null;
@@ -2,7 +2,7 @@
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { isInteractionBlocked } from '../../store/lock.js';
4
4
  import { setDrapePaintedDatasets, setQuadDrapeFrame, setTerrainRenderState, setTerrainShadeLight, setTerrainSurfacesFlattened, } from '../terrain/state.js';
5
- import { renderFollowedVertices, renderSelectionUI } from '../ui/selection-ui-drawer.js';
5
+ import { renderFollowedVertices, renderGlobalAuxiliaryHandles, renderSelectionUI, } from '../ui/selection-ui-drawer.js';
6
6
  import { applyDrapeGlState, applySegmentDepthState, applySegmentGlState, enterSymbolGlState, restoreSegmentGlState, resumeDrapeGlState, } from './gl-state.js';
7
7
  import { renderLayers } from './render.js';
8
8
  /** Makes the renderers draw on one copy of the world */
@@ -156,11 +156,16 @@ export function renderForeground(deps, f) {
156
156
  };
157
157
  const tentative = store.getTentative();
158
158
  const boxSelection = store.getBoxSelection();
159
+ const globalHandlesShown = store.getMode() === 'select' && !store.isReadOnly() && !store.isInteractionLocked();
159
160
  // Once per copy of the world in view (the selection UI of a feature on the other side of the
160
161
  // antimeridian is drawn on the copy the feature is drawn on)
161
162
  for (const copy of f.copies) {
162
163
  applyCopy(deps, copy);
163
- renderSelectionUI(copy.selectedFeatures, f.zoom, copy.projectionData, selectionUIDeps, store.getDragState(), store.getSelectedVertices(), selectionLocked);
164
+ renderSelectionUI(copy.selectedFeatures, f.zoom, copy.projectionData, selectionUIDeps, store.getDragState(), store.getVertexSelection(), selectionLocked);
165
+ // The handles of the extensions that belong to no feature, while they can be grabbed
166
+ if (globalHandlesShown) {
167
+ renderGlobalAuxiliaryHandles(f.zoom, copy.projectionData, selectionUIDeps, store.getDragState());
168
+ }
164
169
  // The vertices that follow along when a shared vertex is moved (raised only during a
165
170
  // drag). The features that follow are not selected, so they are drawn separately from the
166
171
  // selection UI.
@@ -8,7 +8,7 @@
8
8
  * drawing of the slots is in frame-render.ts.
9
9
  */
10
10
  import type { CustomRenderMethodInput, Map as MapLibreMap } from 'maplibre-gl';
11
- import type { CustomOverlayRenderer, CustomRendererDrawContext, LayerAwareOverlayRenderer } from '../../extension/index.js';
11
+ import type { EngineOverlayRenderer, FrameDrawContext, LayeredOverlayRenderer } from '../../extension/index.js';
12
12
  import type { Store } from '../../store/store.js';
13
13
  import type { Feature } from '../../store/types.js';
14
14
  import { type OffsetUniforms } from '../shaders/helpers.js';
@@ -37,7 +37,7 @@ export interface CopyPass {
37
37
  readonly view: RenderLayersView | undefined;
38
38
  readonly projectionData: CustomRenderMethodInput['defaultProjectionData'];
39
39
  readonly offsetUniforms: OffsetUniforms;
40
- readonly customRendererContext: CustomRendererDrawContext;
40
+ readonly customRendererContext: FrameDrawContext;
41
41
  /** The features drawn in immediate mode on this copy */
42
42
  readonly features: Feature[];
43
43
  /** The selected features whose selection UI is drawn on this copy */
@@ -72,9 +72,9 @@ export interface FrameState {
72
72
  readonly features: Feature[];
73
73
  readonly selectedIdSet: Set<string>;
74
74
  readonly selectedFeatures: Feature[];
75
- readonly customRendererContext: CustomRendererDrawContext;
76
- readonly layerAwareRenderers: LayerAwareOverlayRenderer[];
77
- readonly otherRenderers: CustomOverlayRenderer[];
75
+ readonly customRendererContext: FrameDrawContext;
76
+ readonly layerAwareRenderers: LayeredOverlayRenderer[];
77
+ readonly otherRenderers: EngineOverlayRenderer[];
78
78
  readonly quadDrapeFrame: QuadDrapeFrame | null;
79
79
  readonly restoreBlendState: () => void;
80
80
  /** Whether the drape can be drawn (the shaders and the plan are ready) */
@@ -116,7 +116,7 @@ export interface FrameBuildInput {
116
116
  terrainState: TerrainRenderState;
117
117
  /** Whether the retained batches of the Store rendering exist */
118
118
  retainedAvailable: boolean;
119
- overlayRenderers: readonly CustomOverlayRenderer[];
119
+ overlayRenderers: readonly EngineOverlayRenderer[];
120
120
  segments: readonly RenderSegment[];
121
121
  }
122
122
  /**
@@ -2,5 +2,5 @@ export type { BlendCapableGL } from './blend.js';
2
2
  export { applyDrawBlendState } from './blend.js';
3
3
  export type { CustomLayerDeps, CustomLayerInterface } from './custom-layer.js';
4
4
  export { createCustomLayer } from './custom-layer.js';
5
- export type { RenderSegment, RenderSlot } from './slots.js';
6
- export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, renderSlotLayerId } from './slots.js';
5
+ export type { RenderSegment, StackSlot } from './slots.js';
6
+ export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, slotLayerId } from './slots.js';
@@ -2,4 +2,4 @@
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  export { applyDrawBlendState } from './blend.js';
4
4
  export { createCustomLayer } from './custom-layer.js';
5
- export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, renderSlotLayerId } from './slots.js';
5
+ export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, slotLayerId } from './slots.js';
@@ -4,8 +4,8 @@
4
4
  * The per-layer rendering loop called from CustomLayer's render()
5
5
  */
6
6
  import type { ProjectionData } from 'maplibre-gl';
7
- import type { DatasetManager } from '../../display/manager.js';
8
- import type { CustomFeatureHandler, CustomRendererDrawContext, LayerAwareOverlayRenderer } from '../../extension/index.js';
7
+ import type { DatasetManager } from '../../dataset/manager.js';
8
+ import type { FeatureTypeHandler, FrameDrawContext, LayeredOverlayRenderer } from '../../extension/index.js';
9
9
  import type { Store } from '../../store/store.js';
10
10
  import type { BoundingBox, Feature, Layer } from '../../store/types.js';
11
11
  import type { FeatureCompanionRegistry } from '../feature-companion.js';
@@ -55,7 +55,7 @@ import type { StoreRetainedCache } from './store-retained.js';
55
55
  * of the ViewportFilter when omitted). A view across the antimeridian is drawn once per
56
56
  * copy, each with its own range
57
57
  */
58
- export declare function renderLayers(r: Renderers, store: Store, features: Feature[], selectedIdSet: Set<string>, defaultProjectionData: ProjectionData, zoom: number, customRenderers: Map<string, CustomFeatureHandler['renderer']>, customRendererContext: CustomRendererDrawContext, companions: FeatureCompanionRegistry, layerAwareRenderers: LayerAwareOverlayRenderer[], datasets?: DatasetManager, storeRetained?: StoreRetainedCache, restoreBlendState?: () => void, range?: RenderLayersRange, view?: RenderLayersView): void;
58
+ export declare function renderLayers(r: Renderers, store: Store, features: Feature[], selectedIdSet: Set<string>, defaultProjectionData: ProjectionData, zoom: number, customRenderers: Map<string, FeatureTypeHandler['renderer']>, customRendererContext: FrameDrawContext, companions: FeatureCompanionRegistry, layerAwareRenderers: LayeredOverlayRenderer[], datasets?: DatasetManager, storeRetained?: StoreRetainedCache, restoreBlendState?: () => void, range?: RenderLayersRange, view?: RenderLayersView): void;
59
59
  /**
60
60
  * The context of the custom renderers for one layer (the context of the frame with the opacity
61
61
  * of the layer)
@@ -63,7 +63,7 @@ export declare function renderLayers(r: Renderers, store: Store, features: Featu
63
63
  * The same object is returned when the opacity is already the one of the context, so a map whose
64
64
  * layers are all opaque allocates nothing per layer.
65
65
  */
66
- export declare function layerRendererContext(base: CustomRendererDrawContext, layer: Layer): CustomRendererDrawContext;
66
+ export declare function layerRendererContext(base: FrameDrawContext, layer: Layer): FrameDrawContext;
67
67
  /**
68
68
  * The part of the view one rendering covers (one copy of the world)
69
69
  */
@@ -2,6 +2,7 @@
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
3
  import { drawFeatureCompanionsInFrame } from '../feature-companion.js';
4
4
  import { layerDrawFactors } from '../renderers/draw-factors.js';
5
+ import { customRendererOf } from './store-retained-classify.js';
5
6
  /**
6
7
  * Draw features and overlays layer by layer
7
8
  *
@@ -131,20 +132,14 @@ export function renderLayers(r, store, features, selectedIdSet, defaultProjectio
131
132
  // Companion drawing (feature companion): drawn right before the feature itself, that is,
132
133
  // one z below it. If no provider at all is registered, not even has is called.
133
134
  drawFeatureCompanionsInFrame(companions, feature, r.batchManager, defaultProjectionData, zoom, layer, layerContext, restoreBlendState);
134
- const customRenderer = customRenderers.get(feature.type);
135
+ const customRenderer = customRendererOf(customRenderers, feature);
135
136
  if (customRenderer) {
136
137
  // To keep the draw order (painter's algorithm), the core batch that has accumulated is
137
138
  // flushed first and only then the custom feature is drawn immediately.
138
139
  // A batch is not painted until endFrame, so without flushing here a custom feature
139
140
  // would ignore layer.order and be drawn before the core features of the same layer.
140
141
  r.batchManager.endFrame();
141
- customRenderer.draw({
142
- id: feature.id,
143
- type: feature.type,
144
- coordinates: feature.coordinates,
145
- properties: feature.properties,
146
- style: feature.style,
147
- }, defaultProjectionData, zoom, layerContext);
142
+ customRenderer.draw(feature, defaultProjectionData, zoom, layerContext);
148
143
  // Re-establish the blend state that the external renderer may have rewritten.
149
144
  restoreBlendState?.();
150
145
  // Restart the batch for the core features that follow.
@@ -4,7 +4,7 @@
4
4
  * Lifecycle management of every renderer that CustomLayer uses
5
5
  */
6
6
  import type { Map as MapLibreMap } from 'maplibre-gl';
7
- import type { CustomFeatureHandler } from '../../extension/index.js';
7
+ import type { FeatureTypeHandler } from '../../extension/index.js';
8
8
  import type { FeatureStyleConfig } from '../../shared/config/feature-style.js';
9
9
  import type { RenderingConfig } from '../../shared/config/rendering.js';
10
10
  import type { SelectionUIConfig } from '../../shared/config/selection.js';
@@ -63,7 +63,7 @@ export interface InitRenderersDeps {
63
63
  featureStyle: FeatureStyleConfig;
64
64
  selectionConfig: SelectionUIConfig;
65
65
  renderingConfig: RenderingConfig;
66
- customFeatureHandlers: CustomFeatureHandler[] | undefined;
66
+ customFeatureHandlers: FeatureTypeHandler[] | undefined;
67
67
  /** Injected rendering pixel ratio (when omitted, read from window every time) */
68
68
  pixelRatio?: PixelRatioInput;
69
69
  /** The state and the caches owned by the draw instance (never shared between instances) */
@@ -24,7 +24,7 @@ export function initRenderers(deps) {
24
24
  const { gl, map: mapInstance, store, spatialIndex, featureStyle, selectionConfig, renderingConfig, customFeatureHandlers, pixelRatio, scope, onImageError, } = deps;
25
25
  const textureCache = new TextureCache(gl);
26
26
  const terrain = scope.terrain;
27
- const quadShader = new QuadShader(gl, terrain);
27
+ const quadShader = new QuadShader(gl).useTerrainState(terrain);
28
28
  const imageRenderer = new ImageRenderer(mapInstance, gl, textureCache, quadShader, (fileId) => store.getFile(fileId), onImageError);
29
29
  const strokeRenderer = new StrokeRenderer(mapInstance, gl, pixelRatio, terrain);
30
30
  const sdfLineRenderer = new SDFLineRenderer(mapInstance, gl, pixelRatio, terrain);
@@ -9,7 +9,7 @@
9
9
  * docs/internals/rendering.md ("Slots and separators").
10
10
  */
11
11
  import type { CustomLayerInterface, Map as MapLibreMap } from 'maplibre-gl';
12
- import { type RenderSlot } from './slots.js';
12
+ import { type StackSlot } from './slots.js';
13
13
  /** What the manager needs */
14
14
  export interface SlotManagerDeps {
15
15
  map: Pick<MapLibreMap, 'getLayer' | 'addLayer' | 'removeLayer'> & {
@@ -20,7 +20,7 @@ export interface SlotManagerDeps {
20
20
  /** Predicate that identifies the separators (always false when omitted = a single slot) */
21
21
  isExternalEntry?: (entryId: string) => boolean;
22
22
  /** Where the changes of the slots and of the segments are notified */
23
- onSlotsChange?: (slots: RenderSlot[]) => void;
23
+ onSlotsChange?: (slots: StackSlot[]) => void;
24
24
  /** Creates the CustomLayer of the slot at `index` (index 1 onwards) */
25
25
  createSlotLayer: (index: number) => CustomLayerInterface;
26
26
  }
@@ -1,6 +1,6 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
- import { partitionLayerOrder, renderSlotLayerId, sameSegments, } from './slots.js';
3
+ import { partitionLayerOrder, sameSegments, slotLayerId, } from './slots.js';
4
4
  /**
5
5
  * The slots of one draw instance
6
6
  *
@@ -77,9 +77,9 @@ export class SlotManager {
77
77
  return this.added === 0;
78
78
  }
79
79
  /** The list of slots (public form) */
80
- getRenderSlots() {
80
+ getStackSlots() {
81
81
  return this.currentSegments.map((segment, index) => ({
82
- layerId: this.slotLayers[index]?.id ?? renderSlotLayerId(index),
82
+ layerId: this.slotLayers[index]?.id ?? slotLayerId(index),
83
83
  from: segment.from,
84
84
  to: segment.to,
85
85
  }));
@@ -118,7 +118,7 @@ export class SlotManager {
118
118
  map.removeLayer(slot.id);
119
119
  }
120
120
  }
121
- onSlotsChange?.(this.getRenderSlots());
121
+ onSlotsChange?.(this.getStackSlots());
122
122
  map.triggerRepaint?.();
123
123
  }
124
124
  /** Whether the map has that layer (always false while the style is not loaded) */
@@ -8,7 +8,7 @@
8
8
  * a native layer can be placed in between our own rendering only once the slots are split per
9
9
  * segment. The design is in docs/internals/rendering.md, "Slots and separators".
10
10
  */
11
- export type { RenderSlot } from '../../shared/types/events.js';
11
+ export type { StackSlot } from '../../shared/types/events.js';
12
12
  /** A segment ([from, to) in layerOrder) */
13
13
  export interface RenderSegment {
14
14
  readonly from: number;
@@ -17,7 +17,7 @@ export interface RenderSegment {
17
17
  /** Layer id of the first slot (keeps the same id as the single layer used before) */
18
18
  export declare const PRIMARY_RENDER_LAYER_ID = "maplibre-gl-draw-layer";
19
19
  /** Layer id of the slot at `index` */
20
- export declare function renderSlotLayerId(index: number): string;
20
+ export declare function slotLayerId(index: number): string;
21
21
  /**
22
22
  * Split the stacking order into segments at the separators
23
23
  *
@@ -3,7 +3,7 @@
3
3
  /** Layer id of the first slot (keeps the same id as the single layer used before) */
4
4
  export const PRIMARY_RENDER_LAYER_ID = 'maplibre-gl-draw-layer';
5
5
  /** Layer id of the slot at `index` */
6
- export function renderSlotLayerId(index) {
6
+ export function slotLayerId(index) {
7
7
  return index === 0 ? PRIMARY_RENDER_LAYER_ID : `${PRIMARY_RENDER_LAYER_ID}:${index}`;
8
8
  }
9
9
  /**
@@ -9,6 +9,7 @@
9
9
  */
10
10
  import { circleBoundingBox } from '../../geometry/circle.js';
11
11
  import { DEFAULT_TILE_SIZE } from '../../shared/math/index.js';
12
+ import { coordinatesOf } from '../../shared/utils/coordinates.js';
12
13
  import { getCircleRadius } from '../../shared/utils/property.js';
13
14
  import { getBoundingBox } from '../../store/spatial/index.js';
14
15
  /**
@@ -170,7 +171,7 @@ export function computeFeaturesBBox(features, extensions) {
170
171
  }
171
172
  if (feature.type === 'Circle') {
172
173
  const radiusMeters = getCircleRadius(feature);
173
- const center = feature.coordinates;
174
+ const center = coordinatesOf(feature);
174
175
  if (radiusMeters && radiusMeters > 0 && typeof center?.[0] === 'number') {
175
176
  // The box of the geodesic circle, whose east and west extremes lie poleward of due
176
177
  // east and west; it contains the polygon used for drawing (generateCirclePolygon).
@@ -182,7 +183,7 @@ export function computeFeaturesBBox(features, extensions) {
182
183
  }
183
184
  }
184
185
  }
185
- walkCoordinates(feature.coordinates, visit);
186
+ walkCoordinates(coordinatesOf(feature), visit);
186
187
  }
187
188
  return found ? [minLng, minLat, maxLng, maxLat] : null;
188
189
  }
@@ -1,10 +1,3 @@
1
- /**
2
- * Classification of the Store features into runs
3
- *
4
- * A run is a sequence of features that the BatchManager of immediate mode would draw in one
5
- * batch. Cutting the feature list where the kind changes keeps the z-order of retained mode
6
- * identical to immediate mode.
7
- */
8
1
  import type { Feature, Layer } from '../../store/types.js';
9
2
  import type { FeatureCompanionRegistry } from '../feature-companion.js';
10
3
  import { type PointShape } from '../renderers/point/point-instance.js';
@@ -16,6 +9,11 @@ import type { RetainedStyleResolver } from '../renderers/retained.js';
16
9
  * batch kind and the point shape). A position where the kind changes becomes a run boundary.
17
10
  */
18
11
  export type RunKind = 'polygon' | 'line' | `point-${PointShape}` | 'immediate';
12
+ /**
13
+ * The custom renderer that draws a feature: the one registered for its type, unless it
14
+ * refuses the feature, which the built-in drawing of the type then draws
15
+ */
16
+ export declare function customRendererOf<R>(customTypes: ReadonlyMap<string, R>, feature: Feature): R | undefined;
19
17
  /**
20
18
  * Classifies a feature into the kind of its run
21
19
  *
@@ -1,6 +1,18 @@
1
1
  // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
2
  // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { coordinatesOf } from '../../shared/utils/coordinates.js';
3
4
  import { toInstancedPointShape } from '../renderers/point/point-instance.js';
5
+ /**
6
+ * The custom renderer that draws a feature: the one registered for its type, unless it
7
+ * refuses the feature, which the built-in drawing of the type then draws
8
+ */
9
+ export function customRendererOf(customTypes, feature) {
10
+ const renderer = customTypes.get(feature.type);
11
+ if (renderer === undefined)
12
+ return undefined;
13
+ const { appliesTo } = renderer;
14
+ return appliesTo && !appliesTo.call(renderer, feature) ? undefined : renderer;
15
+ }
4
16
  /**
5
17
  * Classifies a feature into the kind of its run
6
18
  *
@@ -13,7 +25,7 @@ import { toInstancedPointShape } from '../renderers/point/point-instance.js';
13
25
  */
14
26
  export function classifyFeature(feature, styles, customTypes, companions, layer) {
15
27
  // A custom type is drawn immediately (it cannot go on a core batch)
16
- if (customTypes.has(feature.type))
28
+ if (customRendererOf(customTypes, feature))
17
29
  return 'immediate';
18
30
  // A feature that has a companion (feature companion) needs a hook right before it, so it cannot
19
31
  // go on a retained batch. It is split out into an immediate chunk and drawn one at a time (on
@@ -59,29 +71,29 @@ export function featureOrigin(feature) {
59
71
  return [0, 0];
60
72
  switch (feature.type) {
61
73
  case 'MultiPoint': {
62
- const coord = feature.coordinates[0];
74
+ const coord = coordinatesOf(feature)[0];
63
75
  return coord ? [coord[0], coord[1]] : [0, 0];
64
76
  }
65
77
  case 'LineString':
66
78
  case 'Freehand': {
67
- const coord = feature.coordinates[0];
79
+ const coord = coordinatesOf(feature)[0];
68
80
  return coord ? [coord[0], coord[1]] : [0, 0];
69
81
  }
70
82
  case 'MultiLineString': {
71
- const coord = feature.coordinates[0]?.[0];
83
+ const coord = coordinatesOf(feature)[0]?.[0];
72
84
  return coord ? [coord[0], coord[1]] : [0, 0];
73
85
  }
74
86
  case 'Polygon': {
75
- const coord = feature.coordinates[0]?.[0];
87
+ const coord = coordinatesOf(feature)[0]?.[0];
76
88
  return coord ? [coord[0], coord[1]] : [0, 0];
77
89
  }
78
90
  case 'MultiPolygon': {
79
- const coord = feature.coordinates[0]?.[0]?.[0];
91
+ const coord = coordinatesOf(feature)[0]?.[0]?.[0];
80
92
  return coord ? [coord[0], coord[1]] : [0, 0];
81
93
  }
82
94
  default: {
83
95
  // A single coordinate, such as Point / Circle
84
- const coord = feature.coordinates;
96
+ const coord = coordinatesOf(feature);
85
97
  return Array.isArray(coord) && typeof coord[0] === 'number' ? [coord[0], coord[1]] : [0, 0];
86
98
  }
87
99
  }
@@ -7,6 +7,7 @@
7
7
  * and the result is baked into the vertex or instance data of the batch.
8
8
  */
9
9
  import { generateCirclePolygon } from '../../shared/math/index.js';
10
+ import { coordinatesOf } from '../../shared/utils/coordinates.js';
10
11
  import { getCircleRadius, getCreatedZoom } from '../../shared/utils/property.js';
11
12
  import { toLineBatchItem, toPointInstanceData } from '../renderers/batch-manager.js';
12
13
  /**
@@ -37,11 +38,11 @@ export function collectLineItems(features, styles, layer) {
37
38
  items.push(item);
38
39
  };
39
40
  if (feature.type === 'MultiLineString') {
40
- for (const part of feature.coordinates)
41
+ for (const part of coordinatesOf(feature))
41
42
  push(part);
42
43
  }
43
44
  else {
44
- push(feature.coordinates);
45
+ push(coordinatesOf(feature));
45
46
  }
46
47
  }
47
48
  return items;
@@ -85,7 +86,7 @@ export function collectPolygons(features, styles, layer) {
85
86
  });
86
87
  };
87
88
  if (feature.type === 'MultiPolygon') {
88
- const parts = feature.coordinates;
89
+ const parts = coordinatesOf(feature);
89
90
  for (let i = 0; i < parts.length; i++)
90
91
  push(parts[i], i);
91
92
  }
@@ -93,10 +94,10 @@ export function collectPolygons(features, styles, layer) {
93
94
  const radiusMeters = getCircleRadius(feature);
94
95
  if (!radiusMeters || radiusMeters <= 0)
95
96
  continue;
96
- push([generateCirclePolygon(feature.coordinates, radiusMeters)], 0);
97
+ push([generateCirclePolygon(coordinatesOf(feature), radiusMeters)], 0);
97
98
  }
98
99
  else {
99
- push(feature.coordinates, 0);
100
+ push(coordinatesOf(feature), 0);
100
101
  }
101
102
  }
102
103
  return polygons;
@@ -109,12 +110,12 @@ export function collectPoints(features, styles, layer) {
109
110
  for (const feature of features) {
110
111
  const style = styles.getPointStyle(feature, layer);
111
112
  if (feature.type === 'MultiPoint') {
112
- for (const coord of feature.coordinates) {
113
+ for (const coord of coordinatesOf(feature)) {
113
114
  points.push(toPointInstanceData(coord, style));
114
115
  }
115
116
  }
116
117
  else {
117
- points.push(toPointInstanceData(feature.coordinates, style));
118
+ points.push(toPointInstanceData(coordinatesOf(feature), style));
118
119
  }
119
120
  }
120
121
  return points;
@@ -1,11 +1,3 @@
1
- /**
2
- * Incremental update of the coordinate texture of a retained line chunk
3
- *
4
- * A vertex drag moves only a few vertices. Rebuilding a line chunk with many vertices every frame
5
- * would overflow the frame, so the diff of the vertices that moved is queued on the chunk and,
6
- * right before drawing, only the corresponding texels of the coordinate texture are rewritten
7
- * (see SDFLineRenderer.patchRetainedBatchCoords).
8
- */
9
1
  import type { Coordinate, Feature } from '../../store/types.js';
10
2
  import type { RetainedLineBatch } from '../renderers/line/line-types.js';
11
3
  import type { SDFLineRenderer } from '../renderers/line/sdf-line.js';