@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,364 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The GLSL sources of the SDF line program
5
+ *
6
+ * The HHAA approach:
7
+ * 1. Project geographic coordinates -> Mercator -> clip space
8
+ * 2. Compute the normal direction in clip space
9
+ * 3. Compute the offset in screen space (pixels)
10
+ * 4. Convert back to clip space and set gl_Position
11
+ * 5. Pass the signed distance (pixels) to the fragment stage
12
+ *
13
+ * The vertex stage also computes the miter/bevel joins, the round caps, and the subdivision
14
+ * of a segment on terrain and on the globe; the fragment stage computes the coverage of the line body and the
15
+ * caps and applies the dash pattern.
16
+ */
17
+ import { getProjectionTransitionUniform, OFFSET_MODE_GLSL } from '../../shaders/helpers.js';
18
+ /**
19
+ * The vertex shader source of the SDF line program
20
+ *
21
+ * @param prelude The vertex shader prelude maplibre hands to the custom layer
22
+ * @param define The defines of the projection variant
23
+ *
24
+ * @internal
25
+ */
26
+ export function buildLineVertexSource(prelude, define) {
27
+ const projTransitionUniform = getProjectionTransitionUniform(prelude);
28
+ return `#version 300 es
29
+ ${prelude}
30
+ ${define}
31
+ ${projTransitionUniform}${OFFSET_MODE_GLSL}
32
+
33
+ // Strip vertex attributes
34
+ layout(location = 0) in float a_side; // 1=left, -1=right
35
+ // a_station: the index of the subdivision point along the segment (0..u_stations)
36
+ layout(location = 1) in float a_station;
37
+
38
+ // Instance attributes
39
+ // a_indices: x=start point idx, y=end point idx, z=previous point idx (-1=none),
40
+ // w=next point idx (-1=none)
41
+ layout(location = 2) in vec4 a_indices;
42
+ // a_extra: x=cumulative distance at the segment start (drawing-buffer px at the draw zoom,
43
+ // for dashes), y=original line width (px), z=createdZoom, w=segment length
44
+ layout(location = 3) in vec4 a_extra;
45
+ layout(location = 4) in vec4 a_color; // line color (opacity already folded in)
46
+
47
+ // Uniforms
48
+ uniform float u_width; // line width (pixels) - for individual draws
49
+ uniform float u_zoom; // current zoom level
50
+ uniform vec2 u_viewport; // viewport size
51
+ uniform float u_miter_limit; // miter limit
52
+ uniform sampler2D u_coord_tex;
53
+ uniform float u_tex_size;
54
+ uniform float u_size_scale; // size factor at draw time (default 1)
55
+ uniform float u_stations; // number of subdivisions of the segment (1 on a flat map)
56
+ // 1 when the subdivision points move along the Mercator plane (the globe), 0 when they move
57
+ // along the degrees (the terrain)
58
+ uniform float u_station_mercator;
59
+
60
+ out float v_dist; // signed distance from the line center (pixels)
61
+ out float v_width; // half the line width (pixels)
62
+ out float v_linesofar; // cumulative distance (drawing-buffer px, for dashes)
63
+ // v_line_pos: position along the line (0=start, segmentLength=end,
64
+ // negative=start cap, >segmentLength=end cap)
65
+ out float v_line_pos;
66
+ out float v_seg_length; // segment length
67
+ out vec4 v_color; // line color (instance attribute)
68
+
69
+ // Read the relative coordinate from the coordinate texture
70
+ // (already computed at 64-bit precision on the CPU side)
71
+ vec2 getCoordOffset(int idx) {
72
+ int x = idx % int(u_tex_size);
73
+ int y = idx / int(u_tex_size);
74
+ return texelFetch(u_coord_tex, ivec2(x, y), 0).xy;
75
+ }
76
+
77
+ // Project the relative coordinate to get clip-space coordinates (high-precision version)
78
+ vec4 projectOffset(vec2 offset) {
79
+ return project_position_to_clipspace_from_offset(offset, u_projection_matrix);
80
+ }
81
+
82
+ // The Mercator limit of latitude (the plane reaches infinity at the poles)
83
+ const float STATION_MAX_LAT = 85.0511287798066;
84
+
85
+ // Mercator coordinates (0-1) -> WGS84
86
+ vec2 stationMercatorToLngLat(vec2 mercator) {
87
+ float lng = mercator.x * 360.0 - 180.0;
88
+ float lat = degrees(atan(sinh(PI * (1.0 - 2.0 * mercator.y))));
89
+ return vec2(lng, lat);
90
+ }
91
+
92
+ // The point at t along the segment from a to b (relative coordinates)
93
+ //
94
+ // On the terrain it moves along the degrees, as it always has. On the globe it moves along the
95
+ // straight line of the Mercator plane: that is the path maplibre draws an edge along on the
96
+ // sphere (a parallel stays a parallel), where a straight line between the projected ends would
97
+ // be a chord through the sphere.
98
+ vec2 stationOffset(vec2 a, vec2 b, float t) {
99
+ if (u_station_mercator < 0.5) return mix(a, b, t);
100
+ // The same absolute coordinates as project_position_to_clipspace_from_offset
101
+ vec2 base = u_origin_shift + u_center_lnglat;
102
+ vec2 la = a + base;
103
+ vec2 lb = b + base;
104
+ la.y = clamp(la.y, -STATION_MAX_LAT, STATION_MAX_LAT);
105
+ lb.y = clamp(lb.y, -STATION_MAX_LAT, STATION_MAX_LAT);
106
+ vec2 mercator = mix(lngLatToMercator(la), lngLatToMercator(lb), t);
107
+ return stationMercatorToLngLat(mercator) - base;
108
+ }
109
+
110
+ // Convert clip-space coordinates into screen space (pixels)
111
+ vec2 clipToScreen(vec4 clip) {
112
+ vec2 ndc = clip.xy / clip.w;
113
+ return (ndc * 0.5 + 0.5) * u_viewport;
114
+ }
115
+
116
+ // Convert a screen-space offset into a clip-space offset
117
+ vec2 screenToClipOffset(vec2 screenOffset, float w) {
118
+ return screenOffset * 2.0 / u_viewport * w;
119
+ }
120
+
121
+ void main() {
122
+ // Get the indices
123
+ int startIdx = int(a_indices.x);
124
+ int endIdx = int(a_indices.y);
125
+ int prevIdx = int(a_indices.z);
126
+ int nextIdx = int(a_indices.w);
127
+
128
+ // The position along the segment (0=start, 1=end)
129
+ // With u_stations = 1 only 0 and 1 come out, which is identical to before terrain
130
+ float stations = max(u_stations, 1.0);
131
+ float t = min(a_station / stations, 1.0);
132
+ bool atStart = a_station < 0.5;
133
+ bool atEnd = t >= 1.0;
134
+
135
+ // Get the relative coordinates (already computed at 64-bit precision on the CPU side)
136
+ vec2 startOffset = getCoordOffset(startIdx);
137
+ vec2 endOffset = getCoordOffset(endIdx);
138
+
139
+ // High-precision version: project into clip space
140
+ vec4 startClip = projectOffset(startOffset);
141
+ vec4 endClip = projectOffset(endOffset);
142
+
143
+ // Convert into screen space
144
+ vec2 startScreen = clipToScreen(startClip);
145
+ vec2 endScreen = clipToScreen(endClip);
146
+
147
+ // The current point (start or end)
148
+ vec4 currentClip = atStart ? startClip : endClip;
149
+ vec2 currentScreen = atStart ? startScreen : endScreen;
150
+
151
+ // The direction of the segment (screen space)
152
+ vec2 segmentVec = endScreen - startScreen;
153
+ float screenSegmentLength = length(segmentVec);
154
+ vec2 segmentDir = segmentVec / screenSegmentLength;
155
+ // The normal vector (pointing left)
156
+ vec2 normal = vec2(-segmentDir.y, segmentDir.x);
157
+
158
+ // Only for subdivision on terrain or on the globe (u_stations > 1), compute the position of
159
+ // the subdivision point and the local direction. On a flat map without terrain, the uniform
160
+ // branch skips this block entirely, so it is exactly identical to the previous computation.
161
+ if (u_stations > 1.5) {
162
+ float dt = 1.0 / stations;
163
+ vec2 backOffset = stationOffset(startOffset, endOffset, max(t - dt, 0.0));
164
+ vec2 forwardOffset = stationOffset(startOffset, endOffset, min(t + dt, 1.0));
165
+
166
+ if (!atStart && !atEnd) {
167
+ vec2 midOffset = stationOffset(startOffset, endOffset, t);
168
+ currentClip = projectOffset(midOffset);
169
+ currentScreen = clipToScreen(currentClip);
170
+ }
171
+
172
+ vec2 backScreen = atStart ? currentScreen : clipToScreen(projectOffset(backOffset));
173
+ vec2 forwardScreen = atEnd ? currentScreen : clipToScreen(projectOffset(forwardOffset));
174
+ vec2 localVec = forwardScreen - backScreen;
175
+ float localLen = length(localVec);
176
+ if (localLen > 0.0001) {
177
+ vec2 localDir = localVec / localLen;
178
+ segmentDir = localDir;
179
+ normal = vec2(-localDir.y, localDir.x);
180
+ }
181
+ }
182
+
183
+ // Miter computation
184
+ float miterScale = 1.0;
185
+ vec2 miterNormal = normal;
186
+
187
+ if (atStart) {
188
+ // Start point: take the previous segment into account
189
+ if (prevIdx >= 0) {
190
+ vec2 prevOffset = getCoordOffset(prevIdx);
191
+ vec4 prevClip = projectOffset(prevOffset);
192
+ vec2 prevScreen = clipToScreen(prevClip);
193
+
194
+ vec2 prevDir = normalize(startScreen - prevScreen);
195
+ vec2 prevNormal = vec2(-prevDir.y, prevDir.x);
196
+
197
+ // The miter normal (the average of the two normals, normalized)
198
+ vec2 avgNormal = prevNormal + normal;
199
+ float avgLen = length(avgNormal);
200
+ if (avgLen > 0.001) {
201
+ miterNormal = avgNormal / avgLen;
202
+ float cosHalf = dot(miterNormal, normal);
203
+ if (cosHalf > 0.001) {
204
+ miterScale = 1.0 / cosHalf;
205
+ // Fall back to a bevel once the miter limit is exceeded
206
+ if (miterScale > u_miter_limit) {
207
+ miterScale = 1.0;
208
+ miterNormal = normal;
209
+ }
210
+ }
211
+ }
212
+ }
213
+ } else if (atEnd) {
214
+ // End point: take the next segment into account
215
+ if (nextIdx >= 0) {
216
+ vec2 nextOffset = getCoordOffset(nextIdx);
217
+ vec4 nextClip = projectOffset(nextOffset);
218
+ vec2 nextScreen = clipToScreen(nextClip);
219
+
220
+ vec2 nextDir = normalize(nextScreen - endScreen);
221
+ vec2 nextNormal = vec2(-nextDir.y, nextDir.x);
222
+
223
+ // The miter normal
224
+ vec2 avgNormal = normal + nextNormal;
225
+ float avgLen = length(avgNormal);
226
+ if (avgLen > 0.001) {
227
+ miterNormal = avgNormal / avgLen;
228
+ float cosHalf = dot(miterNormal, normal);
229
+ if (cosHalf > 0.001) {
230
+ miterScale = 1.0 / cosHalf;
231
+ // Fall back to a bevel once the miter limit is exceeded
232
+ if (miterScale > u_miter_limit) {
233
+ miterScale = 1.0;
234
+ miterNormal = normal;
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+
241
+ // Scale the line width with the zoom level (computed on the GPU side)
242
+ // a_extra.y = the original line width (pixels relative to createdZoom)
243
+ // a_extra.z = createdZoom
244
+ // widthPixels = strokeWidth * 2^(u_zoom - createdZoom)
245
+ //
246
+ // strokeWidth < 0 means "a fixed width of -strokeWidth pixels (zoom-independent)".
247
+ // This is the convention that lets features without a createdZoom be mixed into the same
248
+ // batch (= the same u_zoom) as variable-width features and drawn together.
249
+ //
250
+ // u_size_scale is the size factor at draw time (default 1). It is multiplied outside the
251
+ // branch so that it takes effect no matter which branch the data layer goes through.
252
+ float strokeWidth = a_extra.y;
253
+ float createdZoom = a_extra.z;
254
+ float lineWidth = (strokeWidth > 0.0
255
+ ? strokeWidth * pow(2.0, u_zoom - createdZoom)
256
+ : (strokeWidth < 0.0 ? -strokeWidth : u_width)) * u_size_scale;
257
+ float halfWidth = lineWidth / 2.0;
258
+
259
+ // HHAA: expand by w+1 so that partially covered pixels are included too
260
+ float expandedHalfWidth = halfWidth + 1.0;
261
+
262
+ // The offset in screen space
263
+ vec2 screenOffset = miterNormal * a_side * expandedHalfWidth * miterScale;
264
+
265
+ // Convert it into an offset in clip space
266
+ vec2 clipOffset = screenToClipOffset(screenOffset, currentClip.w);
267
+
268
+ // Segment information
269
+ float segmentStart = a_extra.x; // cumulative distance at the starting position
270
+ // Use the screen-space segment length computed on the GPU side (better precision)
271
+
272
+ // Round cap handling
273
+ // When there is no preceding or following segment, expand to round off the end
274
+ bool isStartCap = atStart && (prevIdx < 0);
275
+ bool isEndCap = atEnd && (nextIdx < 0);
276
+
277
+ vec2 capOffset = vec2(0.0);
278
+ float linePos = t * screenSegmentLength; // position along the line
279
+
280
+ if (isStartCap) {
281
+ // Start cap: expand against the direction of travel
282
+ capOffset = -segmentDir * expandedHalfWidth;
283
+ linePos = -expandedHalfWidth; // before the start point
284
+ } else if (isEndCap) {
285
+ // End cap: expand along the direction of travel
286
+ capOffset = segmentDir * expandedHalfWidth;
287
+ linePos = screenSegmentLength + expandedHalfWidth; // beyond the end point
288
+ }
289
+
290
+ // The final position (including the cap expansion)
291
+ vec2 totalScreenOffset = screenOffset + capOffset;
292
+ vec2 totalClipOffset = screenToClipOffset(totalScreenOffset, currentClip.w);
293
+ gl_Position = currentClip + vec4(totalClipOffset, 0.0, 0.0);
294
+
295
+ // The values passed to the fragment stage
296
+ v_dist = a_side * expandedHalfWidth; // signed distance (pixels)
297
+ v_width = halfWidth; // half the line width (pixels)
298
+ v_linesofar = segmentStart + t * screenSegmentLength; // cumulative distance (for dashes)
299
+ v_line_pos = linePos; // position along the line
300
+ v_seg_length = screenSegmentLength; // segment length (computed on the GPU)
301
+ v_color = a_color; // line color (instance attribute)
302
+ }`;
303
+ }
304
+ /**
305
+ * The fragment shader source of the SDF line program
306
+ *
307
+ * @internal
308
+ */
309
+ export const LINE_FRAGMENT_SOURCE = `#version 300 es
310
+ precision highp float;
311
+
312
+ in float v_dist; // signed distance from the line center (pixels)
313
+ in float v_width; // half the line width (pixels)
314
+ in float v_line_pos; // position along the line
315
+ in float v_seg_length; // segment length
316
+ in float v_linesofar; // cumulative distance (drawing-buffer px, for dashes)
317
+ in vec4 v_color; // line color (opacity already folded in)
318
+
319
+ uniform float u_dashEnabled; // flag that enables the dash pattern
320
+ uniform vec4 u_dashArray; // [dash, gap, period, 0] in drawing-buffer px
321
+ uniform float u_opacity; // opacity factor at draw time (default 1)
322
+
323
+ out vec4 fragColor;
324
+
325
+ void main() {
326
+ float d = v_dist;
327
+ float w = v_width;
328
+
329
+ // Compute the distance from the ends along the line
330
+ // startDist: distance from the start point (negative=inside the line, positive=cap region)
331
+ float startDist = -v_line_pos;
332
+ // endDist: distance from the end point (negative=inside the line, positive=cap region)
333
+ float endDist = v_line_pos - v_seg_length;
334
+
335
+ float coverage;
336
+
337
+ if (startDist > 0.0) {
338
+ // Start cap region: circular distance function
339
+ float capDist = length(vec2(d, startDist)) - w;
340
+ coverage = 1.0 - clamp(capDist + 0.5, 0.0, 1.0);
341
+ } else if (endDist > 0.0) {
342
+ // End cap region: circular distance function
343
+ float capDist = length(vec2(d, endDist)) - w;
344
+ coverage = 1.0 - clamp(capDist + 0.5, 0.0, 1.0);
345
+ } else {
346
+ // Ordinary line rendering (HHAA)
347
+ float left = clamp(d - w + 0.5, 0.0, 1.0);
348
+ float right = clamp(d + w + 0.5, 0.0, 1.0);
349
+ coverage = right - left;
350
+ }
351
+
352
+ // Apply the dash pattern
353
+ if (u_dashEnabled > 0.5 && coverage > 0.0) {
354
+ float patternLength = u_dashArray.z;
355
+ float dashLength = u_dashArray.x;
356
+ float posInPattern = mod(v_linesofar, patternLength);
357
+ if (posInPattern > dashLength) {
358
+ coverage = 0.0;
359
+ }
360
+ }
361
+
362
+ // The factor is multiplied into the whole value the same way the existing coverage is
363
+ fragColor = v_color * coverage * u_opacity;
364
+ }`;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * The types of the SDF line renderer
3
+ *
4
+ * The public stroke style and options, the line data handed to the batch paths, and the GPU
5
+ * resources of a retained batch. `sdf-line.ts` re-exports them.
6
+ */
7
+ import type { Color, LineStyle } from '../../../shared/types/style.js';
8
+ export type { Color, LineStyle };
9
+ /** The style of a line drawn by {@link SDFLineRenderer}. */
10
+ export interface SDFStrokeStyle {
11
+ /** The line width in CSS px (at `createdZoom` when the options give one) */
12
+ width: number;
13
+ /** The color as `[r, g, b, a]`, each 0..1 */
14
+ color: Color;
15
+ /** The opacity, 0..1, multiplied into the color */
16
+ opacity: number;
17
+ /** Solid, dashed or dotted */
18
+ lineStyle: LineStyle;
19
+ /**
20
+ * The dash and gap lengths in CSS px, `[dash, gap]`. When omitted, a preset of `lineStyle`
21
+ * is used
22
+ */
23
+ dashArray?: number[];
24
+ }
25
+ /**
26
+ * The unit of a line width: screen pixels (CSS px), or meters on the ground converted at the
27
+ * zoom and the latitude.
28
+ */
29
+ export type WidthUnit = 'pixels' | 'meters';
30
+ /** The options of one {@link SDFLineRenderer.draw} call. */
31
+ export interface SDFStrokeOptions {
32
+ /** The unit of the width. The renderer draws `width` in CSS px */
33
+ widthUnit: WidthUnit;
34
+ /** Whether the path is closed (the last position joins the first) */
35
+ closed: boolean;
36
+ /** The id of the feature drawn, for diagnostics */
37
+ featureId?: string;
38
+ /**
39
+ * The zoom at which `width` applies; the width then scales as `width * 2^(zoom -
40
+ * createdZoom)`. When omitted, the width is fixed on screen
41
+ */
42
+ createdZoom?: number;
43
+ }
@@ -0,0 +1,3 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export {};
@@ -0,0 +1 @@
1
+ export {};