@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,336 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * PolygonBatchRenderer
5
+ *
6
+ * A renderer that draws multiple polygon fills in a single draw call.
7
+ * By using per-vertex color, polygons of different colors can also be drawn in one go.
8
+ * The draw order is preserved by the order in which the vertices are laid out.
9
+ */
10
+ import earcut from 'earcut';
11
+ import { EarcutCache } from '../../cache/earcut.js';
12
+ import { getSurfaceTessellationStep, tessellateSurfaceFill } from '../../globe-subdivision.js';
13
+ import { calculateLngLatOffset, createProgram, getProjectionTransitionUniform, OFFSET_MODE_GLSL, } from '../../shaders/helpers.js';
14
+ import { ProjectionUniformManager } from '../../shaders/projection.js';
15
+ import { TERRAIN_SHADE_FRAGMENT_GLSL, TERRAIN_SHADE_VERTEX_GLSL, } from '../../shaders/terrain-shade.js';
16
+ import { TerrainContext } from '../../terrain/context.js';
17
+ import { TERRAIN_MAX_TILED_COARSEN } from '../../terrain/metrics.js';
18
+ import { batchTessellationFactor, ringBoundingCells } from '../../terrain/polygon.js';
19
+ import { reportTerrainCoarsening } from '../../terrain/state.js';
20
+ import { buildEarcutInput } from './earcut-input.js';
21
+ import { drawFillWithTerrainCull } from './terrain-cull.js';
22
+ /** @internal */
23
+ export class PolygonBatchRenderer {
24
+ constructor(gl, scope = {}) {
25
+ Object.defineProperty(this, "gl", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ /** The terrain state of the draw instance */
32
+ Object.defineProperty(this, "terrain", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ /** Triangulation results of the draw instance, keyed by feature id */
39
+ Object.defineProperty(this, "earcutCache", {
40
+ enumerable: true,
41
+ configurable: true,
42
+ writable: true,
43
+ value: void 0
44
+ });
45
+ Object.defineProperty(this, "program", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: null
50
+ });
51
+ Object.defineProperty(this, "variantName", {
52
+ enumerable: true,
53
+ configurable: true,
54
+ writable: true,
55
+ value: ''
56
+ });
57
+ // Projection uniform management
58
+ Object.defineProperty(this, "projectionUniformManager", {
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true,
62
+ value: void 0
63
+ });
64
+ // Stores the offset uniforms
65
+ Object.defineProperty(this, "offsetUniforms", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: null
70
+ });
71
+ // Buffers for the batch
72
+ Object.defineProperty(this, "vertexBuffer", {
73
+ enumerable: true,
74
+ configurable: true,
75
+ writable: true,
76
+ value: null
77
+ });
78
+ Object.defineProperty(this, "indexBuffer", {
79
+ enumerable: true,
80
+ configurable: true,
81
+ writable: true,
82
+ value: null
83
+ });
84
+ Object.defineProperty(this, "vao", {
85
+ enumerable: true,
86
+ configurable: true,
87
+ writable: true,
88
+ value: null
89
+ });
90
+ this.gl = gl;
91
+ this.terrain = scope.terrain ?? new TerrainContext();
92
+ this.earcutCache = scope.earcut ?? new EarcutCache();
93
+ this.projectionUniformManager = new ProjectionUniformManager(gl, {
94
+ surface: true,
95
+ terrain: this.terrain,
96
+ });
97
+ this.vertexBuffer = gl.createBuffer();
98
+ this.indexBuffer = gl.createBuffer();
99
+ this.vao = gl.createVertexArray();
100
+ }
101
+ /**
102
+ * Ensures the shader (recreating it when necessary)
103
+ */
104
+ ensureShader(shaderData) {
105
+ if (this.variantName !== shaderData.variantName) {
106
+ if (this.program) {
107
+ this.gl.deleteProgram(this.program);
108
+ }
109
+ this.program = this.createShaderProgram(shaderData.vertexShaderPrelude, shaderData.define);
110
+ this.variantName = shaderData.variantName;
111
+ // Get the projection uniform locations
112
+ this.projectionUniformManager.getLocations(this.program);
113
+ // Set up the VAO
114
+ this.setupVAO();
115
+ }
116
+ }
117
+ /**
118
+ * Sets the uniforms for offset mode
119
+ */
120
+ setOffsetUniforms(uniforms) {
121
+ this.offsetUniforms = uniforms;
122
+ }
123
+ /**
124
+ * Creates the shader program (supporting per-vertex color, offset mode)
125
+ */
126
+ createShaderProgram(prelude, define) {
127
+ const projTransitionUniform = getProjectionTransitionUniform(prelude);
128
+ const vertexSource = `#version 300 es
129
+ ${prelude}
130
+ ${define}
131
+ ${projTransitionUniform}${OFFSET_MODE_GLSL}${TERRAIN_SHADE_VERTEX_GLSL}
132
+ layout(location = 0) in vec2 a_pos; // relative coords (64-bit precision on the CPU)
133
+ layout(location = 1) in vec4 a_color; // per-vertex color
134
+
135
+ out vec4 v_color;
136
+
137
+ void main() {
138
+ // High precision version: uses relative coords computed at 64-bit precision on the CPU
139
+ gl_Position = project_position_to_clipspace_from_offset(a_pos, u_projection_matrix);
140
+ v_color = a_color;
141
+ emitShadeOffset(a_pos);
142
+ }`;
143
+ // The fill gets the same terrain shading as the ground (factor 1.0 when there is no terrain)
144
+ const fragmentSource = `#version 300 es
145
+ precision highp float;
146
+
147
+ in vec4 v_color;
148
+ out vec4 fragColor;
149
+ ${TERRAIN_SHADE_FRAGMENT_GLSL}
150
+ void main() {
151
+ fragColor = vec4(v_color.rgb * terrainFillShade(), v_color.a);
152
+ }`;
153
+ return createProgram(this.gl, vertexSource, fragmentSource);
154
+ }
155
+ /**
156
+ * Sets up the VAO
157
+ */
158
+ setupVAO() {
159
+ const gl = this.gl;
160
+ gl.bindVertexArray(this.vao);
161
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
162
+ // stride: pos(2) + color(4) = 6 floats = 24 bytes
163
+ const stride = 24;
164
+ // a_pos: location 0
165
+ gl.enableVertexAttribArray(0);
166
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, stride, 0);
167
+ // a_color: location 1
168
+ gl.enableVertexAttribArray(1);
169
+ gl.vertexAttribPointer(1, 4, gl.FLOAT, false, stride, 8);
170
+ // The ELEMENT_ARRAY_BUFFER binding is part of the VAO state
171
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);
172
+ gl.bindVertexArray(null);
173
+ }
174
+ /**
175
+ * Sets the projection uniforms (supporting offset mode + globe mode)
176
+ * @param projectionData MapLibre's ProjectionData
177
+ * @param zoom The current zoom level (used for switching offset mode)
178
+ */
179
+ setProjectionUniforms(projectionData, zoom) {
180
+ this.projectionUniformManager.setUniforms(projectionData, zoom, this.offsetUniforms);
181
+ }
182
+ /**
183
+ * Batch-draws multiple polygon fills
184
+ *
185
+ * @param polygons The array of polygon data (in draw order)
186
+ * @param projectionData MapLibre's ProjectionData
187
+ * @param zoom The current zoom level
188
+ * @returns The number of indices drawn (for debugging)
189
+ */
190
+ drawBatch(polygons, projectionData, zoom) {
191
+ if (!this.program || polygons.length === 0)
192
+ return 0;
193
+ const gl = this.gl;
194
+ // Compute relative coordinates on the CPU side (offset mode: computed at 64-bit precision)
195
+ const centerLngLat = this.offsetUniforms?.centerLngLat ?? [0, 0];
196
+ const { vertexData, indexData } = this.buildGeometry(polygons, centerLngLat);
197
+ if (indexData.length === 0)
198
+ return 0;
199
+ // Transfer the vertex data
200
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
201
+ gl.bufferData(gl.ARRAY_BUFFER, vertexData, gl.DYNAMIC_DRAW);
202
+ // Draw
203
+ gl.useProgram(this.program);
204
+ this.setProjectionUniforms(projectionData, zoom);
205
+ gl.bindVertexArray(this.vao);
206
+ // The ELEMENT_ARRAY_BUFFER binding is VAO state, so the transfer is done after
207
+ // binding the VAO
208
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexData, gl.DYNAMIC_DRAW);
209
+ drawFillWithTerrainCull(gl, this.terrain, () => {
210
+ gl.drawElements(gl.TRIANGLES, indexData.length, gl.UNSIGNED_INT, 0);
211
+ });
212
+ gl.bindVertexArray(null);
213
+ return indexData.length;
214
+ }
215
+ /**
216
+ * Builds the vertex array and index array of the batch
217
+ *
218
+ * The indices are laid out in the order of the input polygons, so the draw order
219
+ * (z-order) is preserved.
220
+ */
221
+ buildGeometry(polygons, centerLngLat) {
222
+ // Pass 1: collect the triangulation results and count the required array lengths
223
+ const records = [];
224
+ let totalPoints = 0;
225
+ let totalIndices = 0;
226
+ // Subdivide on a grid only while terrain is active or the globe is drawn (on a flat map
227
+ // without terrain it passes through as null)
228
+ // The step is decided from the total across all features (the same criterion as
229
+ // sdf-polygon)
230
+ const terrainStep = getSurfaceTessellationStep(this.terrain, 'fill');
231
+ let batchFactor = 1;
232
+ if (terrainStep) {
233
+ let totalCells = 0;
234
+ for (const polygon of polygons) {
235
+ const outer = polygon.coordinates[0];
236
+ if (outer)
237
+ totalCells += ringBoundingCells(outer, terrainStep.grid, terrainStep.region);
238
+ }
239
+ batchFactor = batchTessellationFactor(totalCells);
240
+ reportTerrainCoarsening(this.terrain, batchFactor);
241
+ }
242
+ for (const polygon of polygons) {
243
+ // Flatten all rings to build the earcut input (inner rings are treated as holes)
244
+ const { flatCoords, holeIndices, rings } = buildEarcutInput(polygon.coordinates);
245
+ if (rings.length === 0)
246
+ continue;
247
+ // Triangulate with earcut (making use of the cache)
248
+ let indices;
249
+ if (polygon.featureId) {
250
+ // Try to get it from the cache
251
+ const partIndex = polygon.partIndex ?? 0;
252
+ const cached = this.earcutCache.get(polygon.featureId, partIndex);
253
+ if (cached) {
254
+ indices = cached;
255
+ }
256
+ else {
257
+ indices = earcut(flatCoords, holeIndices);
258
+ this.earcutCache.set(polygon.featureId, indices, partIndex);
259
+ }
260
+ }
261
+ else {
262
+ // When there is no featureId, run it without the cache
263
+ indices = earcut(flatCoords, holeIndices);
264
+ }
265
+ if (indices.length === 0)
266
+ continue;
267
+ const tessellated = terrainStep
268
+ ? tessellateSurfaceFill(this.terrain, polygon.featureId, polygon.partIndex ?? 0, flatCoords, indices, {
269
+ // While aligned to the actual tile mesh, do not move the step and pass only
270
+ // the coarsening factor (so it keeps riding on a subset of the mesh nodes)
271
+ grid: terrainStep.tiling ? terrainStep.grid : terrainStep.grid * batchFactor,
272
+ maxPoints: terrainStep.maxPoints,
273
+ region: terrainStep.region,
274
+ tiling: terrainStep.tiling,
275
+ coarsen: terrainStep.tiling
276
+ ? Math.min(batchFactor, TERRAIN_MAX_TILED_COARSEN)
277
+ : undefined,
278
+ })
279
+ : { flatCoords, indices };
280
+ records.push({
281
+ flatCoords: tessellated.flatCoords,
282
+ indices: tessellated.indices,
283
+ color: polygon.color,
284
+ });
285
+ totalPoints += tessellated.flatCoords.length / 2;
286
+ totalIndices += tessellated.indices.length;
287
+ }
288
+ // Pass 2: write directly into the typed arrays
289
+ const vertexData = new Float32Array(totalPoints * 6);
290
+ const indexData = new Uint32Array(totalIndices);
291
+ let base = 0;
292
+ let indexOffset = 0;
293
+ for (const { flatCoords, indices, color } of records) {
294
+ const pointCount = flatCoords.length / 2;
295
+ for (let i = 0; i < pointCount; i++) {
296
+ // Compute the offset from the center at 64-bit precision
297
+ const offset = calculateLngLatOffset([flatCoords[i * 2], flatCoords[i * 2 + 1]], centerLngLat);
298
+ const at = (base + i) * 6;
299
+ vertexData[at] = offset[0];
300
+ vertexData[at + 1] = offset[1];
301
+ vertexData[at + 2] = color[0];
302
+ vertexData[at + 3] = color[1];
303
+ vertexData[at + 4] = color[2];
304
+ vertexData[at + 5] = color[3];
305
+ }
306
+ for (let i = 0; i < indices.length; i++) {
307
+ indexData[indexOffset + i] = indices[i] + base;
308
+ }
309
+ base += pointCount;
310
+ indexOffset += indices.length;
311
+ }
312
+ return { vertexData, indexData };
313
+ }
314
+ /**
315
+ * Disposes of the resources
316
+ */
317
+ dispose() {
318
+ const gl = this.gl;
319
+ if (this.program) {
320
+ gl.deleteProgram(this.program);
321
+ this.program = null;
322
+ }
323
+ if (this.vertexBuffer) {
324
+ gl.deleteBuffer(this.vertexBuffer);
325
+ this.vertexBuffer = null;
326
+ }
327
+ if (this.indexBuffer) {
328
+ gl.deleteBuffer(this.indexBuffer);
329
+ this.indexBuffer = null;
330
+ }
331
+ if (this.vao) {
332
+ gl.deleteVertexArray(this.vao);
333
+ this.vao = null;
334
+ }
335
+ }
336
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Building the earcut input
3
+ *
4
+ * Provides a pure function that converts a polygon with holes (an array of rings)
5
+ * into the "flattened coordinate sequence + start indices of the inner rings" that
6
+ * earcut requires. Following the coordinate format convention, rings[0] is the outer
7
+ * ring and rings[1..] are the inner rings.
8
+ */
9
+ import type { Coordinate } from '../../../store/types.js';
10
+ /**
11
+ * The input to earcut
12
+ */
13
+ export interface EarcutInput {
14
+ /** Coordinate sequence flattened over all rings ([lng, lat, lng, lat, ...]) */
15
+ flatCoords: number[];
16
+ /** Start vertex indices of the inner rings (earcut's holeIndices) */
17
+ holeIndices: number[];
18
+ /**
19
+ * Array of rings with the closing point removed (rings[0] is the outer ring,
20
+ * rings[1..] are the inner rings)
21
+ *
22
+ * Rings that have no area have already been excluded, so it can also be used for
23
+ * drawing the outline (stroke).
24
+ */
25
+ rings: Coordinate[][];
26
+ }
27
+ /**
28
+ * Builds the earcut input from an array of rings
29
+ *
30
+ * - The closing point of each ring is removed
31
+ * - A ring with fewer than 3 vertices has no area, so it is ignored
32
+ * - If the outer ring is invalid, an empty input is returned (the caller skips drawing)
33
+ *
34
+ * @param rings Array of rings (rings[0] is the outer ring, rings[1..] are the inner rings)
35
+ * @returns The flattened coordinate sequence and the start indices of the inner rings
36
+ */
37
+ export declare function buildEarcutInput(rings: Coordinate[][]): EarcutInput;
@@ -0,0 +1,55 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Removes the closing point at the end of a ring (the same coordinate as the first)
5
+ *
6
+ * Neither earcut nor outline drawing needs the closing point, so it is normalized at
7
+ * the entrance.
8
+ */
9
+ function openRing(ring) {
10
+ if (ring.length < 2)
11
+ return ring;
12
+ const first = ring[0];
13
+ const last = ring[ring.length - 1];
14
+ if (first[0] === last[0] && first[1] === last[1]) {
15
+ return ring.slice(0, -1);
16
+ }
17
+ return ring;
18
+ }
19
+ /**
20
+ * Builds the earcut input from an array of rings
21
+ *
22
+ * - The closing point of each ring is removed
23
+ * - A ring with fewer than 3 vertices has no area, so it is ignored
24
+ * - If the outer ring is invalid, an empty input is returned (the caller skips drawing)
25
+ *
26
+ * @param rings Array of rings (rings[0] is the outer ring, rings[1..] are the inner rings)
27
+ * @returns The flattened coordinate sequence and the start indices of the inner rings
28
+ */
29
+ export function buildEarcutInput(rings) {
30
+ if (rings.length === 0) {
31
+ return { flatCoords: [], holeIndices: [], rings: [] };
32
+ }
33
+ const outerRing = openRing(rings[0]);
34
+ if (outerRing.length < 3) {
35
+ return { flatCoords: [], holeIndices: [], rings: [] };
36
+ }
37
+ const flatCoords = [];
38
+ const holeIndices = [];
39
+ const openRings = [outerRing];
40
+ for (const [lng, lat] of outerRing) {
41
+ flatCoords.push(lng, lat);
42
+ }
43
+ for (let i = 1; i < rings.length; i++) {
44
+ const holeRing = openRing(rings[i]);
45
+ if (holeRing.length < 3)
46
+ continue;
47
+ // Start vertex index of the inner ring (coordinate count = flatCoords.length / 2)
48
+ holeIndices.push(flatCoords.length / 2);
49
+ for (const [lng, lat] of holeRing) {
50
+ flatCoords.push(lng, lat);
51
+ }
52
+ openRings.push(holeRing);
53
+ }
54
+ return { flatCoords, holeIndices, rings: openRings };
55
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * The number of ear clipping loop iterations run in a single step
3
+ *
4
+ * The caller checks the clock at this granularity, so this determines "how far the
5
+ * budget can be overrun". The measurements on a million-vertex water body are as
6
+ * follows.
7
+ *
8
+ * | slice | average per step | p99 | max | total CPU of the triangulation |
9
+ * | --- | --- | --- | --- | --- |
10
+ * | 16 | 0.14ms | 5.1ms | 23ms | 15.0s |
11
+ * | 32 | 0.28ms | 10.3ms | 35ms | 15.3s |
12
+ * | 64 | 0.52ms | 19.5ms | 55ms | 14.2s |
13
+ *
14
+ * Since the total hardly changes even when the slice is made finer (the cost of slicing
15
+ * is negligible), 16 is adopted because it keeps within the budget. A long step appears
16
+ * rarely because the recovery performed when no more ears can be found (the full sweep
17
+ * of filterPoints) runs within a single iteration.
18
+ */
19
+ export declare const EARCUT_SLICE_ITERATIONS = 16;
20
+ /**
21
+ * Time-sliceable earcut
22
+ *
23
+ * If `step()` is called repeatedly until completion (true), `triangles` ends up holding
24
+ * the same index sequence as the `earcut(data, holeIndices, dim)` dependency.
25
+ */
26
+ export declare class SlicedEarcut {
27
+ private readonly data;
28
+ private readonly holeIndices;
29
+ private readonly dim;
30
+ /** The triangulation result (partial progress until it finishes) */
31
+ readonly triangles: number[];
32
+ private phase;
33
+ private ear;
34
+ private stop;
35
+ private cured;
36
+ private minX;
37
+ private minY;
38
+ private invSize;
39
+ /** The steiner points of this job (swapped into the module variable at step's entrance) */
40
+ private readonly ownSteiners;
41
+ /** The filteredOut of this job (same as above) */
42
+ private ownFilteredOut;
43
+ constructor(data: ArrayLike<number>, holeIndices?: ArrayLike<number> | null, dim?: number);
44
+ /** Whether it has finished */
45
+ get done(): boolean;
46
+ /**
47
+ * Advances the triangulation a little
48
+ *
49
+ * @param iterations The upper bound on ear clipping loop iterations (the default slice
50
+ * when omitted)
51
+ * @returns true once it has finished
52
+ */
53
+ step(iterations?: number): boolean;
54
+ /**
55
+ * Preprocessing (building the linked list, bridging the holes, bbox, z-order indexing)
56
+ *
57
+ * This part is not sliced. It takes only tens of milliseconds even at a million
58
+ * vertices, so fidelity to the port is preferred over the value of slicing it.
59
+ */
60
+ private runSetup;
61
+ /**
62
+ * The main ear clipping loop (identical to upstream's earcutLinked; breaks out on the
63
+ * iteration count)
64
+ *
65
+ * splitEarcut, the last resort, is recursive, so it is not sliced (it is a path that
66
+ * runs only once against the remaining polygon and is not taken for ordinary inputs).
67
+ */
68
+ private runClip;
69
+ }