@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,198 @@
1
+ /**
2
+ * Retained-mode rendering of the Store features
3
+ *
4
+ * Immediate mode repeats "resolve the style → compute the relative coordinates → build the
5
+ * vertices on the CPU → upload to the GPU" for every feature on every frame. Here a retained
6
+ * batch (a GPU resource) is prepared per layer in advance and a frame only issues the draw calls.
7
+ * The vertex data does not depend on the camera (projection is done with the projectionData and
8
+ * zoom uniforms of each frame), so it only has to be rebuilt when the set of features or the
9
+ * style rules change.
10
+ *
11
+ * **The rendering result (including the z-order) must be identical to immediate mode.**
12
+ * To that end the feature list is cut into runs at exactly the positions where "the BatchManager
13
+ * of immediate mode flushes a batch", and the runs are drawn in order. Kinds that cannot be
14
+ * retained (dashed lines, images, point shapes without instancing support, custom types) are put
15
+ * into their own run and sent through the immediate-mode path.
16
+ *
17
+ * A change that moves only a few vertices, such as a vertex drag, does not rebuild the chunk.
18
+ * The diff of the vertices that moved is queued, and right before drawing only the corresponding
19
+ * texels of the coordinate texture of the line batch are rewritten. Rebuilding a line with many
20
+ * vertices every frame would overflow the frame (see the comments on queueCoordPatch and
21
+ * SDFLineRenderer.patchRetainedBatchCoords for the details).
22
+ *
23
+ * A retained batch itself does not depend on the camera. Drawing every chunk on every frame
24
+ * would, however, push a large amount of off-screen geometry to the GPU when the data is far
25
+ * wider than the viewport. Each chunk therefore keeps a longitude/latitude bbox, and at draw time
26
+ * only the chunks that do not intersect the expanded viewport are skipped. The unit of thinning
27
+ * is the chunk, and the contents of a batch are not rebuilt for it.
28
+ *
29
+ * This file holds the cache that ties the parts together. The parts are
30
+ *
31
+ * - `store-retained-classify.ts`: the classification of a feature into the kind of its run
32
+ * - `store-retained-chunk.ts`: the chunk, and the building and releasing of its batch
33
+ * - `store-retained-collect.ts`: the conversion of features into the data of a batch
34
+ * - `store-retained-bbox.ts`: the bbox of a chunk and the thinning by the viewport
35
+ * - `store-retained-coord-patch.ts`: the incremental update of the vertices of a line chunk
36
+ * - `store-retained-immediate.ts`: the immediate-mode drawing of the chunks that are not retained
37
+ * - `store-retained-invalidation.ts`: the inputs outside the Store changes that discard the cache
38
+ */
39
+ import type { ProjectionData } from 'maplibre-gl';
40
+ import type { Store } from '../../store/store.js';
41
+ import type { BoundingBox, Layer, StateChanges } from '../../store/types.js';
42
+ import type { FeatureCompanionRegistry } from '../feature-companion.js';
43
+ import type { RetainedRendererSet } from '../renderers/retained.js';
44
+ import { TerrainContext } from '../terrain/context.js';
45
+ import type { SelectionExtensionRegistry } from '../ui/selection-ui/index.js';
46
+ import { type StoreRetainedDrawDeps } from './store-retained-immediate.js';
47
+ export type { ChunkBBox } from './store-retained-bbox.js';
48
+ export { bboxIntersects } from './store-retained-bbox.js';
49
+ export { STORE_CHUNK_TARGET } from './store-retained-chunk.js';
50
+ export type { RunKind } from './store-retained-classify.js';
51
+ export { classifyFeature } from './store-retained-classify.js';
52
+ export type { LineCoordSlot } from './store-retained-coord-patch.js';
53
+ export { computeCoordinateDiff, computeLineCoordSlots } from './store-retained-coord-patch.js';
54
+ export type { StoreImmediateTarget, StoreRetainedDrawDeps } from './store-retained-immediate.js';
55
+ /**
56
+ * Retained batch cache of the Store features
57
+ *
58
+ * It keeps a list of chunks per layer and rebuilds them per chunk or per layer according to the
59
+ * changes of the Store.
60
+ */
61
+ export declare class StoreRetainedCache {
62
+ private readonly store;
63
+ /** layerId → cache */
64
+ private readonly layers;
65
+ /**
66
+ * The set of retained-mode renderers used most recently
67
+ *
68
+ * GPU resources are also released from outside rendering (from the subscription to the Store),
69
+ * so where to release them is remembered.
70
+ */
71
+ private renderers;
72
+ /** Feature lists per layer (a memo within the frame) */
73
+ private featuresByLayer;
74
+ /** Snapshots of the inputs that invalidate every chunk */
75
+ private readonly watch;
76
+ /** The terrain state of the draw instance (the generations that invalidate the caches) */
77
+ private readonly terrain;
78
+ /** The selection extension points of the draw instance (extents of the custom types) */
79
+ private readonly extensions;
80
+ /** The number of the current frame (counted by beginFrame) */
81
+ private frame;
82
+ constructor(store: Store, scope?: {
83
+ terrain?: TerrainContext;
84
+ extensions?: SelectionExtensionRegistry;
85
+ });
86
+ /**
87
+ * Called at the start of a frame
88
+ *
89
+ * It detects a change of the local visibility (the Store updates the same Set in place, so a
90
+ * reference comparison is impossible) and discards the memo within the frame.
91
+ */
92
+ beginFrame(companions: FeatureCompanionRegistry): void;
93
+ /**
94
+ * Draws a single layer
95
+ *
96
+ * Drawing follows the order of the chunk list (= the draw order of the Store), so the z-order
97
+ * matches immediate mode.
98
+ *
99
+ * When `viewportBounds` is given, the chunks that do not intersect it are skipped. Only a chunk
100
+ * completely out of range is skipped, so the z-order does not change. As long as the expanded
101
+ * viewport (the same range as the ViewportFilter of immediate mode) is passed, what is drawn
102
+ * satisfies "retained mode ⊇ immediate mode" and the appearance matches as well.
103
+ *
104
+ * An immediate chunk is thinned further per feature with `deps.getVisibleIds`. A retained chunk
105
+ * stays at chunk granularity because a batch cannot be split, but an immediate chunk (dashed
106
+ * lines, images, custom types) is drawn one at a time, so drawing even the off-screen features
107
+ * every frame just because the chunk touches the view is avoided. With this, what an immediate
108
+ * chunk draws is the same set as in immediate mode.
109
+ *
110
+ * @param viewportBounds bbox of the expanded viewport (no thinning when omitted)
111
+ */
112
+ drawLayer(layerId: string, layer: Layer | undefined, projectionData: ProjectionData, zoom: number, deps: StoreRetainedDrawDeps, viewportBounds?: BoundingBox): void;
113
+ /**
114
+ * Applies the changes of the Store
115
+ *
116
+ * The decisions are conservative (rebuilding too much still renders correctly; rebuilding too
117
+ * little leaves a stale picture).
118
+ */
119
+ applyChanges(changes: StateChanges): void;
120
+ /**
121
+ * Discards the cache of every layer (the GPU resources are released as well)
122
+ */
123
+ invalidateAll(): void;
124
+ /**
125
+ * Discards the cache of a single layer (the GPU resources are released as well)
126
+ */
127
+ invalidateLayer(layerId: string): void;
128
+ /**
129
+ * Releases every GPU resource (called from onRemove of CustomLayer)
130
+ *
131
+ * @param renderers Where to release them (the ones used in the most recent draw when omitted)
132
+ */
133
+ dispose(renderers?: RetainedRendererSet): void;
134
+ /**
135
+ * Prepares the cache of a layer and rebuilds the dirty chunks
136
+ *
137
+ * When the classification disagrees with the kind of the chunk (for example when the evaluation
138
+ * of a style rule changed through properties), the whole layer is rebuilt. When it disagrees a
139
+ * second time as well, that frame is drawn in immediate mode and left to the next frame.
140
+ */
141
+ private ensureLayer;
142
+ /**
143
+ * Rebuilds the dirty chunks
144
+ *
145
+ * An immediate chunk has no retained batch, but the bbox used for thinning is recomputed here
146
+ * (so that the timing of the build matches a retained chunk).
147
+ *
148
+ * @returns Whether there was a disagreement of the classification (true = rebuild the layer)
149
+ */
150
+ private buildDirtyChunks;
151
+ /**
152
+ * Computes the bbox of a list of feature ids (looked up again from the Store)
153
+ */
154
+ private computeChunkBBox;
155
+ /**
156
+ * Cuts the feature list of a layer into runs and chunks
157
+ *
158
+ * A run is cut where the classification changes, and within a run it is split into chunks of
159
+ * STORE_CHUNK_TARGET features each. The viewport is not looked at here (the contents of a
160
+ * retained batch must not depend on the camera). Thinning is done per chunk at draw time.
161
+ */
162
+ private buildLayerCache;
163
+ /**
164
+ * The features of a layer in draw order (visible and not locally hidden)
165
+ *
166
+ * It is never called in a frame where the cache is complete.
167
+ */
168
+ private getLayerFeatures;
169
+ /**
170
+ * Builds the retained batch of a chunk
171
+ */
172
+ private buildChunk;
173
+ /**
174
+ * Builds a retained chunk again around the view when its origin leaves a visible error
175
+ *
176
+ * A chunk is cut in draw order, so its extent can be wide; seen at high zoom, the vertices on
177
+ * screen can then be degrees away from the origin. The rule and the tolerance are in
178
+ * `view/shaders/retained-origin.ts`. A chunk that cannot be rebuilt now stays dirty and is
179
+ * drawn in immediate mode (exact) until the next frame.
180
+ */
181
+ private rebaseForView;
182
+ /**
183
+ * Releases the retained batch of a chunk
184
+ */
185
+ private disposeChunk;
186
+ /**
187
+ * Queues a vertex movement as a diff patch against the retained batch of its chunk
188
+ *
189
+ * The conditions are in queueCoordPatch. false = the caller rebuilds the chunk.
190
+ */
191
+ private tryQueueCoordPatch;
192
+ /**
193
+ * Marks the chunk that carries the feature as dirty
194
+ *
195
+ * If there is no corresponding chunk, the whole layer is rebuilt.
196
+ */
197
+ private markFeatureDirty;
198
+ }
@@ -0,0 +1,430 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { getDisplayFeatures, isLocallyHidden } from '../../store/local-visibility.js';
4
+ import { layerDrawFactors } from '../renderers/draw-factors.js';
5
+ import { boundsCenter, rebasedRetainedOrigin } from '../shaders/retained-origin.js';
6
+ import { TerrainContext } from '../terrain/context.js';
7
+ import { bboxIntersects, chunkBBoxToBounds, computeFeaturesBBox, } from './store-retained-bbox.js';
8
+ import { buildChunkBatch, createChunkEntry, disposeChunkBatches, STORE_CHUNK_TARGET, } from './store-retained-chunk.js';
9
+ import { classifyFeature, featureOrigin } from './store-retained-classify.js';
10
+ import { flushCoordPatches, queueCoordPatch } from './store-retained-coord-patch.js';
11
+ import { drawFeaturesImmediate } from './store-retained-immediate.js';
12
+ import { isOpacityOnlyLayerChange, RetainedInvalidationWatch, } from './store-retained-invalidation.js';
13
+ export { bboxIntersects } from './store-retained-bbox.js';
14
+ export { STORE_CHUNK_TARGET } from './store-retained-chunk.js';
15
+ export { classifyFeature } from './store-retained-classify.js';
16
+ export { computeCoordinateDiff, computeLineCoordSlots } from './store-retained-coord-patch.js';
17
+ /**
18
+ * Retained batch cache of the Store features
19
+ *
20
+ * It keeps a list of chunks per layer and rebuilds them per chunk or per layer according to the
21
+ * changes of the Store.
22
+ */
23
+ export class StoreRetainedCache {
24
+ constructor(store, scope = {}) {
25
+ Object.defineProperty(this, "store", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ /** layerId → cache */
32
+ Object.defineProperty(this, "layers", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: new Map()
37
+ });
38
+ /**
39
+ * The set of retained-mode renderers used most recently
40
+ *
41
+ * GPU resources are also released from outside rendering (from the subscription to the Store),
42
+ * so where to release them is remembered.
43
+ */
44
+ Object.defineProperty(this, "renderers", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: null
49
+ });
50
+ /** Feature lists per layer (a memo within the frame) */
51
+ Object.defineProperty(this, "featuresByLayer", {
52
+ enumerable: true,
53
+ configurable: true,
54
+ writable: true,
55
+ value: null
56
+ });
57
+ /** Snapshots of the inputs that invalidate every chunk */
58
+ Object.defineProperty(this, "watch", {
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true,
62
+ value: new RetainedInvalidationWatch()
63
+ });
64
+ /** The terrain state of the draw instance (the generations that invalidate the caches) */
65
+ Object.defineProperty(this, "terrain", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: void 0
70
+ });
71
+ /** The selection extension points of the draw instance (extents of the custom types) */
72
+ Object.defineProperty(this, "extensions", {
73
+ enumerable: true,
74
+ configurable: true,
75
+ writable: true,
76
+ value: void 0
77
+ });
78
+ /** The number of the current frame (counted by beginFrame) */
79
+ Object.defineProperty(this, "frame", {
80
+ enumerable: true,
81
+ configurable: true,
82
+ writable: true,
83
+ value: 0
84
+ });
85
+ this.store = store;
86
+ this.terrain = scope.terrain ?? new TerrainContext();
87
+ this.extensions = scope.extensions;
88
+ }
89
+ /**
90
+ * Called at the start of a frame
91
+ *
92
+ * It detects a change of the local visibility (the Store updates the same Set in place, so a
93
+ * reference comparison is impossible) and discards the memo within the frame.
94
+ */
95
+ beginFrame(companions) {
96
+ this.frame++;
97
+ this.featuresByLayer = null;
98
+ // Every watch is advanced on every frame (no short circuit), so each keeps its snapshot
99
+ const hiddenChanged = this.watch.locallyHiddenChanged(this.store.getLocallyHidden());
100
+ const companionsChanged = this.watch.companionsChanged(companions);
101
+ const terrainChanged = this.watch.terrainChanged(this.terrain);
102
+ if (hiddenChanged || companionsChanged || terrainChanged)
103
+ this.invalidateAll();
104
+ }
105
+ /**
106
+ * Draws a single layer
107
+ *
108
+ * Drawing follows the order of the chunk list (= the draw order of the Store), so the z-order
109
+ * matches immediate mode.
110
+ *
111
+ * When `viewportBounds` is given, the chunks that do not intersect it are skipped. Only a chunk
112
+ * completely out of range is skipped, so the z-order does not change. As long as the expanded
113
+ * viewport (the same range as the ViewportFilter of immediate mode) is passed, what is drawn
114
+ * satisfies "retained mode ⊇ immediate mode" and the appearance matches as well.
115
+ *
116
+ * An immediate chunk is thinned further per feature with `deps.getVisibleIds`. A retained chunk
117
+ * stays at chunk granularity because a batch cannot be split, but an immediate chunk (dashed
118
+ * lines, images, custom types) is drawn one at a time, so drawing even the off-screen features
119
+ * every frame just because the chunk touches the view is avoided. With this, what an immediate
120
+ * chunk draws is the same set as in immediate mode.
121
+ *
122
+ * @param viewportBounds bbox of the expanded viewport (no thinning when omitted)
123
+ */
124
+ drawLayer(layerId, layer, projectionData, zoom, deps, viewportBounds) {
125
+ this.renderers = deps.renderers;
126
+ const cache = this.ensureLayer(layerId, layer, deps);
127
+ const viewport = deps.renderers.viewport();
128
+ // The opacity of the layer is multiplied in at draw time (the batches do not bake it)
129
+ const factors = layerDrawFactors(layer);
130
+ for (const chunk of cache.chunks) {
131
+ // A chunk outside the screen is not drawn (a chunk with no computed bbox is always drawn)
132
+ if (viewportBounds && chunk.bbox && !bboxIntersects(chunk.bbox, viewportBounds))
133
+ continue;
134
+ // A batch whose origin is too far from the view for the zoom is built again around it
135
+ this.rebaseForView(chunk, layer, zoom, deps, viewportBounds);
136
+ // An immediate chunk, and a chunk that could not be built, are drawn in immediate mode
137
+ if (chunk.kind === 'immediate' || chunk.dirty) {
138
+ // Thin per feature as well, but only when the range to thin against is decided.
139
+ // The spatial index query becomes necessary for the first time here.
140
+ const visibleIds = viewportBounds ? deps.getVisibleIds?.() : undefined;
141
+ drawFeaturesImmediate(this.store, chunk.featureIds, layer, projectionData, zoom, deps, visibleIds);
142
+ continue;
143
+ }
144
+ if (chunk.polygon) {
145
+ deps.renderers.polygon.drawRetained(chunk.polygon, zoom, projectionData, viewport, factors);
146
+ }
147
+ if (chunk.line) {
148
+ // The vertex diff queued during the drag is written into the coordinate texture here
149
+ flushCoordPatches(chunk, deps.renderers.line);
150
+ deps.renderers.line.drawRetainedBatch(chunk.line, zoom, projectionData, factors);
151
+ }
152
+ if (chunk.point) {
153
+ deps.renderers.point.drawRetained(chunk.point, zoom, projectionData, factors);
154
+ }
155
+ }
156
+ }
157
+ /**
158
+ * Applies the changes of the Store
159
+ *
160
+ * The decisions are conservative (rebuilding too much still renders correctly; rebuilding too
161
+ * little leaves a stale picture).
162
+ */
163
+ applyChanges(changes) {
164
+ // The visibility and the ordering of a group have no reverse lookup to a layer, so everything
165
+ // is discarded (both are rare operations)
166
+ if (changes.groups || changes.groupReorder) {
167
+ this.invalidateAll();
168
+ return;
169
+ }
170
+ for (const feature of changes.features?.created ?? []) {
171
+ this.invalidateLayer(feature.layerId);
172
+ }
173
+ for (const feature of changes.features?.deleted ?? []) {
174
+ this.invalidateLayer(feature.layerId);
175
+ }
176
+ for (const { feature, previous } of changes.features?.updated ?? []) {
177
+ if (previous.layerId !== feature.layerId) {
178
+ this.invalidateLayer(previous.layerId);
179
+ this.invalidateLayer(feature.layerId);
180
+ continue;
181
+ }
182
+ // A change of the kind, the visibility, the style or the group can change the run split
183
+ // itself
184
+ if (previous.type !== feature.type ||
185
+ previous.visible !== feature.visible ||
186
+ previous.style !== feature.style ||
187
+ previous.groupId !== feature.groupId) {
188
+ this.invalidateLayer(feature.layerId);
189
+ continue;
190
+ }
191
+ // Moving a few vertices (= a drag) only needs a partial update of the coordinate texture of
192
+ // the retained batch. No rebuild is required.
193
+ if (this.tryQueueCoordPatch(feature, previous))
194
+ continue;
195
+ // A change of the coordinates or properties alone only needs the chunk in question rebuilt
196
+ this.markFeatureDirty(feature.layerId, feature.id);
197
+ }
198
+ // Any change of styleRule / visible / order rebuilds the whole layer. The opacity is a
199
+ // uniform written at draw time, so a change of the opacity alone keeps the batches
200
+ for (const { id, layer, previous } of changes.layers?.updated ?? []) {
201
+ if (isOpacityOnlyLayerChange(previous, layer))
202
+ continue;
203
+ this.invalidateLayer(id);
204
+ }
205
+ for (const layer of changes.layers?.deleted ?? []) {
206
+ this.invalidateLayer(layer.id);
207
+ }
208
+ // layers.orderChanged is the order between layers, so it does not affect the chunks
209
+ // (renderLayers calls drawLayer in layer order)
210
+ if (changes.layerReorder) {
211
+ this.invalidateLayer(changes.layerReorder.layerId);
212
+ }
213
+ }
214
+ /**
215
+ * Discards the cache of every layer (the GPU resources are released as well)
216
+ */
217
+ invalidateAll() {
218
+ for (const layerId of [...this.layers.keys()]) {
219
+ this.invalidateLayer(layerId);
220
+ }
221
+ }
222
+ /**
223
+ * Discards the cache of a single layer (the GPU resources are released as well)
224
+ */
225
+ invalidateLayer(layerId) {
226
+ const cache = this.layers.get(layerId);
227
+ if (!cache)
228
+ return;
229
+ for (const chunk of cache.chunks) {
230
+ this.disposeChunk(chunk);
231
+ }
232
+ this.layers.delete(layerId);
233
+ }
234
+ /**
235
+ * Releases every GPU resource (called from onRemove of CustomLayer)
236
+ *
237
+ * @param renderers Where to release them (the ones used in the most recent draw when omitted)
238
+ */
239
+ dispose(renderers) {
240
+ if (renderers)
241
+ this.renderers = renderers;
242
+ this.invalidateAll();
243
+ this.renderers = null;
244
+ this.watch.resetLocallyHidden();
245
+ this.featuresByLayer = null;
246
+ }
247
+ // === Internals ===
248
+ /**
249
+ * Prepares the cache of a layer and rebuilds the dirty chunks
250
+ *
251
+ * When the classification disagrees with the kind of the chunk (for example when the evaluation
252
+ * of a style rule changed through properties), the whole layer is rebuilt. When it disagrees a
253
+ * second time as well, that frame is drawn in immediate mode and left to the next frame.
254
+ */
255
+ ensureLayer(layerId, layer, deps) {
256
+ let cache = this.layers.get(layerId);
257
+ if (!cache) {
258
+ cache = this.buildLayerCache(layerId, layer, deps);
259
+ this.layers.set(layerId, cache);
260
+ }
261
+ if (!this.buildDirtyChunks(cache, layer, deps))
262
+ return cache;
263
+ this.invalidateLayer(layerId);
264
+ cache = this.buildLayerCache(layerId, layer, deps);
265
+ this.layers.set(layerId, cache);
266
+ this.buildDirtyChunks(cache, layer, deps);
267
+ return cache;
268
+ }
269
+ /**
270
+ * Rebuilds the dirty chunks
271
+ *
272
+ * An immediate chunk has no retained batch, but the bbox used for thinning is recomputed here
273
+ * (so that the timing of the build matches a retained chunk).
274
+ *
275
+ * @returns Whether there was a disagreement of the classification (true = rebuild the layer)
276
+ */
277
+ buildDirtyChunks(cache, layer, deps) {
278
+ for (const chunk of cache.chunks) {
279
+ if (!chunk.dirty)
280
+ continue;
281
+ if (chunk.kind === 'immediate') {
282
+ chunk.bbox = this.computeChunkBBox(chunk.featureIds);
283
+ chunk.dirty = false;
284
+ continue;
285
+ }
286
+ if (this.buildChunk(chunk, layer, deps) === 'mismatch')
287
+ return true;
288
+ }
289
+ return false;
290
+ }
291
+ /**
292
+ * Computes the bbox of a list of feature ids (looked up again from the Store)
293
+ */
294
+ computeChunkBBox(featureIds) {
295
+ const features = [];
296
+ for (const id of featureIds) {
297
+ const feature = this.store.getFeature(id);
298
+ if (feature)
299
+ features.push(feature);
300
+ }
301
+ return computeFeaturesBBox(features, this.extensions);
302
+ }
303
+ /**
304
+ * Cuts the feature list of a layer into runs and chunks
305
+ *
306
+ * A run is cut where the classification changes, and within a run it is split into chunks of
307
+ * STORE_CHUNK_TARGET features each. The viewport is not looked at here (the contents of a
308
+ * retained batch must not depend on the camera). Thinning is done per chunk at draw time.
309
+ */
310
+ buildLayerCache(layerId, layer, deps) {
311
+ const chunks = [];
312
+ const featureToChunk = new Map();
313
+ let current = null;
314
+ for (const feature of this.getLayerFeatures(layerId)) {
315
+ const kind = classifyFeature(feature, deps.renderers.styles, deps.customRenderers, deps.companions, layer);
316
+ if (current === null ||
317
+ current.kind !== kind ||
318
+ current.featureIds.length >= STORE_CHUNK_TARGET) {
319
+ current = createChunkEntry(kind);
320
+ chunks.push(current);
321
+ }
322
+ current.featureIds.push(feature.id);
323
+ featureToChunk.set(feature.id, chunks.length - 1);
324
+ }
325
+ return { chunks, featureToChunk };
326
+ }
327
+ /**
328
+ * The features of a layer in draw order (visible and not locally hidden)
329
+ *
330
+ * It is never called in a frame where the cache is complete.
331
+ */
332
+ getLayerFeatures(layerId) {
333
+ if (!this.featuresByLayer) {
334
+ const byLayer = new Map();
335
+ for (const feature of getDisplayFeatures(this.store)) {
336
+ const list = byLayer.get(feature.layerId);
337
+ if (list)
338
+ list.push(feature);
339
+ else
340
+ byLayer.set(feature.layerId, [feature]);
341
+ }
342
+ this.featuresByLayer = byLayer;
343
+ }
344
+ return this.featuresByLayer.get(layerId) ?? [];
345
+ }
346
+ /**
347
+ * Builds the retained batch of a chunk
348
+ */
349
+ buildChunk(chunk, layer, deps) {
350
+ const styles = deps.renderers.styles;
351
+ // Re-evaluate the classification (a safety net for when the rebuild was triggered by a change
352
+ // of properties)
353
+ const features = [];
354
+ for (const id of chunk.featureIds) {
355
+ const feature = this.store.getFeature(id);
356
+ if (!feature?.visible || isLocallyHidden(feature, this.store))
357
+ return 'mismatch';
358
+ if (classifyFeature(feature, styles, deps.customRenderers, deps.companions, layer) !==
359
+ chunk.kind) {
360
+ return 'mismatch';
361
+ }
362
+ features.push(feature);
363
+ }
364
+ this.disposeChunk(chunk);
365
+ chunk.bbox = computeFeaturesBBox(features, this.extensions);
366
+ // The origin is the center of the extent (or the one chosen for the view), not the first
367
+ // feature: the error of the baked offsets grows with the distance from it
368
+ const origin = chunk.viewOrigin ??
369
+ (chunk.bbox ? boundsCenter(chunkBBoxToBounds(chunk.bbox)) : featureOrigin(features[0]));
370
+ chunk.origin = origin;
371
+ const result = buildChunkBatch(chunk, features, layer, origin, deps.renderers);
372
+ if (result !== 'retry')
373
+ chunk.dirty = false;
374
+ return result;
375
+ }
376
+ /**
377
+ * Builds a retained chunk again around the view when its origin leaves a visible error
378
+ *
379
+ * A chunk is cut in draw order, so its extent can be wide; seen at high zoom, the vertices on
380
+ * screen can then be degrees away from the origin. The rule and the tolerance are in
381
+ * `view/shaders/retained-origin.ts`. A chunk that cannot be rebuilt now stays dirty and is
382
+ * drawn in immediate mode (exact) until the next frame.
383
+ */
384
+ rebaseForView(chunk, layer, zoom, deps, viewportBounds) {
385
+ if (chunk.kind === 'immediate' || chunk.dirty || !chunk.origin || !chunk.bbox)
386
+ return;
387
+ if (chunk.rebasedFrame === this.frame)
388
+ return;
389
+ const next = rebasedRetainedOrigin(chunk.origin, chunkBBoxToBounds(chunk.bbox), viewportBounds ?? null, zoom);
390
+ if (!next)
391
+ return;
392
+ chunk.viewOrigin = next;
393
+ chunk.rebasedFrame = this.frame;
394
+ chunk.dirty = true;
395
+ this.buildChunk(chunk, layer, deps);
396
+ }
397
+ /**
398
+ * Releases the retained batch of a chunk
399
+ */
400
+ disposeChunk(chunk) {
401
+ disposeChunkBatches(chunk, this.renderers);
402
+ }
403
+ /**
404
+ * Queues a vertex movement as a diff patch against the retained batch of its chunk
405
+ *
406
+ * The conditions are in queueCoordPatch. false = the caller rebuilds the chunk.
407
+ */
408
+ tryQueueCoordPatch(feature, previous) {
409
+ const cache = this.layers.get(feature.layerId);
410
+ const index = cache?.featureToChunk.get(feature.id);
411
+ const chunk = index === undefined ? undefined : cache?.chunks[index];
412
+ return queueCoordPatch(chunk, feature, previous, this.renderers?.line ?? null);
413
+ }
414
+ /**
415
+ * Marks the chunk that carries the feature as dirty
416
+ *
417
+ * If there is no corresponding chunk, the whole layer is rebuilt.
418
+ */
419
+ markFeatureDirty(layerId, featureId) {
420
+ const cache = this.layers.get(layerId);
421
+ if (!cache)
422
+ return;
423
+ const index = cache.featureToChunk.get(featureId);
424
+ if (index === undefined) {
425
+ this.invalidateLayer(layerId);
426
+ return;
427
+ }
428
+ cache.chunks[index].dirty = true;
429
+ }
430
+ }
@@ -0,0 +1 @@
1
+ export {};