@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,718 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { generateCirclePolygon } from '../../shared/math/index.js';
4
+ import { getCircleRadius, getCreatedZoom } from '../../shared/utils/property.js';
5
+ import { densifyPathForGlobe } from '../globe-subdivision.js';
6
+ import { TerrainContext } from '../terrain/context.js';
7
+ import { anchorGhostOpacity } from '../terrain/occlusion.js';
8
+ import { layerDrawFactors, NEUTRAL_DRAW_FACTORS, } from './draw-factors.js';
9
+ import { getStrokeDashPattern, splitIntoDashes } from './line/dash.js';
10
+ import { toInstancedPointShape, } from './point/point-instance.js';
11
+ /**
12
+ * Convert a Point style into instance data
13
+ *
14
+ * The opacity is folded into the alpha of the color, and the stroke is disabled
15
+ * by setting its width to 0 when its opacity is 0.
16
+ */
17
+ export function toPointInstanceData(coord, style) {
18
+ const fillColor = [
19
+ style.fillColor[0],
20
+ style.fillColor[1],
21
+ style.fillColor[2],
22
+ style.fillColor[3] * style.fillOpacity,
23
+ ];
24
+ const strokeColor = [
25
+ style.strokeColor[0],
26
+ style.strokeColor[1],
27
+ style.strokeColor[2],
28
+ style.strokeColor[3] * style.strokeOpacity,
29
+ ];
30
+ return {
31
+ coord: [coord[0], coord[1]],
32
+ fillColor,
33
+ fillSize: style.size / 2,
34
+ strokeColor,
35
+ strokeWidth: style.strokeOpacity > 0 ? style.strokeWidth : 0,
36
+ };
37
+ }
38
+ /**
39
+ * Convert a Point style into the packed style of `PackedPointInstances`
40
+ *
41
+ * The same values as `toPointInstanceData` puts on a point, in the order fillColor, strokeColor,
42
+ * fillSize, strokeWidth.
43
+ */
44
+ export function toPackedPointStyle(style) {
45
+ const packed = toPointInstanceData([0, 0], style);
46
+ return Float64Array.of(packed.fillColor[0], packed.fillColor[1], packed.fillColor[2], packed.fillColor[3], packed.strokeColor[0], packed.strokeColor[1], packed.strokeColor[2], packed.strokeColor[3], packed.fillSize, packed.strokeWidth);
47
+ }
48
+ /**
49
+ * Convert a stroke style into an item of a line batch
50
+ *
51
+ * The color and the opacity are passed to the GPU as instance attributes, so
52
+ * they are expanded from the style down to the per-item level. The dash kind and
53
+ * the reference zoom of the width are handled on the shape side (the batch key
54
+ * and the instance attributes), so they are not included here.
55
+ */
56
+ export function toLineBatchItem(coords, featureId, style, createdZoom, closed = false) {
57
+ return {
58
+ coords,
59
+ featureId,
60
+ closed,
61
+ strokeWidth: style.width,
62
+ createdZoom,
63
+ color: [style.color[0], style.color[1], style.color[2], style.color[3]],
64
+ opacity: style.opacity,
65
+ };
66
+ }
67
+ /**
68
+ * Turn an item that is "constant in width on the screen" into a negative fixed width
69
+ *
70
+ * When the line width is expressed as a negative value, the shader ignores
71
+ * createdZoom and draws it at a fixed width. Putting features that have no
72
+ * createdZoom (that is, those that should stay constant in width on the screen)
73
+ * on that convention lets them declare that their dimension is "fixed in screen
74
+ * pixels" while staying in the same batch as variable-width ones. Only once that
75
+ * is declared does renderScale (the factor of the rendering ratio) apply (see
76
+ * "the two ratios" in shared/utils/pixel-ratio.ts).
77
+ */
78
+ function withFixedWidth(item, fixed) {
79
+ if (!fixed)
80
+ return item;
81
+ item.strokeWidth = -item.strokeWidth;
82
+ return item;
83
+ }
84
+ /**
85
+ * Obtain the shape parameters of a line batch
86
+ *
87
+ * The color is an instance attribute, so it is not included. For solid lines the
88
+ * dash array is not used for rendering, so it is dropped to avoid pointless batch
89
+ * splits.
90
+ */
91
+ export function toLineBatchShape(style) {
92
+ if (style.lineStyle === 'solid') {
93
+ return { lineStyle: 'solid' };
94
+ }
95
+ return { lineStyle: style.lineStyle, dashArray: style.dashArray };
96
+ }
97
+ /**
98
+ * Obtain the key of a line batch (shape parameters only; it does not depend on the color)
99
+ */
100
+ export function lineBatchKey(shape) {
101
+ return [shape.lineStyle, (shape.dashArray ?? []).join(',')].join(':');
102
+ }
103
+ /**
104
+ * BatchManager
105
+ *
106
+ * The class that manages the batching of features
107
+ *
108
+ * @internal
109
+ */
110
+ export class BatchManager {
111
+ constructor(deps) {
112
+ Object.defineProperty(this, "gl", {
113
+ enumerable: true,
114
+ configurable: true,
115
+ writable: true,
116
+ value: void 0
117
+ });
118
+ Object.defineProperty(this, "featureDrawer", {
119
+ enumerable: true,
120
+ configurable: true,
121
+ writable: true,
122
+ value: void 0
123
+ });
124
+ Object.defineProperty(this, "pointInstanceRenderer", {
125
+ enumerable: true,
126
+ configurable: true,
127
+ writable: true,
128
+ value: void 0
129
+ });
130
+ Object.defineProperty(this, "sdfLineRenderer", {
131
+ enumerable: true,
132
+ configurable: true,
133
+ writable: true,
134
+ value: void 0
135
+ });
136
+ Object.defineProperty(this, "polygonBatchRenderer", {
137
+ enumerable: true,
138
+ configurable: true,
139
+ writable: true,
140
+ value: void 0
141
+ });
142
+ Object.defineProperty(this, "sdfPolygonRenderer", {
143
+ enumerable: true,
144
+ configurable: true,
145
+ writable: true,
146
+ value: void 0
147
+ });
148
+ /** The terrain state of the draw instance (occlusion of the points) */
149
+ Object.defineProperty(this, "terrain", {
150
+ enumerable: true,
151
+ configurable: true,
152
+ writable: true,
153
+ value: void 0
154
+ });
155
+ /**
156
+ * The set of renderers for retained mode
157
+ *
158
+ * undefined = not determined yet, null = not supported (immediate mode only)
159
+ */
160
+ Object.defineProperty(this, "retainedRenderers", {
161
+ enumerable: true,
162
+ configurable: true,
163
+ writable: true,
164
+ value: void 0
165
+ });
166
+ // State
167
+ Object.defineProperty(this, "currentBatchType", {
168
+ enumerable: true,
169
+ configurable: true,
170
+ writable: true,
171
+ value: null
172
+ });
173
+ // Point batch management (the key is the shape only)
174
+ Object.defineProperty(this, "pointBatches", {
175
+ enumerable: true,
176
+ configurable: true,
177
+ writable: true,
178
+ value: new Map()
179
+ });
180
+ Object.defineProperty(this, "currentPointBatchKey", {
181
+ enumerable: true,
182
+ configurable: true,
183
+ writable: true,
184
+ value: null
185
+ });
186
+ // LineString batch management (the key is the shape parameters only; the color is held
187
+ // by the item)
188
+ Object.defineProperty(this, "lineBatch", {
189
+ enumerable: true,
190
+ configurable: true,
191
+ writable: true,
192
+ value: []
193
+ });
194
+ Object.defineProperty(this, "lineBatchShapeKey", {
195
+ enumerable: true,
196
+ configurable: true,
197
+ writable: true,
198
+ value: ''
199
+ });
200
+ Object.defineProperty(this, "lineBatchShape", {
201
+ enumerable: true,
202
+ configurable: true,
203
+ writable: true,
204
+ value: null
205
+ });
206
+ Object.defineProperty(this, "sdfLineDrawing", {
207
+ enumerable: true,
208
+ configurable: true,
209
+ writable: true,
210
+ value: false
211
+ });
212
+ // Polygon batch management
213
+ Object.defineProperty(this, "polygonFillBatch", {
214
+ enumerable: true,
215
+ configurable: true,
216
+ writable: true,
217
+ value: []
218
+ });
219
+ Object.defineProperty(this, "sdfPolygonBatch", {
220
+ enumerable: true,
221
+ configurable: true,
222
+ writable: true,
223
+ value: []
224
+ });
225
+ // The rendering context
226
+ Object.defineProperty(this, "projectionData", {
227
+ enumerable: true,
228
+ configurable: true,
229
+ writable: true,
230
+ value: null
231
+ });
232
+ Object.defineProperty(this, "zoom", {
233
+ enumerable: true,
234
+ configurable: true,
235
+ writable: true,
236
+ value: 14
237
+ });
238
+ /**
239
+ * The layer being drawn
240
+ *
241
+ * The rendering loop starts a frame per layer, so the layer needed to evaluate
242
+ * the style rules can be held as the context of the frame.
243
+ */
244
+ Object.defineProperty(this, "layer", {
245
+ enumerable: true,
246
+ configurable: true,
247
+ writable: true,
248
+ value: void 0
249
+ });
250
+ /**
251
+ * The draw-time factors of the frame (the opacity of the layer being drawn)
252
+ *
253
+ * The batches are flushed within the frame, so they are drawn with the factors of the layer
254
+ * they were filled for. The paths without a factor uniform (the fill-only polygons, the
255
+ * per-point shapes) multiply the opacity into their colors instead.
256
+ */
257
+ Object.defineProperty(this, "factors", {
258
+ enumerable: true,
259
+ configurable: true,
260
+ writable: true,
261
+ value: NEUTRAL_DRAW_FACTORS
262
+ });
263
+ this.gl = deps.gl;
264
+ this.featureDrawer = deps.featureDrawer;
265
+ this.pointInstanceRenderer = deps.pointInstanceRenderer;
266
+ this.sdfLineRenderer = deps.sdfLineRenderer;
267
+ this.polygonBatchRenderer = deps.polygonBatchRenderer;
268
+ this.sdfPolygonRenderer = deps.sdfPolygonRenderer;
269
+ this.terrain = deps.terrain ?? new TerrainContext();
270
+ }
271
+ /**
272
+ * The terrain state of the draw instance (read by the datasets drawn here)
273
+ */
274
+ getTerrain() {
275
+ return this.terrain;
276
+ }
277
+ /**
278
+ * Return the set of renderers for retained mode
279
+ *
280
+ * Used for rendering that is not rebuilt every frame, such as a
281
+ * dataset. When the renderers do not support retained mode (a test stub, for
282
+ * example), undefined is returned and the caller falls back to the immediate-mode
283
+ * path.
284
+ */
285
+ getRetainedRenderers() {
286
+ if (this.retainedRenderers !== undefined)
287
+ return this.retainedRenderers ?? undefined;
288
+ const line = this.sdfLineRenderer;
289
+ const polygon = this.sdfPolygonRenderer;
290
+ const point = this.pointInstanceRenderer;
291
+ const supported = typeof line?.buildRetainedBatch === 'function' &&
292
+ typeof polygon?.buildRetained === 'function' &&
293
+ typeof point?.buildRetained === 'function';
294
+ if (!supported) {
295
+ this.retainedRenderers = null;
296
+ return undefined;
297
+ }
298
+ this.retainedRenderers = {
299
+ line,
300
+ polygon,
301
+ point,
302
+ styles: this.featureDrawer,
303
+ viewport: () => [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight],
304
+ };
305
+ return this.retainedRenderers;
306
+ }
307
+ /**
308
+ * Begin a rendering frame
309
+ *
310
+ * @param layer The layer to draw (used to evaluate the style rules, and its opacity is
311
+ * multiplied into everything the frame draws; no factor when omitted)
312
+ */
313
+ beginFrame(projectionData, zoom, layer) {
314
+ this.projectionData = projectionData;
315
+ this.zoom = zoom;
316
+ this.layer = layer;
317
+ this.factors = layerDrawFactors(layer);
318
+ this.currentBatchType = null;
319
+ }
320
+ /**
321
+ * Process a feature
322
+ *
323
+ * @returns true when it is selected
324
+ */
325
+ processFeature(feature, isSelected) {
326
+ if (!feature.visible || !this.projectionData)
327
+ return false;
328
+ if (feature.type === 'Point') {
329
+ this.processPoint(feature);
330
+ }
331
+ else if (feature.type === 'LineString') {
332
+ this.processLineString(feature);
333
+ }
334
+ else if (feature.type === 'Polygon') {
335
+ this.processPolygon(feature);
336
+ }
337
+ else if (feature.type === 'MultiPoint') {
338
+ this.processMultiPoint(feature);
339
+ }
340
+ else if (feature.type === 'MultiLineString') {
341
+ this.processMultiLineString(feature);
342
+ }
343
+ else if (feature.type === 'MultiPolygon') {
344
+ this.processMultiPolygon(feature);
345
+ }
346
+ else if (feature.type === 'Freehand') {
347
+ // Freehand is processed in the same way as LineString
348
+ this.processLineString(feature);
349
+ }
350
+ else if (feature.type === 'Circle') {
351
+ // Circle is batched in the same way as Polygon
352
+ this.processCircle(feature);
353
+ }
354
+ else if (feature.type === 'Image') {
355
+ // Image: always flush the batches and draw it individually
356
+ this.flushLineBatch();
357
+ // endSDFLineDraw is called only at the end of the frame (a performance optimization)
358
+ this.flushAllBatches();
359
+ this.currentBatchType = null;
360
+ this.featureDrawer.drawFeature(feature, this.projectionData, this.zoom, this.layer);
361
+ }
362
+ return isSelected;
363
+ }
364
+ /**
365
+ * End the rendering frame (flush the remaining batches)
366
+ */
367
+ endFrame() {
368
+ this.flushLineBatch();
369
+ this.endSDFLineDraw();
370
+ this.flushAllBatches();
371
+ }
372
+ // === Point processing ===
373
+ processPoint(feature) {
374
+ this.processPointCoord(feature, feature.coordinates);
375
+ }
376
+ /**
377
+ * Add a MultiPoint to the point batch, part by part
378
+ *
379
+ * The coordinates are `Coordinate[]` (a part = one point). The style is per
380
+ * feature, so it is shared across all parts.
381
+ */
382
+ processMultiPoint(feature) {
383
+ const parts = feature.coordinates;
384
+ for (const coord of parts) {
385
+ this.processPointCoord(feature, coord);
386
+ }
387
+ }
388
+ /**
389
+ * The shared processing that adds one point to the batch (shared by Point and the parts
390
+ * of MultiPoint)
391
+ */
392
+ processPointCoord(feature, coord) {
393
+ if (this.currentBatchType !== null && this.currentBatchType !== 'point') {
394
+ this.flushLineBatch();
395
+ // endSDFLineDraw is called only at the end of the frame (a performance optimization)
396
+ this.flushAllBatches();
397
+ }
398
+ this.currentBatchType = 'point';
399
+ const style = this.featureDrawer.getPointStyle(feature, this.layer);
400
+ const instancedShape = toInstancedPointShape(style.shape);
401
+ // The look of a Point does not change when it is selected; it is shown enclosed by a
402
+ // bounding box
403
+ // Therefore it is drawn with instancing even when selected
404
+ if (!instancedShape) {
405
+ if (this.pointBatches.size > 0) {
406
+ this.flushPointBatches();
407
+ }
408
+ // Shapes that do not support instancing are drawn individually, one point at a time
409
+ // (MultiPoint comes into this function part by part, so they are drawn per point)
410
+ this.featureDrawer.drawPointShape(coord, this.withLayerOpacity(style), this.zoom, feature.id);
411
+ }
412
+ else {
413
+ // Color, size and stroke are instance attributes, so the batch key only needs the shape
414
+ const batchKey = instancedShape;
415
+ if (this.currentPointBatchKey !== null && this.currentPointBatchKey !== batchKey) {
416
+ this.flushPointBatches();
417
+ }
418
+ let batch = this.pointBatches.get(batchKey);
419
+ if (!batch) {
420
+ batch = { points: [], shape: batchKey };
421
+ this.pointBatches.set(batchKey, batch);
422
+ }
423
+ // Points occluded by the terrain are drawn faintly (ghost). This is the
424
+ // immediate path, rebuilt every frame, so it follows the camera movement directly.
425
+ batch.points.push({
426
+ ...toPointInstanceData(coord, style),
427
+ ghost: anchorGhostOpacity(this.terrain, coord[0], coord[1]),
428
+ });
429
+ this.currentPointBatchKey = batchKey;
430
+ }
431
+ }
432
+ flushPointBatches() {
433
+ for (const batch of this.pointBatches.values()) {
434
+ if (batch.points.length > 0) {
435
+ this.pointInstanceRenderer.drawAll(batch.points, batch.shape, this.zoom, this.factors);
436
+ }
437
+ }
438
+ this.pointBatches.clear();
439
+ this.currentPointBatchKey = null;
440
+ }
441
+ // === LineString processing ===
442
+ processLineString(feature) {
443
+ this.processLineCoords(feature, feature.coordinates);
444
+ }
445
+ /**
446
+ * Add a MultiLineString to the line batch, part by part
447
+ *
448
+ * The coordinates are `Coordinate[][]` (a part = one polyline).
449
+ */
450
+ processMultiLineString(feature) {
451
+ const parts = feature.coordinates;
452
+ for (const coords of parts) {
453
+ if (coords.length < 2)
454
+ continue;
455
+ this.processLineCoords(feature, coords);
456
+ }
457
+ }
458
+ /**
459
+ * The shared processing that adds one polyline to the batch (shared by LineString,
460
+ * Freehand and the parts of MultiLineString)
461
+ */
462
+ processLineCoords(feature, coords) {
463
+ if (this.currentBatchType !== null && this.currentBatchType !== 'linestring') {
464
+ // endSDFLineDraw is called only at the end of the frame (a performance optimization)
465
+ this.flushLineBatch();
466
+ this.flushAllBatches();
467
+ }
468
+ this.currentBatchType = 'linestring';
469
+ const strokeStyle = this.featureDrawer.getLineStringStrokeStyle(feature, this.layer);
470
+ // A feature that has no createdZoom is drawn "constant in width on the screen". It is
471
+ // passed to the GPU as a negative fixed width and does not go through the shader's zoom
472
+ // conversion (the same convention as retained mode; at scale = 1, 2^(zoom - zoom) = 1, so
473
+ // the look does not change).
474
+ const fixedWidth = getCreatedZoom(feature) === undefined;
475
+ const createdZoom = getCreatedZoom(feature) ?? this.zoom;
476
+ // Compute the effective line width at the current zoom level
477
+ const effectiveStrokeWidth = strokeStyle.width * 2 ** (this.zoom - createdZoom);
478
+ // For dashed/dotted lines the dashes are computed on the CPU side
479
+ const dashPattern = getStrokeDashPattern(strokeStyle.lineStyle, effectiveStrokeWidth);
480
+ if (dashPattern) {
481
+ // They are drawn as solid lines, so the shape is treated as 'solid'
482
+ const shape = toLineBatchShape({ ...strokeStyle, lineStyle: 'solid' });
483
+ this.switchLineBatchShape(shape);
484
+ // Split into dashes on the CPU side. On the globe the path is cut along the Mercator
485
+ // plane first, so the dashes follow the path the solid line takes (globe-subdivision.ts)
486
+ const dashSegments = splitIntoDashes(densifyPathForGlobe(this.terrain, coords), dashPattern[0], dashPattern[1], this.zoom);
487
+ // Add each dash as an individual solid line
488
+ for (const segment of dashSegments) {
489
+ if (segment.coords.length >= 2) {
490
+ this.lineBatch.push(withFixedWidth(toLineBatchItem(segment.coords, feature.id, strokeStyle, createdZoom), fixedWidth));
491
+ }
492
+ }
493
+ }
494
+ else {
495
+ // For a solid line, as before
496
+ this.switchLineBatchShape(toLineBatchShape(strokeStyle));
497
+ this.lineBatch.push(withFixedWidth(toLineBatchItem(coords, feature.id, strokeStyle, createdZoom), fixedWidth));
498
+ }
499
+ }
500
+ /**
501
+ * Switch the shape of the line batch
502
+ *
503
+ * It is flushed only when the shape (the dash kind) changes. The color is an
504
+ * instance attribute, so it does not split the batch.
505
+ */
506
+ switchLineBatchShape(shape) {
507
+ const key = lineBatchKey(shape);
508
+ if (this.lineBatchShapeKey !== '' && this.lineBatchShapeKey !== key) {
509
+ this.flushLineBatch();
510
+ }
511
+ this.lineBatchShapeKey = key;
512
+ this.lineBatchShape = shape;
513
+ }
514
+ beginSDFLineDraw() {
515
+ if (!this.sdfLineDrawing && this.projectionData) {
516
+ this.sdfLineRenderer.beginDraw(this.projectionData, this.zoom);
517
+ this.sdfLineDrawing = true;
518
+ }
519
+ }
520
+ endSDFLineDraw() {
521
+ if (this.sdfLineDrawing) {
522
+ this.sdfLineRenderer.endDraw();
523
+ this.sdfLineDrawing = false;
524
+ }
525
+ }
526
+ flushLineBatch() {
527
+ if (this.lineBatch.length > 0 && this.lineBatchShape && this.projectionData) {
528
+ this.beginSDFLineDraw();
529
+ this.sdfLineRenderer.drawAll(this.lineBatch, this.lineBatchShape, this.zoom, this.projectionData, this.factors);
530
+ this.lineBatch.length = 0;
531
+ this.lineBatchShapeKey = '';
532
+ this.lineBatchShape = null;
533
+ }
534
+ }
535
+ // === Polygon processing ===
536
+ processPolygon(feature) {
537
+ const rings = feature.coordinates;
538
+ const outerRing = rings[0];
539
+ if (!outerRing || outerRing.length < 3)
540
+ return;
541
+ this.processPolygonRings(rings, feature);
542
+ }
543
+ /**
544
+ * Add a MultiPolygon to the hole-aware polygon batch, part by part
545
+ *
546
+ * The coordinates are `Coordinate[][][]` (a part = an array of rings; rings[0] is the
547
+ * outer ring and the rest are inner rings).
548
+ * The key of the earcut cache includes the part index as well.
549
+ */
550
+ processMultiPolygon(feature) {
551
+ const parts = feature.coordinates;
552
+ for (let partIndex = 0; partIndex < parts.length; partIndex++) {
553
+ const rings = parts[partIndex];
554
+ const outerRing = rings?.[0];
555
+ if (!outerRing || outerRing.length < 3)
556
+ continue;
557
+ this.processPolygonRings(rings, feature, partIndex);
558
+ }
559
+ }
560
+ // === Circle processing ===
561
+ processCircle(feature) {
562
+ const center = feature.coordinates;
563
+ const radiusMeters = getCircleRadius(feature);
564
+ if (!radiusMeters || radiusMeters <= 0)
565
+ return;
566
+ // Convert the circle into a polygon (a Circle is always a single ring)
567
+ const circleCoords = generateCirclePolygon(center, radiusMeters);
568
+ this.processPolygonRings([circleCoords], feature);
569
+ }
570
+ // === Processing shared by Polygon and Circle ===
571
+ /**
572
+ * The shared processing that adds an array of polygon rings to a batch
573
+ *
574
+ * Shared by Polygon ([0] is the outer ring, [1..] are the inner rings), Circle
575
+ * (a polygon approximation with a single ring) and each part of a MultiPolygon.
576
+ *
577
+ * @param partIndex The part index of a MultiPolygon (for the key of the earcut cache)
578
+ */
579
+ processPolygonRings(rings, feature, partIndex = 0) {
580
+ if (this.currentBatchType !== null && this.currentBatchType !== 'polygon') {
581
+ this.flushLineBatch();
582
+ this.flushAllBatches();
583
+ }
584
+ this.currentBatchType = 'polygon';
585
+ const { fillColor, strokeStyle } = this.featureDrawer.getPolygonStyles(feature, this.layer);
586
+ // The outline of a feature that has no createdZoom uses a negative fixed width (the same
587
+ // convention as withFixedWidth; collectPolygons in retained mode does the same).
588
+ const fixedWidth = getCreatedZoom(feature) === undefined;
589
+ const createdZoom = getCreatedZoom(feature) ?? this.zoom;
590
+ const effectiveStrokeWidth = strokeStyle.width * 2 ** (this.zoom - createdZoom);
591
+ const isDashed = strokeStyle.lineStyle !== 'solid';
592
+ if (strokeStyle.opacity > 0 && !isDashed) {
593
+ // For a solid line: drawn all at once by SDFPolygonRenderer
594
+ this.flushPolygonFillBatch();
595
+ this.sdfPolygonBatch.push({
596
+ coordinates: rings,
597
+ style: {
598
+ fillColor,
599
+ fillOpacity: 1,
600
+ strokeColor: strokeStyle.color,
601
+ strokeWidth: fixedWidth ? -strokeStyle.width : strokeStyle.width,
602
+ strokeOpacity: 1,
603
+ },
604
+ createdZoom,
605
+ featureId: feature.id,
606
+ partIndex,
607
+ });
608
+ }
609
+ else if (strokeStyle.opacity > 0 && isDashed) {
610
+ // For a dashed/dotted line: the fill goes to PolygonBatchRenderer, and the stroke
611
+ // is split into dashes on the CPU side and drawn by SDFLineRenderer
612
+ this.addPolygonDashedStroke(rings, feature.id, fillColor, strokeStyle, effectiveStrokeWidth, createdZoom, partIndex, fixedWidth);
613
+ }
614
+ else {
615
+ // When there is no stroke: the fill only
616
+ this.flushSdfPolygonBatch();
617
+ if (fillColor[3] > 0) {
618
+ this.polygonFillBatch.push({
619
+ coordinates: rings,
620
+ color: this.colorWithLayerOpacity(fillColor),
621
+ featureId: feature.id,
622
+ partIndex,
623
+ });
624
+ }
625
+ }
626
+ }
627
+ /**
628
+ * Processing of the dashed/dotted stroke of a polygon
629
+ */
630
+ addPolygonDashedStroke(rings, featureId, fillColor, strokeStyle, effectiveStrokeWidth, createdZoom, partIndex = 0, fixedWidth = false) {
631
+ this.flushSdfPolygonBatch();
632
+ // Draw the fill (inner rings are punched out as holes)
633
+ if (fillColor[3] > 0) {
634
+ this.polygonFillBatch.push({
635
+ coordinates: rings,
636
+ color: this.colorWithLayerOpacity(fillColor),
637
+ featureId,
638
+ partIndex,
639
+ });
640
+ }
641
+ this.flushPolygonFillBatch();
642
+ // They are drawn as solid lines, so the shape is treated as 'solid'
643
+ this.switchLineBatchShape(toLineBatchShape({ ...strokeStyle, lineStyle: 'solid' }));
644
+ // Split into dashes on the CPU side (the outer ring and each inner ring are drawn as
645
+ // closed paths)
646
+ const dashPattern = getStrokeDashPattern(strokeStyle.lineStyle, effectiveStrokeWidth);
647
+ if (dashPattern) {
648
+ for (const ring of rings) {
649
+ if (ring.length < 3)
650
+ continue;
651
+ // To draw it as a closed path, the first point is appended at the end
652
+ const closedCoords = [...ring];
653
+ const first = closedCoords[0];
654
+ const last = closedCoords[closedCoords.length - 1];
655
+ if (first[0] !== last[0] || first[1] !== last[1]) {
656
+ closedCoords.push(first);
657
+ }
658
+ const dashSegments = splitIntoDashes(densifyPathForGlobe(this.terrain, closedCoords), dashPattern[0], dashPattern[1], this.zoom);
659
+ for (const segment of dashSegments) {
660
+ if (segment.coords.length >= 2) {
661
+ this.lineBatch.push(withFixedWidth(toLineBatchItem(segment.coords, featureId, strokeStyle, createdZoom), fixedWidth));
662
+ }
663
+ }
664
+ }
665
+ }
666
+ }
667
+ flushPolygonFillBatch() {
668
+ if (this.polygonFillBatch.length > 0 && this.projectionData) {
669
+ this.polygonBatchRenderer.drawBatch(this.polygonFillBatch, this.projectionData, this.zoom);
670
+ this.polygonFillBatch.length = 0;
671
+ }
672
+ }
673
+ flushSdfPolygonBatch() {
674
+ if (this.sdfPolygonBatch.length > 0 && this.projectionData) {
675
+ this.sdfPolygonRenderer.drawBatch(this.sdfPolygonBatch, this.projectionData, this.zoom, [this.gl.drawingBufferWidth, this.gl.drawingBufferHeight], this.factors);
676
+ this.sdfPolygonBatch.length = 0;
677
+ }
678
+ }
679
+ /**
680
+ * A color with the opacity of the layer multiplied into its alpha (for the fill-only polygon
681
+ * batch, whose colors are per vertex and which has no factor uniform)
682
+ */
683
+ colorWithLayerOpacity(color) {
684
+ const opacity = this.factors.opacity;
685
+ return opacity === 1 ? color : [color[0], color[1], color[2], color[3] * opacity];
686
+ }
687
+ /**
688
+ * A point style with the opacity of the layer multiplied in (for the per-point renderer, which
689
+ * has no factor uniform)
690
+ */
691
+ withLayerOpacity(style) {
692
+ const opacity = this.factors.opacity;
693
+ if (opacity === 1)
694
+ return style;
695
+ return {
696
+ ...style,
697
+ fillOpacity: style.fillOpacity * opacity,
698
+ strokeOpacity: style.strokeOpacity * opacity,
699
+ };
700
+ }
701
+ flushAllBatches() {
702
+ if (this.pointBatches.size > 0) {
703
+ this.flushPointBatches();
704
+ }
705
+ if (this.polygonFillBatch.length > 0) {
706
+ this.flushPolygonFillBatch();
707
+ }
708
+ if (this.sdfPolygonBatch.length > 0) {
709
+ this.flushSdfPolygonBatch();
710
+ }
711
+ }
712
+ }
713
+ /**
714
+ * Create a BatchManager
715
+ */
716
+ export function createBatchManager(deps) {
717
+ return new BatchManager(deps);
718
+ }