@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,320 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { destinationPoint } from '../../geometry/index.js';
4
+ import { generateCirclePolygon } from '../../shared/math/index.js';
5
+ import { FillShaderManager } from '../renderers/polygon/fill.js';
6
+ /**
7
+ * The dotted pattern: an 8px line and a 6px gap
8
+ */
9
+ const TENTATIVE_DASH_ARRAY = [8, 6];
10
+ /**
11
+ * The Tentative rendering class
12
+ *
13
+ * Draws the tentative state while drawing (points, lines, polygons)
14
+ *
15
+ * @internal
16
+ */
17
+ export class TentativeRenderer {
18
+ constructor(deps) {
19
+ Object.defineProperty(this, "sdfLineRenderer", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: void 0
24
+ });
25
+ Object.defineProperty(this, "pointShapeRenderer", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ /** The style of confirmed lines (solid) */
32
+ Object.defineProperty(this, "strokeStyle", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ /** The style of unconfirmed lines (dotted) */
39
+ Object.defineProperty(this, "tentativeStrokeStyle", {
40
+ enumerable: true,
41
+ configurable: true,
42
+ writable: true,
43
+ value: void 0
44
+ });
45
+ Object.defineProperty(this, "vertexStyle", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: void 0
50
+ });
51
+ /** The style of a highlighted vertex */
52
+ Object.defineProperty(this, "highlightedVertexStyle", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: void 0
57
+ });
58
+ /** For Circle: the style of the center marker */
59
+ Object.defineProperty(this, "circleCenterMarkerStyle", {
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true,
63
+ value: void 0
64
+ });
65
+ /** For Circle: the style of the radius change handle */
66
+ Object.defineProperty(this, "circleRadiusHandleStyle", {
67
+ enumerable: true,
68
+ configurable: true,
69
+ writable: true,
70
+ value: void 0
71
+ });
72
+ Object.defineProperty(this, "fillColor", {
73
+ enumerable: true,
74
+ configurable: true,
75
+ writable: true,
76
+ value: void 0
77
+ });
78
+ Object.defineProperty(this, "fillShaderManager", {
79
+ enumerable: true,
80
+ configurable: true,
81
+ writable: true,
82
+ value: void 0
83
+ });
84
+ this.sdfLineRenderer = deps.sdfLineRenderer;
85
+ this.pointShapeRenderer = deps.pointShapeRenderer;
86
+ this.strokeStyle = deps.tentativeStyle.stroke;
87
+ // The style of unconfirmed lines (the dotted pattern is set to match the specification)
88
+ this.tentativeStrokeStyle = {
89
+ ...deps.tentativeStyle.tentativeStroke,
90
+ dashArray: TENTATIVE_DASH_ARRAY,
91
+ };
92
+ this.vertexStyle = deps.tentativeStyle.vertex;
93
+ this.highlightedVertexStyle = deps.tentativeStyle.highlightedVertex;
94
+ this.circleCenterMarkerStyle = deps.tentativeStyle.circleCenterMarker;
95
+ this.circleRadiusHandleStyle = deps.tentativeStyle.circleRadiusHandle;
96
+ // The fill color for Tentative (translucent pink)
97
+ this.fillColor = [1.0, 0.176, 0.333, 0.2];
98
+ this.fillShaderManager = new FillShaderManager(deps.gl, deps.terrain);
99
+ }
100
+ /**
101
+ * Make sure the shader exists
102
+ */
103
+ ensureShader(shaderData) {
104
+ this.fillShaderManager.ensureShader(shaderData);
105
+ }
106
+ /**
107
+ * Set the uniforms for offset mode
108
+ */
109
+ setOffsetUniforms(uniforms) {
110
+ this.fillShaderManager.setOffsetUniforms(uniforms);
111
+ }
112
+ /**
113
+ * Draw only the lines and the fill of the Tentative (excluding the vertices)
114
+ *
115
+ * Used by the rendering that follows the layer order. The vertices are drawn separately
116
+ * in the foreground by drawVertices().
117
+ */
118
+ drawGeometry(tentative, projectionData, zoom) {
119
+ if (tentative.type === 'Point') {
120
+ // A Point is only vertices, so nothing is drawn for the geometry
121
+ return;
122
+ }
123
+ else if (tentative.type === 'LineString') {
124
+ this.drawLineStringGeometry(tentative, projectionData, zoom);
125
+ }
126
+ else if (tentative.type === 'Polygon') {
127
+ this.drawPolygonGeometry(tentative, projectionData, zoom);
128
+ }
129
+ else if (tentative.type === 'Circle') {
130
+ this.drawCircleGeometry(tentative, projectionData, zoom);
131
+ }
132
+ else if (tentative.type === 'Freehand') {
133
+ this.drawFreehandGeometry(tentative, projectionData, zoom);
134
+ }
135
+ }
136
+ /**
137
+ * Draw only the vertices of the Tentative
138
+ *
139
+ * Called after the selection UI so that they are shown in the foreground.
140
+ */
141
+ drawVertices(tentative, zoom) {
142
+ if (tentative.type === 'Point') {
143
+ const coord = tentative.coordinates;
144
+ this.drawPointShape(coord, this.vertexStyle, zoom);
145
+ }
146
+ else if (tentative.type === 'LineString') {
147
+ this.drawLineStringVertices(tentative, zoom);
148
+ }
149
+ else if (tentative.type === 'Polygon') {
150
+ this.drawPolygonVertices(tentative, zoom);
151
+ }
152
+ else if (tentative.type === 'Circle') {
153
+ this.drawCircleVertices(tentative, zoom);
154
+ }
155
+ else if (tentative.type === 'Freehand') {
156
+ // Freehand is lines only and does not draw vertices (the existing behavior is kept)
157
+ }
158
+ }
159
+ /**
160
+ * Draw a Point shape
161
+ */
162
+ drawPointShape(coord, style, zoom) {
163
+ this.pointShapeRenderer.draw(coord, style, zoom);
164
+ }
165
+ /**
166
+ * Tentative rendering of a LineString (lines only, no vertices)
167
+ */
168
+ drawLineStringGeometry(tentative, projectionData, zoom) {
169
+ const coords = tentative.coordinates;
170
+ const confirmedCount = tentative.confirmedCount ?? coords.length;
171
+ // Draw solid lines between the confirmed vertices
172
+ if (confirmedCount >= 2) {
173
+ const confirmedCoords = coords.slice(0, confirmedCount);
174
+ this.sdfLineRenderer.draw(confirmedCoords, this.strokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
175
+ }
176
+ // Draw a dotted line from the last confirmed vertex to the cursor position (GPU implementation)
177
+ if (confirmedCount >= 1 && coords.length > confirmedCount) {
178
+ const tentativeCoords = [
179
+ coords[confirmedCount - 1],
180
+ coords[coords.length - 1],
181
+ ];
182
+ this.sdfLineRenderer.draw(tentativeCoords, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
183
+ }
184
+ }
185
+ /**
186
+ * Tentative rendering of the vertices of a LineString
187
+ */
188
+ drawLineStringVertices(tentative, zoom) {
189
+ const coords = tentative.coordinates;
190
+ const highlightedIndex = tentative.highlightedVertexIndex;
191
+ // Draw the vertices (the highlighted one has a different style)
192
+ for (let i = 0; i < coords.length; i++) {
193
+ const style = i === highlightedIndex ? this.highlightedVertexStyle : this.vertexStyle;
194
+ this.drawPointShape(coords[i], style, zoom);
195
+ }
196
+ }
197
+ /**
198
+ * Tentative rendering of a Polygon (lines and fill only, no vertices)
199
+ */
200
+ drawPolygonGeometry(tentative, projectionData, zoom) {
201
+ const rings = tentative.coordinates;
202
+ const outerRing = rings[0];
203
+ if (!outerRing || outerRing.length < 2) {
204
+ return;
205
+ }
206
+ // confirmedCount is the number of coordinates before closing (outerRing is a closed
207
+ // ring, so the first point is appended at the end)
208
+ const confirmedCount = tentative.confirmedCount ?? outerRing.length - 1;
209
+ // Fill from 3 points or more (4 points or more when closed)
210
+ if (outerRing.length >= 4) {
211
+ this.fillShaderManager.drawPolygon(outerRing, this.fillColor, projectionData, zoom);
212
+ }
213
+ // Draw solid lines between the confirmed vertices (when there are 2 or more of them)
214
+ if (confirmedCount >= 2) {
215
+ const confirmedCoords = outerRing.slice(0, confirmedCount);
216
+ this.sdfLineRenderer.draw(confirmedCoords, this.strokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
217
+ }
218
+ // Draw the unconfirmed lines dotted (GPU implementation)
219
+ // The last confirmed vertex (confirmedCount-1) -> the cursor position
220
+ // (confirmedCount) -> the first vertex (0)
221
+ if (confirmedCount >= 1 && outerRing.length > confirmedCount) {
222
+ // From the last confirmed vertex to the cursor position
223
+ const lastConfirmedToMouse = [
224
+ outerRing[confirmedCount - 1],
225
+ outerRing[confirmedCount],
226
+ ];
227
+ this.sdfLineRenderer.draw(lastConfirmedToMouse, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
228
+ // The closing line from the cursor position to the first vertex
229
+ const mouseToFirst = [
230
+ outerRing[confirmedCount],
231
+ outerRing[0],
232
+ ];
233
+ this.sdfLineRenderer.draw(mouseToFirst, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
234
+ }
235
+ }
236
+ /**
237
+ * Tentative rendering of the vertices of a Polygon
238
+ */
239
+ drawPolygonVertices(tentative, zoom) {
240
+ const rings = tentative.coordinates;
241
+ const outerRing = rings[0];
242
+ if (!outerRing || outerRing.length < 1) {
243
+ return;
244
+ }
245
+ // Draw the vertices (the closing point duplicates the first vertex, so it is excluded;
246
+ // the highlighted one has a different style)
247
+ const uniqueVertexCount = outerRing.length > 1 ? outerRing.length - 1 : outerRing.length;
248
+ const highlightedIndex = tentative.highlightedVertexIndex;
249
+ for (let i = 0; i < uniqueVertexCount; i++) {
250
+ const style = i === highlightedIndex ? this.highlightedVertexStyle : this.vertexStyle;
251
+ this.drawPointShape(outerRing[i], style, zoom);
252
+ }
253
+ }
254
+ /**
255
+ * Tentative rendering of a Circle (lines and fill only, no vertices)
256
+ */
257
+ drawCircleGeometry(tentative, projectionData, zoom) {
258
+ const center = tentative.coordinates;
259
+ const radiusMeters = tentative.radiusMeters ?? 0;
260
+ const radiusHandleAngle = tentative.radiusHandleAngle ?? 135;
261
+ // The circle and the radius line are drawn only when the radius is greater than 0
262
+ if (radiusMeters > 0) {
263
+ // The preview of the circle (the fill)
264
+ const circleCoords = generateCirclePolygon(center, radiusMeters);
265
+ if (circleCoords.length >= 4) {
266
+ this.fillShaderManager.drawPolygon(circleCoords, this.fillColor, projectionData, zoom);
267
+ }
268
+ // The stroke of the circle
269
+ this.sdfLineRenderer.draw(circleCoords, this.strokeStyle, { widthUnit: 'pixels', closed: true }, zoom, projectionData);
270
+ // Compute the position of the radius change handle (on the geodesic outline)
271
+ const handlePosition = destinationPoint(center, radiusMeters, radiusHandleAngle);
272
+ // Draw the radius line (dotted) (GPU implementation)
273
+ const radiusLine = [
274
+ center,
275
+ handlePosition,
276
+ ];
277
+ this.sdfLineRenderer.draw(radiusLine, this.tentativeStrokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
278
+ }
279
+ }
280
+ /**
281
+ * Tentative rendering of the vertices of a Circle
282
+ */
283
+ drawCircleVertices(tentative, zoom) {
284
+ const center = tentative.coordinates;
285
+ const radiusMeters = tentative.radiusMeters ?? 0;
286
+ const radiusHandleAngle = tentative.radiusHandleAngle ?? 135;
287
+ if (radiusMeters > 0) {
288
+ // Compute the position of the radius change handle (on the geodesic outline)
289
+ const handlePosition = destinationPoint(center, radiusMeters, radiusHandleAngle);
290
+ // Draw the center marker (shown below the radius change handle)
291
+ this.drawPointShape(center, this.circleCenterMarkerStyle, zoom);
292
+ // Draw the radius change handle (shown above the center marker)
293
+ this.drawPointShape(handlePosition, this.circleRadiusHandleStyle, zoom);
294
+ }
295
+ else {
296
+ // When the radius is 0, only the radius change handle is shown at the center position
297
+ this.drawPointShape(center, this.circleCenterMarkerStyle, zoom);
298
+ this.drawPointShape(center, this.circleRadiusHandleStyle, zoom);
299
+ }
300
+ }
301
+ /**
302
+ * Tentative rendering of a Freehand (lines only)
303
+ *
304
+ * Freehand does not draw vertices, so geometry and tentative are the same
305
+ */
306
+ drawFreehandGeometry(tentative, projectionData, zoom) {
307
+ const coords = tentative.coordinates;
308
+ if (coords.length < 2) {
309
+ return;
310
+ }
311
+ // Draw the line
312
+ this.sdfLineRenderer.draw(coords, this.strokeStyle, { widthUnit: 'pixels', closed: false }, zoom, projectionData);
313
+ }
314
+ /**
315
+ * Release the resources
316
+ */
317
+ dispose() {
318
+ this.fillShaderManager.dispose();
319
+ }
320
+ }
@@ -0,0 +1,119 @@
1
+ /**
2
+ * ViewportFilter
3
+ *
4
+ * Filters down to only the features inside the viewport.
5
+ * It uses an expanded viewport and the SpatialIndex as a performance optimization.
6
+ */
7
+ import type { Map as MapLibreMap } from 'maplibre-gl';
8
+ import type { SpatialIndex } from '../store/spatial/spatial-index.js';
9
+ import type { BoundingBox } from '../store/types.js';
10
+ /**
11
+ * The factor by which the render loop widens the viewport for rendering and culling: 2.
12
+ *
13
+ * To prevent flicker while panning and zooming, rendering and culling use the range
14
+ * obtained by widening the real viewport by this factor.
15
+ */
16
+ export declare const DEFAULT_VIEWPORT_EXPANSION_FACTOR = 2;
17
+ /**
18
+ * Dependencies of ViewportFilter
19
+ */
20
+ export interface ViewportFilterDeps {
21
+ map: MapLibreMap;
22
+ spatialIndex: SpatialIndex;
23
+ }
24
+ export { nearestLongitude, wrapLongitude } from '../shared/math/longitude.js';
25
+ /**
26
+ * One copy of the world that a view covers
27
+ *
28
+ * `lngShift` is how far the stored longitudes are moved to be drawn there (0 for the stored
29
+ * copy, 360 for the copy east of the antimeridian, -360 for the copy west of it), and
30
+ * `minX` / `maxX` is the view seen from that copy, in stored longitudes.
31
+ */
32
+ export interface LongitudeCopy {
33
+ readonly lngShift: number;
34
+ readonly minX: number;
35
+ readonly maxX: number;
36
+ }
37
+ /**
38
+ * Splits an unwrapped longitude range into the copies of the world it covers
39
+ *
40
+ * The features are stored with longitudes in [-180, 180], while the view of the map is a
41
+ * continuous range that can run past the antimeridian (170 to 190, for example). Such a view
42
+ * covers two copies: the stored copy, and the copy moved by 360 degrees, which shows the
43
+ * stored longitudes -190 to -170 (that is, -180 to -170). Each copy is the whole view moved
44
+ * back by its shift, so a longitude falls in the view of at most one copy (the view is less
45
+ * than 360 degrees wide) and nothing is drawn twice; a longitude stored beyond ±180 is still
46
+ * found on the copy that shows it. A range 360 degrees wide or more is the regime of world
47
+ * copies, which are not replicated: it gives the stored copy, whole.
48
+ *
49
+ * @param west The west edge (unwrapped)
50
+ * @param east The east edge (unwrapped, at least west)
51
+ * @returns One or two copies, from the westmost shift
52
+ */
53
+ export declare function splitLongitudeCopies(west: number, east: number): LongitudeCopy[];
54
+ /**
55
+ * Splits an unwrapped longitude range into the ranges of stored longitudes it shows
56
+ *
57
+ * The ranges of `splitLongitudeCopies`, without the shift: the narrowing down by the
58
+ * spatial index queries each of them.
59
+ *
60
+ * @param west The west edge (unwrapped)
61
+ * @param east The east edge (unwrapped, at least west)
62
+ * @returns One or two ranges `[west, east]` (west <= east)
63
+ */
64
+ export declare function splitLongitudeRange(west: number, east: number): Array<[number, number]>;
65
+ /**
66
+ * The part of the view on one copy of the world (see `splitLongitudeCopies`)
67
+ */
68
+ export interface ViewportCopy {
69
+ /** How far the stored longitudes are moved to be drawn on this copy */
70
+ readonly lngShift: number;
71
+ /** The part of the view on this copy, in stored longitudes */
72
+ readonly bounds: BoundingBox;
73
+ }
74
+ /**
75
+ * Computes the copies of the world the current viewport covers, expanded
76
+ *
77
+ * Away from the antimeridian this is the stored copy alone. A view across it gives two:
78
+ * the rendering draws the features of each copy with that copy's shift. When the expanded
79
+ * view is 360 degrees wide or more, the longitudes of the view itself are used; when those are
80
+ * still too wide, it is the regime of world copies and the stored copy is drawn alone.
81
+ *
82
+ * The latitudes keep the expansion in every case. On the globe the whole sphere is often in
83
+ * view, so the longitudes span 360 degrees, and the bounds maplibre reports fall short of the
84
+ * edge of the sphere by a degree or two: without the margin the points between the bounds and
85
+ * the edge were culled and vanished, while a line reaching there was kept by the rest of its
86
+ * box.
87
+ *
88
+ * @param map The MapLibre Map
89
+ * @param expansionFactor The expansion factor
90
+ */
91
+ export declare function getViewportCopies(map: MapLibreMap, expansionFactor: number): ViewportCopy[];
92
+ /**
93
+ * Computes the ranges of the current viewport, expanded (one, or two across the antimeridian)
94
+ *
95
+ * The narrowing down by the spatial index queries every range, so the features on both sides
96
+ * of the antimeridian are found.
97
+ *
98
+ * @param map The MapLibre Map
99
+ * @param expansionFactor The expansion factor
100
+ */
101
+ export declare function getExpandedViewportRanges(map: MapLibreMap, expansionFactor: number): BoundingBox[];
102
+ /**
103
+ * Returns the current viewport of a map widened by a factor, as one range in degrees.
104
+ *
105
+ * This gathers the way the render loop obtains the viewport into one place, so that
106
+ * the narrowing down of features (ViewportFilter) and the culling of
107
+ * datasets look at the same range.
108
+ *
109
+ * A single bbox cannot hold the two ranges of a view across the antimeridian, so it
110
+ * covers every longitude in that case (the thinning keeps everything in the latitude
111
+ * band; nothing on either side of the line is dropped). `getExpandedViewportRanges`
112
+ * gives the exact ranges.
113
+ *
114
+ * @param map The MapLibre Map
115
+ * @param expansionFactor The factor applied to the width and height of the viewport (1 = the
116
+ * viewport itself)
117
+ * @returns The range in degrees (`minX` / `maxX` longitudes, `minY` / `maxY` latitudes)
118
+ */
119
+ export declare function getExpandedViewportBounds(map: MapLibreMap, expansionFactor: number): BoundingBox;
@@ -0,0 +1,254 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { LngLatBounds as LngLatBoundsClass } from 'maplibre-gl';
4
+ /**
5
+ * The factor by which the render loop widens the viewport for rendering and culling: 2.
6
+ *
7
+ * To prevent flicker while panning and zooming, rendering and culling use the range
8
+ * obtained by widening the real viewport by this factor.
9
+ */
10
+ export const DEFAULT_VIEWPORT_EXPANSION_FACTOR = 2.0;
11
+ /**
12
+ * Expands LngLatBounds by the given factor
13
+ *
14
+ * To prevent flicker while panning and zooming, the viewport is expanded so that
15
+ * off-screen features are included in the render set in advance.
16
+ *
17
+ * Only the latitude is clamped (to -90..90). The longitude keeps the unwrapped values
18
+ * that maplibre returns: a view across the antimeridian has an east edge above 180 (or a
19
+ * west edge below -180), and clamping it would cut the other side of the line off.
20
+ * `splitLongitudeRange` turns the result into ranges of [-180, 180].
21
+ *
22
+ * @param bounds The original bounding box
23
+ * @param factor The expansion factor (2.0 = expand to twice the size)
24
+ * @returns The expanded bounding box
25
+ *
26
+ * @internal
27
+ */
28
+ export function expandBounds(bounds, factor) {
29
+ const sw = bounds.getSouthWest();
30
+ const ne = bounds.getNorthEast();
31
+ const width = ne.lng - sw.lng;
32
+ const height = ne.lat - sw.lat;
33
+ const widthPadding = (width * (factor - 1)) / 2;
34
+ const heightPadding = (height * (factor - 1)) / 2;
35
+ const clampLat = (lat) => Math.max(-90, Math.min(90, lat));
36
+ return new LngLatBoundsClass([sw.lng - widthPadding, clampLat(sw.lat - heightPadding)], [ne.lng + widthPadding, clampLat(ne.lat + heightPadding)]);
37
+ }
38
+ // The longitude helpers are pure math, defined in shared/ (dispatcher/ and snapping/ use
39
+ // them too); re-exported here for the existing imports
40
+ export { nearestLongitude, wrapLongitude } from '../shared/math/longitude.js';
41
+ /**
42
+ * Splits an unwrapped longitude range into the copies of the world it covers
43
+ *
44
+ * The features are stored with longitudes in [-180, 180], while the view of the map is a
45
+ * continuous range that can run past the antimeridian (170 to 190, for example). Such a view
46
+ * covers two copies: the stored copy, and the copy moved by 360 degrees, which shows the
47
+ * stored longitudes -190 to -170 (that is, -180 to -170). Each copy is the whole view moved
48
+ * back by its shift, so a longitude falls in the view of at most one copy (the view is less
49
+ * than 360 degrees wide) and nothing is drawn twice; a longitude stored beyond ±180 is still
50
+ * found on the copy that shows it. A range 360 degrees wide or more is the regime of world
51
+ * copies, which are not replicated: it gives the stored copy, whole.
52
+ *
53
+ * @param west The west edge (unwrapped)
54
+ * @param east The east edge (unwrapped, at least west)
55
+ * @returns One or two copies, from the westmost shift
56
+ */
57
+ export function splitLongitudeCopies(west, east) {
58
+ if (!(east - west < 360))
59
+ return [{ lngShift: 0, minX: -180, maxX: 180 }];
60
+ const copies = [];
61
+ const first = Math.ceil((west - 180) / 360);
62
+ const last = Math.floor((east + 180) / 360);
63
+ for (let turn = first; turn <= last; turn++) {
64
+ // (+ 0 turns the -0 of Math.ceil into 0)
65
+ const shift = turn * 360 + 0;
66
+ const minX = west - shift;
67
+ const maxX = east - shift;
68
+ // A copy whose view only touches the stored range at its edge adds nothing
69
+ if (Math.min(maxX, 180) > Math.max(minX, -180) || (copies.length === 0 && turn === last)) {
70
+ copies.push({ lngShift: shift, minX, maxX });
71
+ }
72
+ }
73
+ return copies;
74
+ }
75
+ /**
76
+ * Splits an unwrapped longitude range into the ranges of stored longitudes it shows
77
+ *
78
+ * The ranges of `splitLongitudeCopies`, without the shift: the narrowing down by the
79
+ * spatial index queries each of them.
80
+ *
81
+ * @param west The west edge (unwrapped)
82
+ * @param east The east edge (unwrapped, at least west)
83
+ * @returns One or two ranges `[west, east]` (west <= east)
84
+ */
85
+ export function splitLongitudeRange(west, east) {
86
+ return splitLongitudeCopies(west, east).map((copy) => [copy.minX, copy.maxX]);
87
+ }
88
+ /**
89
+ * Computes the copies of the world the current viewport covers, expanded
90
+ *
91
+ * Away from the antimeridian this is the stored copy alone. A view across it gives two:
92
+ * the rendering draws the features of each copy with that copy's shift. When the expanded
93
+ * view is 360 degrees wide or more, the longitudes of the view itself are used; when those are
94
+ * still too wide, it is the regime of world copies and the stored copy is drawn alone.
95
+ *
96
+ * The latitudes keep the expansion in every case. On the globe the whole sphere is often in
97
+ * view, so the longitudes span 360 degrees, and the bounds maplibre reports fall short of the
98
+ * edge of the sphere by a degree or two: without the margin the points between the bounds and
99
+ * the edge were culled and vanished, while a line reaching there was kept by the rest of its
100
+ * box.
101
+ *
102
+ * @param map The MapLibre Map
103
+ * @param expansionFactor The expansion factor
104
+ */
105
+ export function getViewportCopies(map, expansionFactor) {
106
+ const view = map.getBounds();
107
+ const expanded = expandBounds(view, expansionFactor);
108
+ const tooWide = !(expanded.getEast() - expanded.getWest() < 360);
109
+ const west = tooWide ? view.getWest() : expanded.getWest();
110
+ const east = tooWide ? view.getEast() : expanded.getEast();
111
+ const minY = expanded.getSouth();
112
+ const maxY = expanded.getNorth();
113
+ return splitLongitudeCopies(west, east).map((copy) => ({
114
+ lngShift: copy.lngShift,
115
+ bounds: { minX: copy.minX, minY, maxX: copy.maxX, maxY },
116
+ }));
117
+ }
118
+ /**
119
+ * Computes the ranges of the current viewport, expanded (one, or two across the antimeridian)
120
+ *
121
+ * The narrowing down by the spatial index queries every range, so the features on both sides
122
+ * of the antimeridian are found.
123
+ *
124
+ * @param map The MapLibre Map
125
+ * @param expansionFactor The expansion factor
126
+ */
127
+ export function getExpandedViewportRanges(map, expansionFactor) {
128
+ return getViewportCopies(map, expansionFactor).map((copy) => copy.bounds);
129
+ }
130
+ /**
131
+ * Returns the current viewport of a map widened by a factor, as one range in degrees.
132
+ *
133
+ * This gathers the way the render loop obtains the viewport into one place, so that
134
+ * the narrowing down of features (ViewportFilter) and the culling of
135
+ * datasets look at the same range.
136
+ *
137
+ * A single bbox cannot hold the two ranges of a view across the antimeridian, so it
138
+ * covers every longitude in that case (the thinning keeps everything in the latitude
139
+ * band; nothing on either side of the line is dropped). `getExpandedViewportRanges`
140
+ * gives the exact ranges.
141
+ *
142
+ * @param map The MapLibre Map
143
+ * @param expansionFactor The factor applied to the width and height of the viewport (1 = the
144
+ * viewport itself)
145
+ * @returns The range in degrees (`minX` / `maxX` longitudes, `minY` / `maxY` latitudes)
146
+ */
147
+ export function getExpandedViewportBounds(map, expansionFactor) {
148
+ return hullOf(getExpandedViewportRanges(map, expansionFactor));
149
+ }
150
+ /** The bbox of one or two ranges (two ranges together cover every stored longitude) */
151
+ function hullOf(ranges) {
152
+ if (ranges.length === 1)
153
+ return ranges[0];
154
+ let minX = Number.POSITIVE_INFINITY;
155
+ let maxX = Number.NEGATIVE_INFINITY;
156
+ for (const range of ranges) {
157
+ minX = Math.min(minX, range.minX);
158
+ maxX = Math.max(maxX, range.maxX);
159
+ }
160
+ return { minX, minY: ranges[0].minY, maxX, maxY: ranges[0].maxY };
161
+ }
162
+ /**
163
+ * ViewportFilter
164
+ *
165
+ * The class that filters features down to those inside the viewport.
166
+ *
167
+ * @internal
168
+ */
169
+ export class ViewportFilter {
170
+ /**
171
+ * @param deps The dependencies
172
+ * @param expansionFactor The viewport expansion factor (default: 2.0)
173
+ */
174
+ constructor(deps, expansionFactor = DEFAULT_VIEWPORT_EXPANSION_FACTOR) {
175
+ Object.defineProperty(this, "map", {
176
+ enumerable: true,
177
+ configurable: true,
178
+ writable: true,
179
+ value: void 0
180
+ });
181
+ Object.defineProperty(this, "spatialIndex", {
182
+ enumerable: true,
183
+ configurable: true,
184
+ writable: true,
185
+ value: void 0
186
+ });
187
+ Object.defineProperty(this, "expansionFactor", {
188
+ enumerable: true,
189
+ configurable: true,
190
+ writable: true,
191
+ value: void 0
192
+ });
193
+ this.map = deps.map;
194
+ this.spatialIndex = deps.spatialIndex;
195
+ this.expansionFactor = expansionFactor;
196
+ }
197
+ /**
198
+ * Gets the Set of feature IDs that exist inside the current viewport
199
+ *
200
+ * @returns The Set of feature IDs inside the viewport
201
+ */
202
+ getVisibleIds() {
203
+ // Across the antimeridian the view is two ranges, and each is queried
204
+ const ids = new Set();
205
+ for (const range of getExpandedViewportRanges(this.map, this.expansionFactor)) {
206
+ for (const id of this.spatialIndex.findInBounds(range))
207
+ ids.add(id);
208
+ }
209
+ return ids;
210
+ }
211
+ /**
212
+ * Gets the copies of the world the current expanded viewport covers
213
+ *
214
+ * One copy (the stored one) away from the antimeridian, two across it
215
+ * (see getViewportCopies).
216
+ */
217
+ getCopies() {
218
+ return getViewportCopies(this.map, this.expansionFactor);
219
+ }
220
+ /**
221
+ * Gets the Set of feature IDs inside a range of stored longitudes (one copy of the view)
222
+ */
223
+ getVisibleIdsIn(bounds) {
224
+ return new Set(this.spatialIndex.findInBounds(bounds));
225
+ }
226
+ /**
227
+ * Gets the bbox of the current expanded viewport
228
+ *
229
+ * Across the antimeridian it covers every longitude (see getExpandedViewportBounds).
230
+ */
231
+ getBounds() {
232
+ return getExpandedViewportBounds(this.map, this.expansionFactor);
233
+ }
234
+ /**
235
+ * Filters an array of features down to those inside the viewport
236
+ *
237
+ * The filtering preserves the draw order.
238
+ *
239
+ * @param features The array of features to filter
240
+ * @returns The array of features inside the viewport
241
+ */
242
+ filter(features) {
243
+ const visibleIds = this.getVisibleIds();
244
+ return features.filter((f) => visibleIds.has(f.id));
245
+ }
246
+ }
247
+ /**
248
+ * Creates a ViewportFilter
249
+ *
250
+ * @internal
251
+ */
252
+ export function createViewportFilter(deps, expansionFactor) {
253
+ return new ViewportFilter(deps, expansionFactor);
254
+ }