@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,168 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { expandBBox } from './store-retained-bbox.js';
4
+ /**
5
+ * Upper limit of the number of vertices that one update may put into the incremental update of
6
+ * the coordinate texture
7
+ *
8
+ * A change beyond this (moving vertices in bulk, cut and paste) rebuilds the whole chunk.
9
+ * The incremental update targets the case where "one vertex drag moves only a few points".
10
+ */
11
+ export const MAX_PATCHED_VERTICES = 8;
12
+ /**
13
+ * Extracts the line renderer if it supports partial updates of the coordinate texture
14
+ */
15
+ export function asCoordPatcher(line) {
16
+ const candidate = line;
17
+ return typeof candidate.patchRetainedBatchCoords === 'function'
18
+ ? candidate
19
+ : null;
20
+ }
21
+ /**
22
+ * Computes the diff of a coordinate list (the indices of the vertices that moved)
23
+ *
24
+ * A vertex drag is an update where "the number of vertices is the same and only a few values
25
+ * differ". Anything else (vertices added or removed, many of them moved) cannot be applied as a
26
+ * diff, so null is returned.
27
+ *
28
+ * The comparison is done in a single pass. If the element references are the same, that vertex
29
+ * has not moved (the Store reuses the arrays of the vertices it does not change). The values are
30
+ * looked at only when the references differ.
31
+ *
32
+ * @param maxChanged Upper limit of the number of changed vertices allowed as a diff
33
+ * @returns The indices of the vertices that moved (an empty array when none moved). null when
34
+ * the number of vertices differs or the upper limit is exceeded
35
+ */
36
+ export function computeCoordinateDiff(prev, next, maxChanged) {
37
+ if (!Array.isArray(prev) || !Array.isArray(next))
38
+ return null;
39
+ if (prev.length !== next.length)
40
+ return null;
41
+ const changed = [];
42
+ for (let i = 0; i < next.length; i++) {
43
+ const a = prev[i];
44
+ const b = next[i];
45
+ if (a === b)
46
+ continue;
47
+ if (!a || !b)
48
+ return null;
49
+ if (a[0] === b[0] && a[1] === b[1])
50
+ continue;
51
+ // Beyond the upper limit it is not handled as a diff
52
+ if (changed.length >= maxChanged)
53
+ return null;
54
+ changed.push(i);
55
+ }
56
+ return changed;
57
+ }
58
+ /**
59
+ * Computes the "feature → position in the coordinate texture" of a line chunk
60
+ *
61
+ * The coordinate texture is packed with the coordinates in the order of the items returned by
62
+ * collectLineItems. Therefore this must count in the same order and with the same exclusion rule
63
+ * as collectLineItems (fewer than 2 vertices are not pushed).
64
+ *
65
+ * Only the types where one feature becomes one item and the coordinate list goes in as it is
66
+ * (LineString / Freehand) are recorded. A MultiLineString splits into several items and its
67
+ * indices interleave, so it is not a target of the diff (only the coordinate count is advanced).
68
+ */
69
+ export function computeLineCoordSlots(features) {
70
+ const slots = new Map();
71
+ let offset = 0;
72
+ for (const feature of features) {
73
+ if (feature.type === 'MultiLineString') {
74
+ for (const part of feature.coordinates ?? []) {
75
+ if (!part || part.length < 2)
76
+ continue;
77
+ offset += part.length;
78
+ }
79
+ continue;
80
+ }
81
+ const coords = feature.coordinates;
82
+ if (!coords || coords.length < 2)
83
+ continue;
84
+ if (feature.type === 'LineString' || feature.type === 'Freehand') {
85
+ slots.set(feature.id, { offset, count: coords.length });
86
+ }
87
+ offset += coords.length;
88
+ }
89
+ return slots;
90
+ }
91
+ /**
92
+ * Queues a vertex movement as a diff patch against the retained batch
93
+ *
94
+ * It can be queued only when all of the following hold. If even one of them fails, false is
95
+ * returned and the caller rebuilds the whole chunk (rebuilding too much still renders
96
+ * correctly).
97
+ *
98
+ * - A type whose coordinate list goes into the coordinate texture as one contiguous run
99
+ * (LineString / Freehand)
100
+ * - No other item that affects the appearance (properties = the input of the style rules) has
101
+ * changed
102
+ * - The number of vertices is unchanged and between 1 and MAX_PATCHED_VERTICES vertices moved
103
+ * - The chunk it belongs to has a retained line batch and is not waiting for a rebuild
104
+ * - The renderer used for drawing supports partial updates of the coordinate texture
105
+ *
106
+ * The drag being committed (up) does not trigger another rebuild. The patch queued by the last
107
+ * movement becomes the committed value as it is.
108
+ *
109
+ * @param chunk The chunk that carries the feature (undefined when there is none)
110
+ * @param line The line renderer used most recently (null before the first draw)
111
+ */
112
+ export function queueCoordPatch(chunk, feature, previous, line) {
113
+ if (feature.type !== 'LineString' && feature.type !== 'Freehand')
114
+ return false;
115
+ // properties is the input of the style rules, so a change there can change the color
116
+ if (previous.properties !== feature.properties)
117
+ return false;
118
+ if (!chunk)
119
+ return false;
120
+ if (chunk.kind !== 'line' || !chunk.line || chunk.dirty || !chunk.lineOffsets)
121
+ return false;
122
+ const slot = chunk.lineOffsets.get(feature.id);
123
+ if (!slot)
124
+ return false;
125
+ const coords = feature.coordinates;
126
+ // If the vertex count differs from when the index table was built, the positions of the
127
+ // following features are off as well
128
+ if (!Array.isArray(coords) || coords.length !== slot.count)
129
+ return false;
130
+ const changed = computeCoordinateDiff(previous.coordinates, coords, MAX_PATCHED_VERTICES);
131
+ if (!changed)
132
+ return false;
133
+ // An update where no vertex moved (a change of locked, for example) is not treated as a diff;
134
+ // the chunk is rebuilt as before (erring on the conservative side)
135
+ if (changed.length === 0)
136
+ return false;
137
+ // With a renderer that has no partial update, a queued diff could never be applied
138
+ if (!line || !asCoordPatcher(line))
139
+ return false;
140
+ const patches = chunk.pendingCoordPatches ?? [];
141
+ chunk.pendingCoordPatches = patches;
142
+ for (const i of changed) {
143
+ const coord = coords[i];
144
+ patches.push({ coordIndex: slot.offset + i, lngLat: [coord[0], coord[1]] });
145
+ chunk.bbox = expandBBox(chunk.bbox, coord);
146
+ }
147
+ return true;
148
+ }
149
+ /**
150
+ * Applies the queued vertex diff to the coordinate texture
151
+ *
152
+ * It is not called for a chunk thinned away off-screen, but the patches stay queued, so they
153
+ * are all applied on the first frame where the chunk comes into view.
154
+ */
155
+ export function flushCoordPatches(chunk, line) {
156
+ const patches = chunk.pendingCoordPatches;
157
+ if (!patches || !chunk.line)
158
+ return;
159
+ chunk.pendingCoordPatches = null;
160
+ const patcher = asCoordPatcher(line);
161
+ if (!patcher) {
162
+ // Safety net for the case where the renderer was swapped for one without partial updates.
163
+ // This frame keeps the stale picture, but the next frame rebuilds it.
164
+ chunk.dirty = true;
165
+ return;
166
+ }
167
+ patcher.patchRetainedBatchCoords(chunk.line, patches);
168
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Immediate-mode drawing of the chunks that cannot be retained
3
+ *
4
+ * Dashed lines, images, point shapes without instancing support, custom types and features with
5
+ * a companion are drawn one at a time through the immediate-mode draw target, in the same order
6
+ * as the layer loop of render.ts.
7
+ */
8
+ import type { ProjectionData } from 'maplibre-gl';
9
+ import type { CustomFeatureHandler, CustomRendererDrawContext } from '../../extension/index.js';
10
+ import type { Store } from '../../store/store.js';
11
+ import type { Feature, Layer } from '../../store/types.js';
12
+ import { type FeatureCompanionRegistry } from '../feature-companion.js';
13
+ import type { RetainedRendererSet } from '../renderers/retained.js';
14
+ /**
15
+ * Draw target used when falling back to immediate mode (the same shape as BatchManager)
16
+ */
17
+ export interface StoreImmediateTarget {
18
+ beginFrame(projectionData: ProjectionData, zoom: number, layer?: Layer): void;
19
+ processFeature(feature: Feature, isSelected: boolean): boolean;
20
+ endFrame(): void;
21
+ }
22
+ /**
23
+ * Dependencies of drawLayer
24
+ */
25
+ export interface StoreRetainedDrawDeps {
26
+ /** The full set of renderers of retained mode */
27
+ renderers: RetainedRendererSet;
28
+ /** Immediate-mode draw target that draws the features which cannot be retained */
29
+ batchManager: StoreImmediateTarget;
30
+ /** Renderers of the custom feature types (type name → renderer) */
31
+ customRenderers: Map<string, CustomFeatureHandler['renderer']>;
32
+ /** Draw context passed to a custom renderer */
33
+ customRendererContext: CustomRendererDrawContext;
34
+ /** Providers of companion drawing and companion hits (those of this draw instance) */
35
+ companions: FeatureCompanionRegistry;
36
+ /**
37
+ * Returns the set of feature ids inside the expanded viewport (a spatial index query)
38
+ *
39
+ * Used to thin immediate chunks per feature. It is not called in a frame that draws no
40
+ * immediate chunk at all (the caller must memoize it within the frame). When omitted, an
41
+ * immediate chunk is thinned by the chunk bbox alone.
42
+ */
43
+ getVisibleIds?: () => ReadonlySet<string>;
44
+ /**
45
+ * Re-establishes the blend state of our own rendering (a wrapper around `applyDrawBlendState`)
46
+ *
47
+ * The renderer of a custom feature type is an external implementation and may come back having
48
+ * rewritten the blend function for its own purposes. Left alone, everything drawn later in the
49
+ * same frame would be composited wrongly, so it is called right after control comes back.
50
+ * When omitted nothing is re-established (the path of tests that have no GL).
51
+ */
52
+ restoreBlendState?: () => void;
53
+ }
54
+ /**
55
+ * Draws a list of features in immediate mode
56
+ *
57
+ * It draws with the same steps as the current immediate mode (the layer loop of render.ts).
58
+ * A custom type is drawn after the batch has been flushed, to keep the draw order.
59
+ *
60
+ * @param store Where the features are looked up again (hidden ones are skipped)
61
+ * @param visibleIds Feature ids inside the expanded viewport (no thinning when omitted)
62
+ */
63
+ export declare function drawFeaturesImmediate(store: Store, featureIds: string[], layer: Layer | undefined, projectionData: ProjectionData, zoom: number, deps: StoreRetainedDrawDeps, visibleIds?: ReadonlySet<string>): void;
@@ -0,0 +1,49 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { isLocallyHidden } from '../../store/local-visibility.js';
4
+ import { drawFeatureCompanionsInFrame, } from '../feature-companion.js';
5
+ /**
6
+ * Draws a list of features in immediate mode
7
+ *
8
+ * It draws with the same steps as the current immediate mode (the layer loop of render.ts).
9
+ * A custom type is drawn after the batch has been flushed, to keep the draw order.
10
+ *
11
+ * @param store Where the features are looked up again (hidden ones are skipped)
12
+ * @param visibleIds Feature ids inside the expanded viewport (no thinning when omitted)
13
+ */
14
+ export function drawFeaturesImmediate(store, featureIds, layer, projectionData, zoom, deps, visibleIds) {
15
+ const { batchManager, customRenderers, customRendererContext } = deps;
16
+ batchManager.beginFrame(projectionData, zoom, layer);
17
+ for (const id of featureIds) {
18
+ if (visibleIds && !visibleIds.has(id))
19
+ continue;
20
+ const feature = store.getFeature(id);
21
+ if (!feature?.visible || isLocallyHidden(feature, store))
22
+ continue;
23
+ // Companion drawing (feature companion): drawn right before the feature itself, that is,
24
+ // one z below it. classifyFeature splits a feature that has a companion out into an
25
+ // immediate chunk, so going through here makes the z order in retained mode identical to
26
+ // immediate mode.
27
+ drawFeatureCompanionsInFrame(deps.companions, feature, batchManager, projectionData, zoom, layer, customRendererContext, deps.restoreBlendState);
28
+ const customRenderer = customRenderers.get(feature.type);
29
+ if (customRenderer) {
30
+ // To keep the draw order (painter's algorithm), the core batch that has accumulated is
31
+ // flushed first and only then the custom feature is drawn immediately.
32
+ batchManager.endFrame();
33
+ customRenderer.draw({
34
+ id: feature.id,
35
+ type: feature.type,
36
+ coordinates: feature.coordinates,
37
+ properties: feature.properties,
38
+ style: feature.style,
39
+ }, projectionData, zoom, customRendererContext);
40
+ // Re-establish the blend state that the external renderer may have rewritten
41
+ deps.restoreBlendState?.();
42
+ batchManager.beginFrame(projectionData, zoom, layer);
43
+ }
44
+ else {
45
+ batchManager.processFeature(feature, false);
46
+ }
47
+ }
48
+ batchManager.endFrame();
49
+ }
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Detection of the changes that invalidate every retained chunk
3
+ *
4
+ * Some inputs of the retained batches do not arrive as a change of the Store: the set of locally
5
+ * hidden features (updated in place), the registry of companion drawing and the generations of
6
+ * the terrain. They are checked once per frame, and any change discards the whole cache.
7
+ */
8
+ import type { Layer, StateChanges } from '../../store/types.js';
9
+ import type { FeatureCompanionRegistry } from '../feature-companion.js';
10
+ import type { TerrainContext } from '../terrain/context.js';
11
+ /**
12
+ * Snapshots of the inputs that invalidate every chunk
13
+ *
14
+ * Each method records the current value and reports whether it changed since the previous call.
15
+ * The first call only records (there is no cache yet, so nothing has to be discarded).
16
+ */
17
+ export declare class RetainedInvalidationWatch {
18
+ /** Previous snapshot of the set of locally hidden features */
19
+ private hiddenSnapshot;
20
+ private hiddenSnapshotReady;
21
+ /**
22
+ * Previous generation of the companion drawing (feature companion) registry
23
+ *
24
+ * Registering or unregistering a provider can change the result of classifyFeature, so the
25
+ * cached classification is discarded whenever the generation changes.
26
+ */
27
+ private companionGeneration;
28
+ /**
29
+ * Previous generation of the terrain subdivision
30
+ *
31
+ * The fill and the outline of a polygon bake the subdivision step into the vertex data. When
32
+ * the step changes (terrain switched on or off, a zoom threshold crossed) they have to be
33
+ * rebuilt. A line is split on the GPU side and bakes nothing, so it would not need a rebuild,
34
+ * but the generation only changes on a zoom crossing or when terrain is switched, so discarding
35
+ * everything is acceptable.
36
+ */
37
+ private terrainGeneration;
38
+ /**
39
+ * Previous generation of the cells of the globe
40
+ *
41
+ * On the globe the fill and the outline of a polygon bake the cut along the Mercator plane
42
+ * (`view/globe-subdivision.ts`). The generation changes when the globe starts or stops being
43
+ * drawn and when the zoom crosses an integer that changes a cell.
44
+ */
45
+ private globeGeneration;
46
+ /**
47
+ * Generation of the baked anchor elevation (-1 when not built yet)
48
+ *
49
+ * A point batch bakes the ground elevation into each instance. Unless it is rebuilt when a DEM
50
+ * tile arrives and the elevation changes, only the points are left behind at the old height.
51
+ */
52
+ private anchorElevationGeneration;
53
+ /**
54
+ * Whether the set of locally hidden features changed
55
+ *
56
+ * The Store updates the same Set in place, so a reference comparison is impossible. The hidden
57
+ * set is usually small, so it is compared by count first and then by every element.
58
+ */
59
+ locallyHiddenChanged(current: ReadonlySet<string>): boolean;
60
+ /**
61
+ * Whether providers of companion drawing were added or removed
62
+ *
63
+ * When the registrations change, the classification "a feature with a companion goes into an
64
+ * immediate chunk" can change. Comparing the generation is a single integer, so with no change
65
+ * the cost per frame is effectively zero.
66
+ */
67
+ companionsChanged(companions: FeatureCompanionRegistry): boolean;
68
+ /**
69
+ * Whether a generation of the terrain changed
70
+ *
71
+ * There are three things to look at: the subdivision step of the terrain and the cells of the
72
+ * globe (the split points of polygons and lines change), and the anchor elevation (the ground
73
+ * height baked into the points changes). DEM tiles arrive asynchronously, so the last advances
74
+ * several times after the first frame.
75
+ */
76
+ terrainChanged(terrain: TerrainContext): boolean;
77
+ /**
78
+ * Forgets the snapshot of the hidden set (the next call records it again)
79
+ *
80
+ * The generations are kept: a disposed cache still knows the generations it last saw.
81
+ */
82
+ resetLocallyHidden(): void;
83
+ }
84
+ /**
85
+ * Whether an update of a layer changed only its opacity
86
+ *
87
+ * The opacity is applied at draw time (a uniform of the retained batches, a factor of the drape
88
+ * source), so such an update needs no rebuild. Any other field that differs, including one this
89
+ * function does not know, counts as a change (the safe side).
90
+ */
91
+ export declare function isOpacityOnlyLayerChange(previous: Layer, layer: Layer): boolean;
92
+ /**
93
+ * Whether a change of the layers consists only of opacity updates (nothing created, deleted or
94
+ * reordered, and every update is {@link isOpacityOnlyLayerChange})
95
+ */
96
+ export declare function isOpacityOnlyLayersChange(layers: NonNullable<StateChanges['layers']>): boolean;
@@ -0,0 +1,192 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { getAnchorElevationGeneration } from '../terrain/anchor.js';
4
+ /**
5
+ * Snapshots of the inputs that invalidate every chunk
6
+ *
7
+ * Each method records the current value and reports whether it changed since the previous call.
8
+ * The first call only records (there is no cache yet, so nothing has to be discarded).
9
+ */
10
+ export class RetainedInvalidationWatch {
11
+ constructor() {
12
+ /** Previous snapshot of the set of locally hidden features */
13
+ Object.defineProperty(this, "hiddenSnapshot", {
14
+ enumerable: true,
15
+ configurable: true,
16
+ writable: true,
17
+ value: new Set()
18
+ });
19
+ Object.defineProperty(this, "hiddenSnapshotReady", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: false
24
+ });
25
+ /**
26
+ * Previous generation of the companion drawing (feature companion) registry
27
+ *
28
+ * Registering or unregistering a provider can change the result of classifyFeature, so the
29
+ * cached classification is discarded whenever the generation changes.
30
+ */
31
+ Object.defineProperty(this, "companionGeneration", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: -1
36
+ });
37
+ /**
38
+ * Previous generation of the terrain subdivision
39
+ *
40
+ * The fill and the outline of a polygon bake the subdivision step into the vertex data. When
41
+ * the step changes (terrain switched on or off, a zoom threshold crossed) they have to be
42
+ * rebuilt. A line is split on the GPU side and bakes nothing, so it would not need a rebuild,
43
+ * but the generation only changes on a zoom crossing or when terrain is switched, so discarding
44
+ * everything is acceptable.
45
+ */
46
+ Object.defineProperty(this, "terrainGeneration", {
47
+ enumerable: true,
48
+ configurable: true,
49
+ writable: true,
50
+ value: -1
51
+ });
52
+ /**
53
+ * Previous generation of the cells of the globe
54
+ *
55
+ * On the globe the fill and the outline of a polygon bake the cut along the Mercator plane
56
+ * (`view/globe-subdivision.ts`). The generation changes when the globe starts or stops being
57
+ * drawn and when the zoom crosses an integer that changes a cell.
58
+ */
59
+ Object.defineProperty(this, "globeGeneration", {
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true,
63
+ value: -1
64
+ });
65
+ /**
66
+ * Generation of the baked anchor elevation (-1 when not built yet)
67
+ *
68
+ * A point batch bakes the ground elevation into each instance. Unless it is rebuilt when a DEM
69
+ * tile arrives and the elevation changes, only the points are left behind at the old height.
70
+ */
71
+ Object.defineProperty(this, "anchorElevationGeneration", {
72
+ enumerable: true,
73
+ configurable: true,
74
+ writable: true,
75
+ value: -1
76
+ });
77
+ }
78
+ /**
79
+ * Whether the set of locally hidden features changed
80
+ *
81
+ * The Store updates the same Set in place, so a reference comparison is impossible. The hidden
82
+ * set is usually small, so it is compared by count first and then by every element.
83
+ */
84
+ locallyHiddenChanged(current) {
85
+ if (!this.hiddenSnapshotReady) {
86
+ this.hiddenSnapshot = new Set(current);
87
+ this.hiddenSnapshotReady = true;
88
+ return false;
89
+ }
90
+ if (current.size === this.hiddenSnapshot.size) {
91
+ let same = true;
92
+ for (const id of current) {
93
+ if (!this.hiddenSnapshot.has(id)) {
94
+ same = false;
95
+ break;
96
+ }
97
+ }
98
+ if (same)
99
+ return false;
100
+ }
101
+ this.hiddenSnapshot = new Set(current);
102
+ return true;
103
+ }
104
+ /**
105
+ * Whether providers of companion drawing were added or removed
106
+ *
107
+ * When the registrations change, the classification "a feature with a companion goes into an
108
+ * immediate chunk" can change. Comparing the generation is a single integer, so with no change
109
+ * the cost per frame is effectively zero.
110
+ */
111
+ companionsChanged(companions) {
112
+ const generation = companions.generation();
113
+ if (generation === this.companionGeneration)
114
+ return false;
115
+ // On the first time there is no cache at all, so nothing has to be discarded
116
+ const first = this.companionGeneration === -1;
117
+ this.companionGeneration = generation;
118
+ return !first;
119
+ }
120
+ /**
121
+ * Whether a generation of the terrain changed
122
+ *
123
+ * There are three things to look at: the subdivision step of the terrain and the cells of the
124
+ * globe (the split points of polygons and lines change), and the anchor elevation (the ground
125
+ * height baked into the points changes). DEM tiles arrive asynchronously, so the last advances
126
+ * several times after the first frame.
127
+ */
128
+ terrainChanged(terrain) {
129
+ let changed = false;
130
+ const generation = terrain.renderState.generation;
131
+ if (generation !== this.terrainGeneration) {
132
+ const first = this.terrainGeneration === -1;
133
+ this.terrainGeneration = generation;
134
+ if (!first)
135
+ changed = true;
136
+ }
137
+ if (terrain.globeGeneration !== this.globeGeneration) {
138
+ const first = this.globeGeneration === -1;
139
+ this.globeGeneration = terrain.globeGeneration;
140
+ if (!first)
141
+ changed = true;
142
+ }
143
+ const anchorGeneration = getAnchorElevationGeneration(terrain);
144
+ if (anchorGeneration !== this.anchorElevationGeneration) {
145
+ const first = this.anchorElevationGeneration === -1;
146
+ this.anchorElevationGeneration = anchorGeneration;
147
+ if (!first)
148
+ changed = true;
149
+ }
150
+ return changed;
151
+ }
152
+ /**
153
+ * Forgets the snapshot of the hidden set (the next call records it again)
154
+ *
155
+ * The generations are kept: a disposed cache still knows the generations it last saw.
156
+ */
157
+ resetLocallyHidden() {
158
+ this.hiddenSnapshot = new Set();
159
+ this.hiddenSnapshotReady = false;
160
+ }
161
+ }
162
+ /**
163
+ * Whether an update of a layer changed only its opacity
164
+ *
165
+ * The opacity is applied at draw time (a uniform of the retained batches, a factor of the drape
166
+ * source), so such an update needs no rebuild. Any other field that differs, including one this
167
+ * function does not know, counts as a change (the safe side).
168
+ */
169
+ export function isOpacityOnlyLayerChange(previous, layer) {
170
+ if (previous.opacity === layer.opacity)
171
+ return false;
172
+ const keys = new Set([...Object.keys(previous), ...Object.keys(layer)]);
173
+ for (const key of keys) {
174
+ if (key === 'opacity')
175
+ continue;
176
+ if (previous[key] !== layer[key])
177
+ return false;
178
+ }
179
+ return true;
180
+ }
181
+ /**
182
+ * Whether a change of the layers consists only of opacity updates (nothing created, deleted or
183
+ * reordered, and every update is {@link isOpacityOnlyLayerChange})
184
+ */
185
+ export function isOpacityOnlyLayersChange(layers) {
186
+ if (layers.created?.length || layers.deleted?.length || layers.orderChanged)
187
+ return false;
188
+ const updated = layers.updated ?? [];
189
+ if (updated.length === 0)
190
+ return false;
191
+ return updated.every(({ layer, previous }) => isOpacityOnlyLayerChange(previous, layer));
192
+ }