@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,567 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { resolveContentPixelRatio, resolvePixelRatio } from '../../../shared/utils/pixel-ratio.js';
4
+ import { calculateOffsetUniforms, createProgram } from '../../shaders/helpers.js';
5
+ import { ProjectionUniformManager } from '../../shaders/projection.js';
6
+ import { TerrainContext } from '../../terrain/context.js';
7
+ import { NEUTRAL_DRAW_FACTORS } from '../draw-factors.js';
8
+ import { buildLineBatchArrays, buildPackedLineBatchArrays, defaultLineOrigin, growFloat32, INSTANCE_STRIDE, lineStationsOnMercatorPlane, maxInstanceSegmentMercator, normalizeOrigin, resolveLineStations, STATION_VERTICES, toLineInstanceColor, writeLineCoordTexels, writeLineInstances, } from './line-geometry.js';
9
+ import { createRetainedLineBatch, deleteRetainedLineBatch, ImmediateCoordTexture, patchRetainedCoordTexels, releaseInstanceAttribs, setupInstanceAttribs, setupQuadAttribs, } from './line-gl.js';
10
+ import { buildLineVertexSource, LINE_FRAGMENT_SOURCE } from './line-shader.js';
11
+ import { LineUniforms } from './line-uniforms.js';
12
+ /**
13
+ * SDFLineRenderer
14
+ *
15
+ * Line rendering with the HHAA approach
16
+ */
17
+ export class SDFLineRenderer {
18
+ constructor(_map, gl, pixelRatio, terrain = new TerrainContext()) {
19
+ Object.defineProperty(this, "gl", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: void 0
24
+ });
25
+ Object.defineProperty(this, "program", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: null
30
+ });
31
+ Object.defineProperty(this, "variantName", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: ''
36
+ });
37
+ // Buffers for instancing
38
+ Object.defineProperty(this, "quadVAO", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: null
43
+ });
44
+ Object.defineProperty(this, "quadVBO", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: null
49
+ });
50
+ // GPU resources reused in immediate mode
51
+ Object.defineProperty(this, "immCoordTexture", {
52
+ enumerable: true,
53
+ configurable: true,
54
+ writable: true,
55
+ value: void 0
56
+ });
57
+ /** MAX_TEXTURE_SIZE of the context (read once, 0 = not read yet) */
58
+ Object.defineProperty(this, "maxTextureSize", {
59
+ enumerable: true,
60
+ configurable: true,
61
+ writable: true,
62
+ value: 0
63
+ });
64
+ /**
65
+ * Scratch arrays of the immediate draw of one line (grown, never shrunk)
66
+ *
67
+ * A frame of the immediate path draws every line in view one by one, and allocating two
68
+ * arrays per line puts the garbage collector under pressure on large data.
69
+ */
70
+ Object.defineProperty(this, "scratchCoords", {
71
+ enumerable: true,
72
+ configurable: true,
73
+ writable: true,
74
+ value: new Float32Array(0)
75
+ });
76
+ Object.defineProperty(this, "scratchInstances", {
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true,
80
+ value: new Float32Array(0)
81
+ });
82
+ Object.defineProperty(this, "immInstanceBuffer", {
83
+ enumerable: true,
84
+ configurable: true,
85
+ writable: true,
86
+ value: null
87
+ });
88
+ // State tracking within a frame
89
+ // isDrawing: a flag for skipping the recomputation of the projection uniforms and the
90
+ // viewport setup
91
+ // Note: the program and the VAO may be changed by other renderers, so they are always rebound
92
+ Object.defineProperty(this, "isDrawing", {
93
+ enumerable: true,
94
+ configurable: true,
95
+ writable: true,
96
+ value: false
97
+ });
98
+ Object.defineProperty(this, "frameCount", {
99
+ enumerable: true,
100
+ configurable: true,
101
+ writable: true,
102
+ value: 0
103
+ });
104
+ // The renderer-specific uniforms and the record of the values written last
105
+ Object.defineProperty(this, "uniforms", {
106
+ enumerable: true,
107
+ configurable: true,
108
+ writable: true,
109
+ value: void 0
110
+ });
111
+ // Projection uniform management (shared)
112
+ Object.defineProperty(this, "projectionUniformManager", {
113
+ enumerable: true,
114
+ configurable: true,
115
+ writable: true,
116
+ value: void 0
117
+ });
118
+ // Stores the offset uniforms
119
+ Object.defineProperty(this, "offsetUniforms", {
120
+ enumerable: true,
121
+ configurable: true,
122
+ writable: true,
123
+ value: null
124
+ });
125
+ /** The injected rendering ratio (read from window each time when not injected) */
126
+ Object.defineProperty(this, "pixelRatio", {
127
+ enumerable: true,
128
+ configurable: true,
129
+ writable: true,
130
+ value: void 0
131
+ });
132
+ /** The terrain state of the draw instance this renderer belongs to */
133
+ Object.defineProperty(this, "terrain", {
134
+ enumerable: true,
135
+ configurable: true,
136
+ writable: true,
137
+ value: void 0
138
+ });
139
+ this.gl = gl;
140
+ this.pixelRatio = pixelRatio;
141
+ this.terrain = terrain;
142
+ this.uniforms = new LineUniforms(gl);
143
+ this.immCoordTexture = new ImmediateCoordTexture(gl);
144
+ this.projectionUniformManager = new ProjectionUniformManager(gl, { surface: true, terrain });
145
+ this.initBuffers();
146
+ }
147
+ /**
148
+ * Initializes the fixed quad vertex buffer
149
+ */
150
+ initBuffers() {
151
+ const gl = this.gl;
152
+ this.quadVAO = gl.createVertexArray();
153
+ gl.bindVertexArray(this.quadVAO);
154
+ this.quadVBO = gl.createBuffer();
155
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.quadVBO);
156
+ gl.bufferData(gl.ARRAY_BUFFER, STATION_VERTICES, gl.STATIC_DRAW);
157
+ setupQuadAttribs(gl);
158
+ gl.bindVertexArray(null);
159
+ // The instance buffer for immediate mode (orphaned and reused on every draw)
160
+ this.immInstanceBuffer = gl.createBuffer();
161
+ }
162
+ /**
163
+ * Called at the start of a frame
164
+ *
165
+ * @internal
166
+ */
167
+ incrementFrame() {
168
+ this.frameCount++;
169
+ }
170
+ /**
171
+ * Begins drawing
172
+ *
173
+ * Sets the isDrawing flag to true and sets up the projection uniforms and the viewport.
174
+ * This lets subsequent draw()/drawBatch() calls skip those settings.
175
+ *
176
+ * @param projectionData MapLibre's ProjectionData
177
+ * @param zoom The current zoom level
178
+ *
179
+ * @internal
180
+ */
181
+ beginDraw(projectionData, zoom) {
182
+ if (!this.program)
183
+ return;
184
+ const gl = this.gl;
185
+ gl.useProgram(this.program);
186
+ gl.bindVertexArray(this.quadVAO);
187
+ this.setProjectionUniforms(projectionData, zoom);
188
+ // Set the viewport size (the actual framebuffer size)
189
+ this.uniforms.setViewport(gl.drawingBufferWidth, gl.drawingBufferHeight);
190
+ this.isDrawing = true;
191
+ }
192
+ /**
193
+ * Ends drawing
194
+ *
195
+ * Resets the isDrawing flag to false.
196
+ * Calling it at the end of a frame makes the projection uniforms be set up again on the next
197
+ * frame.
198
+ *
199
+ * @internal
200
+ */
201
+ endDraw() {
202
+ if (!this.isDrawing)
203
+ return;
204
+ const gl = this.gl;
205
+ releaseInstanceAttribs(gl);
206
+ this.isDrawing = false;
207
+ }
208
+ /**
209
+ * Gets the cache statistics
210
+ *
211
+ * @internal
212
+ */
213
+ getCacheStats() {
214
+ return {
215
+ size: 0,
216
+ frameCount: this.frameCount,
217
+ };
218
+ }
219
+ /**
220
+ * Ensures the shader
221
+ */
222
+ ensureShader(shaderData) {
223
+ if (this.variantName !== shaderData.variantName) {
224
+ if (this.program) {
225
+ this.gl.deleteProgram(this.program);
226
+ }
227
+ this.program = createProgram(this.gl, buildLineVertexSource(shaderData.vertexShaderPrelude, shaderData.define), LINE_FRAGMENT_SOURCE);
228
+ this.variantName = shaderData.variantName;
229
+ // Get the renderer-specific uniform locations (this also discards the record of the
230
+ // values written last, since a recreated program resets its uniforms)
231
+ this.uniforms.bind(this.program);
232
+ // Get the projection-related uniform locations (shared)
233
+ this.projectionUniformManager.getLocations(this.program);
234
+ }
235
+ }
236
+ /**
237
+ * Sets the uniforms for offset mode
238
+ */
239
+ setOffsetUniforms(uniforms) {
240
+ this.offsetUniforms = uniforms;
241
+ }
242
+ /**
243
+ * Sets the projection uniforms (supporting offset mode and globe mode)
244
+ * @param projectionData MapLibre's ProjectionData
245
+ * @param zoom The current zoom level (used to switch offset mode)
246
+ */
247
+ setProjectionUniforms(projectionData, zoom) {
248
+ this.projectionUniformManager.setUniforms(projectionData, zoom, this.offsetUniforms);
249
+ }
250
+ /** The largest side of a coordinate texture this GPU allows (MAX_TEXTURE_SIZE, read once) */
251
+ textureSizeLimit() {
252
+ if (this.maxTextureSize === 0) {
253
+ const max = Number(this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE));
254
+ this.maxTextureSize = Number.isFinite(max) && max > 0 ? max : 4096;
255
+ }
256
+ return this.maxTextureSize;
257
+ }
258
+ /**
259
+ * Executes the draw call (processing shared by draw/drawBatch)
260
+ *
261
+ * The coordinate texture and the instance buffer use the persistent immediate-mode
262
+ * resources. Finish the upload into `immCoordTexture` and the `bufferData` into instanceBuffer
263
+ * before calling it.
264
+ */
265
+ executeDrawCall(instanceCount, texSize, shape, zoom, projectionData, widthOverride, stations, factors = NEUTRAL_DRAW_FACTORS) {
266
+ const gl = this.gl;
267
+ // The program and the VAO may have been changed by other renderers, so always bind them
268
+ gl.useProgram(this.program);
269
+ gl.bindVertexArray(this.quadVAO);
270
+ // The projection uniforms and the viewport are skipped when beginDraw() already set them
271
+ // (a performance optimization)
272
+ if (!this.isDrawing) {
273
+ this.setProjectionUniforms(projectionData, zoom);
274
+ this.uniforms.setViewport(gl.drawingBufferWidth, gl.drawingBufferHeight);
275
+ }
276
+ // Set up the instance attributes (stride = 48 bytes = 12 floats)
277
+ // vertexAttribPointer records the current ARRAY_BUFFER binding, so it must always be
278
+ // called with the instance buffer bound
279
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.immInstanceBuffer);
280
+ setupInstanceAttribs(gl);
281
+ // Uniforms (color and opacity moved to instance attributes, so they are not here)
282
+ this.uniforms.setLineDraw(widthOverride, zoom, texSize, stations, lineStationsOnMercatorPlane(this.terrain));
283
+ // Always written (1 when the caller has none) so that no factor of an earlier draw is left
284
+ this.uniforms.setDrawFactors(factors);
285
+ // The coordinate texture (the sampler unit is written by LineUniforms.setLineDraw)
286
+ gl.activeTexture(gl.TEXTURE0);
287
+ gl.bindTexture(gl.TEXTURE_2D, this.immCoordTexture.texture);
288
+ // The dash pattern
289
+ this.uniforms.setDash(shape, resolvePixelRatio(this.pixelRatio));
290
+ // Draw
291
+ gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 2 * (stations + 1), instanceCount);
292
+ if (!this.isDrawing) {
293
+ releaseInstanceAttribs(gl);
294
+ }
295
+ }
296
+ /**
297
+ * Draws a line
298
+ */
299
+ draw(coords, style, options, zoom, projectionData) {
300
+ if (!this.program || coords.length < 2 || !projectionData)
301
+ return;
302
+ const gl = this.gl;
303
+ // Get the rendering ratio (to convert CSS pixels into physical pixels)
304
+ //
305
+ // When there is a createdZoom (= the GPU scales with zoom), use the ratio without
306
+ // renderScale applied; for a fixed width drawn with u_width, use the ratio that includes
307
+ // renderScale (the "two ratios" in shared/utils/pixel-ratio.ts).
308
+ const screenDpr = resolvePixelRatio(this.pixelRatio);
309
+ const contentDpr = resolveContentPixelRatio(this.pixelRatio);
310
+ const n = coords.length;
311
+ // The texture size
312
+ const texSize = Math.max(2, Math.ceil(Math.sqrt(n)));
313
+ // Compute the relative coordinates on the CPU side (offset mode: computed at 64-bit
314
+ // precision)
315
+ const centerLngLat = this.offsetUniforms?.centerLngLat ?? [0, 0];
316
+ // The texture data (stores the relative coordinates). Only the first n texels are read,
317
+ // so what the reused array holds past them does not matter
318
+ this.scratchCoords = growFloat32(this.scratchCoords, texSize * texSize * 4);
319
+ const texData = this.scratchCoords.subarray(0, texSize * texSize * 4);
320
+ writeLineCoordTexels(texData, 0, coords, centerLngLat);
321
+ // Upload into the coordinate texture (the persistent texture is reused)
322
+ if (!this.immCoordTexture.upload(texData, texSize, this.textureSizeLimit()))
323
+ return;
324
+ // The instance data (12 floats per instance: indices(4) + extra(4) + color(4))
325
+ const instanceCount = n - 1;
326
+ this.scratchInstances = growFloat32(this.scratchInstances, instanceCount * INSTANCE_STRIDE);
327
+ const instanceData = this.scratchInstances.subarray(0, instanceCount * INSTANCE_STRIDE);
328
+ const instanceColor = toLineInstanceColor(style.color, style.opacity);
329
+ // Compute on the GPU when createdZoom is specified, otherwise use u_width
330
+ const useGpuScaling = options.createdZoom !== undefined;
331
+ // Convert the line width into physical pixels (CSS pixels * devicePixelRatio)
332
+ const strokeWidth = useGpuScaling ? style.width * contentDpr : 0;
333
+ const createdZoom = options.createdZoom ?? 0;
334
+ const maxSegmentMeters = writeLineInstances(instanceData, 0, 0, coords, {
335
+ closed: options.closed,
336
+ zoom,
337
+ dashPixelRatio: screenDpr,
338
+ // a_extra.y: the original line width (px); u_width is used when it is 0
339
+ strokeWidth,
340
+ createdZoom,
341
+ color: instanceColor,
342
+ });
343
+ // Only the globe reads the length on the Mercator plane
344
+ const maxSegmentMercator = lineStationsOnMercatorPlane(this.terrain)
345
+ ? maxInstanceSegmentMercator(instanceData, instanceCount, zoom, screenDpr)
346
+ : 0;
347
+ // Upload into the instance buffer (orphaned and reused)
348
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.immInstanceBuffer);
349
+ gl.bufferData(gl.ARRAY_BUFFER, instanceData, gl.STREAM_DRAW);
350
+ // widthOverride: the GPU computation (0) when createdZoom is specified, otherwise u_width
351
+ // Convert the line width into physical pixels (CSS pixels * devicePixelRatio)
352
+ const widthOverride = useGpuScaling ? 0 : style.width * screenDpr;
353
+ this.executeDrawCall(instanceCount, texSize, { lineStyle: style.lineStyle, dashArray: style.dashArray }, zoom, projectionData, widthOverride, resolveLineStations(this.terrain, maxSegmentMeters, instanceCount, maxSegmentMercator));
354
+ }
355
+ /**
356
+ * Draws a closed path
357
+ */
358
+ drawClosed(coords, style, options, zoom, projectionData) {
359
+ if (coords.length < 3)
360
+ return;
361
+ // Remove the duplicate when the first and last points are the same
362
+ let closedCoords = coords;
363
+ const first = coords[0];
364
+ const last = coords[coords.length - 1];
365
+ if (first[0] === last[0] && first[1] === last[1]) {
366
+ closedCoords = coords.slice(0, -1);
367
+ }
368
+ // Draw it as a closed path
369
+ const loopCoords = [...closedCoords, closedCoords[0]];
370
+ this.draw(loopCoords, style, { ...options, closed: true }, zoom, projectionData);
371
+ }
372
+ /**
373
+ * Batch-draws multiple lines (per-instance colors)
374
+ *
375
+ * Color and opacity are passed as instance attributes, so even when the color differs from
376
+ * one line to the next, they can be drawn in one draw call as long as the shape parameters
377
+ * (the dash kind) are the same.
378
+ *
379
+ * @param items The line data (carrying the color, opacity, and width per line)
380
+ * @param shape The per-batch shape parameters, such as the dash kind
381
+ * @param factors The factors used at draw time (the opacity of the layer being drawn; 1x
382
+ * scale and opacity 1 when omitted)
383
+ *
384
+ * @internal
385
+ */
386
+ drawAll(items, shape, zoom, projectionData, factors = NEUTRAL_DRAW_FACTORS) {
387
+ if (!this.program || items.length === 0)
388
+ return;
389
+ const gl = this.gl;
390
+ // Compute the relative coordinates on the CPU side (offset mode: computed at 64-bit
391
+ // precision)
392
+ const centerLngLat = this.offsetUniforms?.centerLngLat ?? [0, 0];
393
+ const arrays = buildLineBatchArrays(items, zoom, centerLngLat, this.pixelRatio);
394
+ if (!arrays)
395
+ return;
396
+ // Upload into the coordinate texture (the persistent texture is reused)
397
+ if (!this.immCoordTexture.upload(arrays.texData, arrays.texSize, this.textureSizeLimit())) {
398
+ return;
399
+ }
400
+ // Upload into the instance buffer (orphaned and reused)
401
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.immInstanceBuffer);
402
+ gl.bufferData(gl.ARRAY_BUFFER, arrays.instanceData, gl.STREAM_DRAW);
403
+ this.executeDrawCall(arrays.instanceCount, arrays.texSize, shape, zoom, projectionData, 0, resolveLineStations(this.terrain, arrays.maxSegmentMeters, arrays.instanceCount, arrays.maxSegmentMercator), factors);
404
+ }
405
+ /**
406
+ * Builds a retained-mode line batch
407
+ *
408
+ * It creates the coordinate texture, the instance buffer, and the VAO so that on later
409
+ * frames `drawRetainedBatch` can draw with nothing but a bind, the uniforms, and the draw
410
+ * call. The vertex data does not depend on the camera (the projection is done by the
411
+ * uniforms on every frame).
412
+ *
413
+ * @param items The line data (carrying the color, opacity, and width per line)
414
+ * @param shape The per-batch shape parameters, such as the dash kind
415
+ * @param options The origin of the relative coordinates and the zoom for the line-width
416
+ * computation
417
+ * @returns The built batch, or null when the shader is not initialized or there are not
418
+ * enough coordinates
419
+ *
420
+ * @internal
421
+ */
422
+ buildRetainedBatch(items, shape, options = {}) {
423
+ if (!this.program || items.length === 0)
424
+ return null;
425
+ // The origin of the relative coordinates is fixed per batch (it must not depend on the
426
+ // camera center)
427
+ const origin = normalizeOrigin(options.origin ?? defaultLineOrigin(items));
428
+ const arrays = buildLineBatchArrays(items, options.distanceZoom ?? 0, origin, this.pixelRatio);
429
+ if (!arrays)
430
+ return null;
431
+ return createRetainedLineBatch(this.gl, arrays, shape, origin, options.widthZoom ?? null, this.textureSizeLimit());
432
+ }
433
+ /**
434
+ * Builds a retained-mode line batch from packed lines
435
+ *
436
+ * The same batch as `buildRetainedBatch` builds for the same lines, without an array per line.
437
+ *
438
+ * @returns The built batch, or null when the shader is not initialized or there are not
439
+ * enough coordinates
440
+ *
441
+ * @internal
442
+ */
443
+ buildRetainedPackedBatch(lines, shape, options = {}) {
444
+ if (!this.program || lines.count === 0)
445
+ return null;
446
+ const first = lines.start[0] * lines.stride;
447
+ const origin = normalizeOrigin(options.origin ?? [lines.coords[first] ?? 0, lines.coords[first + 1] ?? 0]);
448
+ const arrays = buildPackedLineBatchArrays(lines, options.distanceZoom ?? 0, origin, this.pixelRatio);
449
+ if (!arrays)
450
+ return null;
451
+ return createRetainedLineBatch(this.gl, arrays, shape, origin, options.widthZoom ?? null, this.textureSizeLimit());
452
+ }
453
+ /**
454
+ * Draws a retained-mode line batch
455
+ *
456
+ * It neither creates textures nor calls bufferData. The projection uniforms are recomputed
457
+ * every frame from the origin coordinate of the batch (the vertex data is not rebuilt).
458
+ *
459
+ * @param factors The factors used at draw time (when omitted, 1x scale and opacity 1, the
460
+ * same as before)
461
+ *
462
+ * @internal
463
+ */
464
+ drawRetainedBatch(batch, zoom, projectionData, factors = NEUTRAL_DRAW_FACTORS) {
465
+ if (!this.program || batch.instanceCount === 0)
466
+ return;
467
+ const gl = this.gl;
468
+ gl.useProgram(this.program);
469
+ gl.bindVertexArray(batch.vao);
470
+ // The center of linearization is aligned with the camera center (linearizing around the
471
+ // origin coordinate of the batch turns the residual of the Mercator approximation into a
472
+ // displacement of pixel magnitude at vertices far from the center).
473
+ // The vertices are relative to the origin coordinate, so that difference is passed via
474
+ // u_origin_shift
475
+ const cameraUniforms = this.offsetUniforms;
476
+ if (cameraUniforms) {
477
+ this.projectionUniformManager.setUniforms(projectionData, zoom, cameraUniforms, [
478
+ batch.origin[0] - cameraUniforms.centerLngLat[0],
479
+ batch.origin[1] - cameraUniforms.centerLngLat[1],
480
+ ]);
481
+ }
482
+ else {
483
+ // Fallback (normally custom-layer has already called setOffsetUniforms each frame)
484
+ this.projectionUniformManager.setUniforms(projectionData, zoom, calculateOffsetUniforms(batch.origin, projectionData.mainMatrix));
485
+ }
486
+ this.uniforms.setViewport(gl.drawingBufferWidth, gl.drawingBufferHeight);
487
+ const stations = resolveLineStations(this.terrain, batch.maxSegmentMeters, batch.instanceCount, batch.maxSegmentMercator);
488
+ this.uniforms.setLineDraw(0, batch.widthZoom ?? zoom, batch.texSize, stations, lineStationsOnMercatorPlane(this.terrain));
489
+ this.uniforms.setDrawFactors(factors);
490
+ // The coordinate texture (the sampler unit is written by LineUniforms.setLineDraw)
491
+ gl.activeTexture(gl.TEXTURE0);
492
+ gl.bindTexture(gl.TEXTURE_2D, batch.texture);
493
+ this.uniforms.setDash(batch.shape, resolvePixelRatio(this.pixelRatio));
494
+ gl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 2 * (stations + 1), batch.instanceCount);
495
+ gl.bindVertexArray(null);
496
+ // When this interrupted an immediate-mode frame, restore the shared VAO and the projection
497
+ // uniforms (because the subsequent drawAll assumes the state set up by beginDraw)
498
+ if (this.isDrawing) {
499
+ gl.bindVertexArray(this.quadVAO);
500
+ this.setProjectionUniforms(projectionData, zoom);
501
+ // Leave no residual factors either (executeDrawCall rewrites them too, but the restoring
502
+ // side closes the loop)
503
+ this.uniforms.setDrawFactors(NEUTRAL_DRAW_FACTORS);
504
+ }
505
+ }
506
+ /**
507
+ * Partially updates the coordinate texture of a retained batch (applying the diff from a
508
+ * vertex drag)
509
+ *
510
+ * Rebuilding the batch every time a single vertex moves overflows the frame for lines with
511
+ * many vertices. The coordinates live in the texture, so rewriting only the texel of the
512
+ * vertex that moved is enough.
513
+ *
514
+ * The instance array is not touched. The indices (a_indices) are invariant as topology as
515
+ * long as the number of coordinates does not change, and the miter computation follows
516
+ * automatically because the shader reads them back with texelFetch. a_extra.x (the
517
+ * cumulative distance) and a_extra.w (the segment length) are left stale, but those are
518
+ * dash-only values, and a retained-mode line batch is always solid (dashed lines go through
519
+ * immediate mode). Both the line width and the caps are computed from lengths recomputed in
520
+ * screen space, so there is no visual impact. Those values return to correct ones on the
521
+ * next full rebuild (a style change, a change in the number of vertices, and so on).
522
+ *
523
+ * There is also no need to rebuild after the drag is committed. The last patch applied is
524
+ * the committed value as it stands.
525
+ *
526
+ * @param updates The running index within the coordinate texture and the new longitude and
527
+ * latitude of that vertex
528
+ *
529
+ * @internal
530
+ */
531
+ patchRetainedBatchCoords(batch, updates) {
532
+ patchRetainedCoordTexels(this.gl, batch, updates);
533
+ }
534
+ /**
535
+ * Disposes of a retained-mode line batch
536
+ *
537
+ * @internal
538
+ */
539
+ disposeRetainedBatch(batch) {
540
+ deleteRetainedLineBatch(this.gl, batch);
541
+ }
542
+ /**
543
+ * Disposes of the resources
544
+ *
545
+ * @internal
546
+ */
547
+ dispose() {
548
+ const gl = this.gl;
549
+ if (this.program) {
550
+ gl.deleteProgram(this.program);
551
+ this.program = null;
552
+ }
553
+ if (this.quadVAO) {
554
+ gl.deleteVertexArray(this.quadVAO);
555
+ this.quadVAO = null;
556
+ }
557
+ if (this.quadVBO) {
558
+ gl.deleteBuffer(this.quadVBO);
559
+ this.quadVBO = null;
560
+ }
561
+ this.immCoordTexture.dispose();
562
+ if (this.immInstanceBuffer) {
563
+ gl.deleteBuffer(this.immInstanceBuffer);
564
+ this.immInstanceBuffer = null;
565
+ }
566
+ }
567
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Runs a draw callback with the depth test off, then restores the depth test as it was.
3
+ *
4
+ * Use it around anything drawn as a billboard (a marker or an icon facing the screen) so that
5
+ * the terrain mesh does not cut it in half. Polygons and lines should stay depth-tested.
6
+ *
7
+ * @param gl The WebGL context of the map
8
+ * @param draw The drawing to run
9
+ */
10
+ export declare function drawBillboardsWithoutDepth(gl: WebGL2RenderingContext, draw: () => void): void;
@@ -0,0 +1,56 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Draws symbols (billboards and glyphs) with the depth test disabled.
5
+ *
6
+ * A point is lifted to the elevation of its anchor and then drawn as a billboard that faces
7
+ * the screen. The lower half of the billboard sits below the anchor, so testing it against the
8
+ * depth of the terrain mesh buries it in the ground and clips it away, leaving the point as a
9
+ * half circle. Whether something is hidden by the terrain is the job of the occlusion ghost
10
+ * (occlusion.ts), not of the depth test, so the depth test is always disabled here.
11
+ *
12
+ * The responsibility for disabling the depth test belongs to the renderer. Disabling it in
13
+ * custom-layer instead means it gets forgotten in configurations where the analytic drape is
14
+ * unavailable (a single dataset makes canDrape false). That is exactly what the
15
+ * "only points of datasets become half circles" defect was.
16
+ *
17
+ * Billboards are not drawn in a single place. Both the instanced billboard (point-instance) and
18
+ * the per-point shapes (point-shape: triangle, star, icon, and the degenerate path for the
19
+ * default circle) draw billboards. Wrapping only the instanced side leaves hand-drawn points as
20
+ * half circles. A hand-drawn Point may be taken over by a registered CustomFeatureRenderer,
21
+ * and then never goes through the instanced path at all. That is why this function is shared
22
+ * by every renderer that draws billboards. SDF glyphs laid flat on the map plane (text that is
23
+ * not painted into a ground quad) go through here for the same reason.
24
+ * A glyph is a flat quad given elevation at its four corners, so, having no subdivision, its
25
+ * strokes get shaved off where the terrain pokes through from the inside and the text looks
26
+ * broken.
27
+ *
28
+ * The original state is always restored. Polygons and lines must be hidden correctly by the
29
+ * depth of the terrain mesh.
30
+ *
31
+ * The original state is read from the record in `layer/depth-state.ts`. It must not be queried
32
+ * with `gl.isEnabled` every time (that is a synchronous GPU round trip, and on a map with
33
+ * thousands of labels a single frame reaches tens of seconds).
34
+ */
35
+ import { isDepthTestEnabled, setDepthTestEnabled } from '../../layer/depth-state.js';
36
+ /**
37
+ * Runs a draw callback with the depth test off, then restores the depth test as it was.
38
+ *
39
+ * Use it around anything drawn as a billboard (a marker or an icon facing the screen) so that
40
+ * the terrain mesh does not cut it in half. Polygons and lines should stay depth-tested.
41
+ *
42
+ * @param gl The WebGL context of the map
43
+ * @param draw The drawing to run
44
+ */
45
+ export function drawBillboardsWithoutDepth(gl, draw) {
46
+ const depthWasEnabled = isDepthTestEnabled(gl);
47
+ if (depthWasEnabled)
48
+ setDepthTestEnabled(gl, false);
49
+ try {
50
+ draw();
51
+ }
52
+ finally {
53
+ if (depthWasEnabled)
54
+ setDepthTestEnabled(gl, true);
55
+ }
56
+ }