@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,80 @@
1
+ /**
2
+ * The shared parts of the analytic drape
3
+ *
4
+ * There are two passes that draw the ground (`renderer.ts`, which paints the polygons and
5
+ * lines of features, and `quad.ts`, which pastes textured quads). Both are completely
6
+ * identical up to "drawing a terrain mesh with the same rules as MapLibre, with the same DEM
7
+ * and the same projection"; the only difference is what they solve in the fragment. The common
8
+ * part is placed here, which structurally guarantees that the two passes sit on the same
9
+ * ground.
10
+ */
11
+ import type { ProjectionData } from 'maplibre-gl';
12
+ /**
13
+ * The GLSL that samples the DEM (used in both the vertex and the fragment stage)
14
+ *
15
+ * It does what the #ifdef TERRAIN3D section of MapLibre's vertex prelude does (the prelude
16
+ * handed to a CustomLayer contains only the projection part and not this section). The layout
17
+ * of the DEM texture is maplibre's and is copied once, in `upstream-terrain.ts`. Since the
18
+ * elevation is looked up the same way, with the same DEM and the same grid, our own mesh
19
+ * agrees with MapLibre's terrain surface.
20
+ */
21
+ export declare const TERRAIN_SAMPLE_GLSL: string;
22
+ /**
23
+ * The GLSL of the terrain shading (an aid to reading the map)
24
+ *
25
+ * It builds the gradient from differences between neighboring DEM samples and hands it to the
26
+ * shared formula (`TERRAIN_SHADE_CORE_GLSL` in `terrain/shade.ts`). All this takes charge of
27
+ * is how the samples are taken. The vertex displacement path
28
+ * (`shaders/terrain-shade.ts`) hands samples taken from the atlas to the same formula.
29
+ *
30
+ * The caller must declare `u_light_dir` (east, north and up in the map coordinate system),
31
+ * `u_shade_strength` and `u_tile_meters` (the ground size of that tile). It goes after
32
+ * TERRAIN_SAMPLE_GLSL.
33
+ */
34
+ export declare const TERRAIN_SHADE_GLSL: string;
35
+ /**
36
+ * The width of the samples taken for the shading gradient (in tile coordinates)
37
+ *
38
+ * The authority for the implementation is TERRAIN_SHADE_GLSL, but the formula itself is also
39
+ * placed here as a pure function so that it can be verified. The DEM texels exist only in
40
+ * [0, demLastTexel(dim)] of coord space (the border texels at both ends are copied from the
41
+ * neighboring tiles, `upstream-terrain.ts`), so a width that goes outside that cannot be used.
42
+ *
43
+ * @param coord The coord of the current position (in texel space)
44
+ * @param coordPerUnit The advance of coord per 1 tile coordinate
45
+ * @param want The width one wants to use (in tile coordinates)
46
+ * @param dim The dimension of the DEM
47
+ */
48
+ export declare function drapeShadeWindow(coord: number, coordPerUnit: number, want: number, dim: number): {
49
+ back: number;
50
+ forward: number;
51
+ };
52
+ /** The names of the projection uniforms (declared by the prelude) */
53
+ export declare const DRAPE_PROJECTION_UNIFORMS: readonly ["u_projection_matrix", "u_projection_tile_mercator_coords", "u_projection_clipping_plane", "u_projection_transition", "u_projection_fallback_matrix"];
54
+ /** The names of the DEM uniforms (declared by TERRAIN_SAMPLE_GLSL) */
55
+ export declare const DRAPE_TERRAIN_UNIFORMS: readonly ["u_terrain", "u_terrain_dim", "u_terrain_matrix", "u_terrain_unpack", "u_terrain_exaggeration"];
56
+ /** The index of uniform locations */
57
+ export type UniformSet = Record<string, WebGLUniformLocation | null>;
58
+ /**
59
+ * Writes that tile's ProjectionData into the uniforms
60
+ */
61
+ export declare function applyDrapeProjectionUniforms(gl: WebGL2RenderingContext, set: UniformSet, projectionData: ProjectionData): void;
62
+ /** The parts of a DEM texture set that are needed */
63
+ export interface DrapeTerrainTexture {
64
+ texture: WebGLTexture;
65
+ matrix: ArrayLike<number>;
66
+ unpack: ArrayLike<number>;
67
+ dim: number;
68
+ /** The vertical exaggeration of the terrain (the same factor MapLibre's mesh uses) */
69
+ exaggeration: number;
70
+ }
71
+ /**
72
+ * Binds the DEM and writes it into the uniforms (bound the same way as MapLibre's terrain
73
+ * prelude)
74
+ *
75
+ * The exaggeration is the one MapLibre applies to its own terrain mesh, so the drape surface
76
+ * stays on the map's ground surface (`getTerrainExaggeration` in `detect.ts`).
77
+ */
78
+ export declare function applyDrapeTerrainUniforms(gl: WebGL2RenderingContext, set: UniformSet, terrain: DrapeTerrainTexture, unit: number): void;
79
+ /** ArrayLike into a 4x4 Float32Array */
80
+ export declare function toFloat32Matrix(source: ArrayLike<number>): Float32Array;
@@ -0,0 +1,173 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only AND BSD-3-Clause
3
+ import { TERRAIN_SHADE_CORE_GLSL } from '../shade.js';
4
+ import { demLastTexel, UPSTREAM_DEM_GLSL } from '../upstream-terrain.js';
5
+ import { TILE_EXTENT } from './mesh.js';
6
+ /**
7
+ * The GLSL that samples the DEM (used in both the vertex and the fragment stage)
8
+ *
9
+ * It does what the #ifdef TERRAIN3D section of MapLibre's vertex prelude does (the prelude
10
+ * handed to a CustomLayer contains only the projection part and not this section). The layout
11
+ * of the DEM texture is maplibre's and is copied once, in `upstream-terrain.ts`. Since the
12
+ * elevation is looked up the same way, with the same DEM and the same grid, our own mesh
13
+ * agrees with MapLibre's terrain surface.
14
+ */
15
+ export const TERRAIN_SAMPLE_GLSL = `
16
+ uniform sampler2D u_terrain;
17
+ uniform float u_terrain_dim;
18
+ uniform mat4 u_terrain_matrix;
19
+ uniform vec4 u_terrain_unpack;
20
+ uniform float u_terrain_exaggeration;
21
+ ${UPSTREAM_DEM_GLSL}
22
+ // The texel coordinate of a tile position in this tile's DEM
23
+ vec2 drape_dem_coord(vec2 pos) {
24
+ return upstream_dem_coord((u_terrain_matrix * vec4(pos, 0.0, 1.0)).xy, u_terrain_dim);
25
+ }
26
+
27
+ float drape_get_elevation(vec2 pos) {
28
+ return upstream_dem_bilinear(u_terrain, u_terrain_unpack, drape_dem_coord(pos)) *
29
+ u_terrain_exaggeration;
30
+ }
31
+ `;
32
+ /**
33
+ * The GLSL of the terrain shading (an aid to reading the map)
34
+ *
35
+ * It builds the gradient from differences between neighboring DEM samples and hands it to the
36
+ * shared formula (`TERRAIN_SHADE_CORE_GLSL` in `terrain/shade.ts`). All this takes charge of
37
+ * is how the samples are taken. The vertex displacement path
38
+ * (`shaders/terrain-shade.ts`) hands samples taken from the atlas to the same formula.
39
+ *
40
+ * The caller must declare `u_light_dir` (east, north and up in the map coordinate system),
41
+ * `u_shade_strength` and `u_tile_meters` (the ground size of that tile). It goes after
42
+ * TERRAIN_SAMPLE_GLSL.
43
+ */
44
+ export const TERRAIN_SHADE_GLSL = TERRAIN_SHADE_CORE_GLSL +
45
+ `
46
+ float terrainShade(vec2 tilePos) {
47
+ if (u_shade_strength <= 0.0) return 1.0;
48
+ float texel = ${TILE_EXTENT}.0 / max(u_terrain_dim, 1.0);
49
+ vec2 pos = tilePos * ${TILE_EXTENT}.0;
50
+
51
+ // The samples for the gradient are kept within the range where DEM texels exist.
52
+ //
53
+ // A render tile reads only a part of its DEM tile (deltaZoom = 1), and at the far end of
54
+ // the DEM texture the forward sample may run past the last texel. Reading outside the
55
+ // range makes the clamp in upstream_dem_bilinear return the border value, the sample
56
+ // freezes and the gradient becomes too small. The band where it shrinks fails to receive
57
+ // its shading, floats brightly and shows up as a streak of 1 to 2 pixels along the tile
58
+ // boundary.
59
+ //
60
+ // What is kept in is only the place where the texels really run out. Everywhere else real
61
+ // data continues both forward and backward, so the width stays at its full value.
62
+ vec2 coord = drape_dem_coord(pos);
63
+ // The advance of coord per 1 tile coordinate (the diagonal of the DEM matrix x the DEM
64
+ // dimension)
65
+ vec2 perUnit = max(
66
+ vec2(u_terrain_matrix[0].x, u_terrain_matrix[1].y) * u_terrain_dim,
67
+ vec2(1e-9));
68
+ vec2 forward = clamp(
69
+ (vec2(upstream_dem_last_texel(u_terrain_dim)) - coord) / perUnit, vec2(0.0), vec2(texel));
70
+ vec2 backward = clamp(coord / perUnit, vec2(0.0), vec2(texel));
71
+
72
+ float ex1 = drape_get_elevation(vec2(pos.x + forward.x, pos.y));
73
+ float ex0 = drape_get_elevation(vec2(pos.x - backward.x, pos.y));
74
+ float ey1 = drape_get_elevation(vec2(pos.x, pos.y + forward.y));
75
+ float ey0 = drape_get_elevation(vec2(pos.x, pos.y - backward.y));
76
+ // 1.0 in within-tile coordinates corresponds to u_tile_meters. y points south, so north is
77
+ // flipped. What it is divided by is "the width actually used" (dividing by anything other
78
+ // than the shrunk width makes the gradient too thin)
79
+ vec2 span =
80
+ max(forward + backward, vec2(1e-4)) / ${TILE_EXTENT}.0 * max(u_tile_meters, 1.0);
81
+ float dzdEast = (ex1 - ex0) / span.x;
82
+ float dzdNorth = -(ey1 - ey0) / span.y;
83
+ return terrainShadeFromGradient(dzdEast, dzdNorth);
84
+ }
85
+ `;
86
+ /**
87
+ * The width of the samples taken for the shading gradient (in tile coordinates)
88
+ *
89
+ * The authority for the implementation is TERRAIN_SHADE_GLSL, but the formula itself is also
90
+ * placed here as a pure function so that it can be verified. The DEM texels exist only in
91
+ * [0, demLastTexel(dim)] of coord space (the border texels at both ends are copied from the
92
+ * neighboring tiles, `upstream-terrain.ts`), so a width that goes outside that cannot be used.
93
+ *
94
+ * @param coord The coord of the current position (in texel space)
95
+ * @param coordPerUnit The advance of coord per 1 tile coordinate
96
+ * @param want The width one wants to use (in tile coordinates)
97
+ * @param dim The dimension of the DEM
98
+ */
99
+ export function drapeShadeWindow(coord, coordPerUnit, want, dim) {
100
+ const perUnit = Math.max(coordPerUnit, 1e-9);
101
+ const clampWidth = (value) => Math.min(Math.max(value, 0), want);
102
+ return {
103
+ back: clampWidth(coord / perUnit),
104
+ forward: clampWidth((demLastTexel(dim) - coord) / perUnit),
105
+ };
106
+ }
107
+ /** The names of the projection uniforms (declared by the prelude) */
108
+ export const DRAPE_PROJECTION_UNIFORMS = [
109
+ 'u_projection_matrix',
110
+ 'u_projection_tile_mercator_coords',
111
+ 'u_projection_clipping_plane',
112
+ 'u_projection_transition',
113
+ 'u_projection_fallback_matrix',
114
+ ];
115
+ /** The names of the DEM uniforms (declared by TERRAIN_SAMPLE_GLSL) */
116
+ export const DRAPE_TERRAIN_UNIFORMS = [
117
+ 'u_terrain',
118
+ 'u_terrain_dim',
119
+ 'u_terrain_matrix',
120
+ 'u_terrain_unpack',
121
+ 'u_terrain_exaggeration',
122
+ ];
123
+ /**
124
+ * Writes that tile's ProjectionData into the uniforms
125
+ */
126
+ export function applyDrapeProjectionUniforms(gl, set, projectionData) {
127
+ if (set.u_projection_matrix) {
128
+ gl.uniformMatrix4fv(set.u_projection_matrix, false, projectionData.mainMatrix);
129
+ }
130
+ if (set.u_projection_tile_mercator_coords && projectionData.tileMercatorCoords) {
131
+ gl.uniform4fv(set.u_projection_tile_mercator_coords, projectionData.tileMercatorCoords);
132
+ }
133
+ if (set.u_projection_clipping_plane && projectionData.clippingPlane) {
134
+ gl.uniform4fv(set.u_projection_clipping_plane, projectionData.clippingPlane);
135
+ }
136
+ if (set.u_projection_transition) {
137
+ gl.uniform1f(set.u_projection_transition, projectionData.projectionTransition ?? 0);
138
+ }
139
+ if (set.u_projection_fallback_matrix && projectionData.fallbackMatrix) {
140
+ gl.uniformMatrix4fv(set.u_projection_fallback_matrix, false, projectionData.fallbackMatrix);
141
+ }
142
+ }
143
+ /**
144
+ * Binds the DEM and writes it into the uniforms (bound the same way as MapLibre's terrain
145
+ * prelude)
146
+ *
147
+ * The exaggeration is the one MapLibre applies to its own terrain mesh, so the drape surface
148
+ * stays on the map's ground surface (`getTerrainExaggeration` in `detect.ts`).
149
+ */
150
+ export function applyDrapeTerrainUniforms(gl, set, terrain, unit) {
151
+ gl.activeTexture(gl.TEXTURE0 + unit);
152
+ gl.bindTexture(gl.TEXTURE_2D, terrain.texture);
153
+ if (set.u_terrain)
154
+ gl.uniform1i(set.u_terrain, unit);
155
+ if (set.u_terrain_dim)
156
+ gl.uniform1f(set.u_terrain_dim, terrain.dim);
157
+ if (set.u_terrain_matrix) {
158
+ gl.uniformMatrix4fv(set.u_terrain_matrix, false, toFloat32Matrix(terrain.matrix));
159
+ }
160
+ if (set.u_terrain_unpack) {
161
+ const u = terrain.unpack;
162
+ gl.uniform4f(set.u_terrain_unpack, u[0], u[1], u[2], u[3]);
163
+ }
164
+ if (set.u_terrain_exaggeration)
165
+ gl.uniform1f(set.u_terrain_exaggeration, terrain.exaggeration);
166
+ }
167
+ /** ArrayLike into a 4x4 Float32Array */
168
+ export function toFloat32Matrix(source) {
169
+ const out = new Float32Array(16);
170
+ for (let i = 0; i < 16; i++)
171
+ out[i] = source[i];
172
+ return out;
173
+ }
@@ -0,0 +1,155 @@
1
+ /** Tile identity (the minimum) */
2
+ export interface StitchTile {
3
+ readonly x: number;
4
+ readonly y: number;
5
+ readonly z: number;
6
+ }
7
+ /**
8
+ * The constraint step per edge (tile coordinates)
9
+ *
10
+ * 0 means no constraint (the neighbor is at the same zoom, or finer, or is not
11
+ * drawn). top = the edge at y 0, bottom = the edge at y EXTENT, left = the edge
12
+ * at x 0, right = the edge at x EXTENT.
13
+ */
14
+ export interface TileEdgeSteps {
15
+ readonly top: number;
16
+ readonly bottom: number;
17
+ readonly left: number;
18
+ readonly right: number;
19
+ }
20
+ /** The stitching of a single edge */
21
+ export interface EdgeStitch {
22
+ /** The constraint step (tile coordinates). 0 means no constraint */
23
+ readonly step: number;
24
+ /**
25
+ * The neighboring tile on the coarser side (null when not constraining)
26
+ *
27
+ * x is expressed "in the same wrap as this tile" (a neighbor reached by
28
+ * wrapping the world in the longitude direction becomes a negative value or
29
+ * 2^z or more). This is so that the coordinate transform can be built from
30
+ * this value just as it is.
31
+ */
32
+ readonly tile: StitchTile | null;
33
+ }
34
+ /** The stitching of the four edges of a tile */
35
+ export interface TileEdgeStitch {
36
+ readonly top: EdgeStitch;
37
+ readonly bottom: EdgeStitch;
38
+ readonly left: EdgeStitch;
39
+ readonly right: EdgeStitch;
40
+ }
41
+ /** No constraint */
42
+ export declare const NO_EDGE_STEPS: TileEdgeSteps;
43
+ /** Four edges with no constraint */
44
+ export declare const NO_EDGE_STITCH: TileEdgeStitch;
45
+ /**
46
+ * The key of a tile (folding the wrap in the longitude direction)
47
+ *
48
+ * `computeEdgeStitch` returns the neighbor in the frame before wrapping so that
49
+ * the coordinate transform can be built, so fold it here when looking up the
50
+ * set.
51
+ */
52
+ export declare function wrappedTileKey(tile: StitchTile): string;
53
+ /**
54
+ * Build the set of keys from the set of tiles in view
55
+ *
56
+ * What is passed is "the tiles actually drawn in this frame". Putting in tiles
57
+ * that are not drawn would mean constraining onto the polyline of a counterpart
58
+ * that is not drawn.
59
+ */
60
+ export declare function buildTileKeySet(tiles: readonly StitchTile[]): Set<string>;
61
+ /**
62
+ * Obtain the stitching of the four edges of this tile
63
+ *
64
+ * @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
65
+ */
66
+ export declare function computeEdgeStitch(keys: ReadonlySet<string>, tile: StitchTile, meshSize: number): TileEdgeStitch;
67
+ /** Take only the steps out of the stitching */
68
+ export declare function edgeStepsOf(stitch: TileEdgeStitch): TileEdgeSteps;
69
+ /**
70
+ * Obtain the constraint steps of the four edges of this tile
71
+ *
72
+ * @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
73
+ */
74
+ export declare function computeEdgeSteps(keys: ReadonlySet<string>, tile: StitchTile, meshSize: number): TileEdgeSteps;
75
+ /** The similarity transform mapping one own tile coordinates to the neighbor tile coordinates */
76
+ export interface NeighborTileTransform {
77
+ /** The scale factor (a power of 2; less than 1 because the neighbor is coarser) */
78
+ readonly scale: number;
79
+ readonly offsetX: number;
80
+ readonly offsetY: number;
81
+ }
82
+ /**
83
+ * One own tile coordinates -> the tile coordinates of the neighbor (the coarser
84
+ * side)
85
+ *
86
+ * It is `q = p * scale + offset`. The scale factor is a power of 2 and the
87
+ * translation is an integer multiple of one mesh cell, so the mapping is exact
88
+ * even in float. That is, the nodes of the step land exactly on the mesh nodes
89
+ * of the coarser side, and read the same DEM texels with the same weights as the
90
+ * coarser side reads at its own vertices. This is the ground for "the edge
91
+ * vertices of the finer side lying exactly on the line segments of the coarser
92
+ * side".
93
+ */
94
+ export declare function neighborTileTransform(fine: StitchTile, coarse: StitchTile, extent?: number): NeighborTileTransform;
95
+ /**
96
+ * The constraint for a single edge (holding the step, the coordinate transform
97
+ * and the DEM of the constraint target as one set)
98
+ *
99
+ * The point is that the three are gathered into a single value. It is a shape
100
+ * that makes a state where only the step is new and the DEM is old (or the
101
+ * other way around) impossible to create, so that applying the constraint and
102
+ * holding the constraint target become one and the same fact.
103
+ */
104
+ export interface ResolvedEdge<T> {
105
+ /** The constraint step (tile coordinates). It never becomes 0 */
106
+ readonly step: number;
107
+ /** The tile on the coarser side (x in the frame before wrapping) */
108
+ readonly tile: StitchTile;
109
+ /** One own tile coordinates -> the tile coordinates of the coarser side */
110
+ readonly transform: NeighborTileTransform;
111
+ /** The DEM of the coarser side (looked up at the same point in time as the step) */
112
+ readonly terrain: T;
113
+ }
114
+ /** The constraints of the four edges of a tile (an edge that is not constrained is null) */
115
+ export interface ResolvedTileEdges<T> {
116
+ readonly top: ResolvedEdge<T> | null;
117
+ readonly bottom: ResolvedEdge<T> | null;
118
+ readonly left: ResolvedEdge<T> | null;
119
+ readonly right: ResolvedEdge<T> | null;
120
+ }
121
+ /** No edge is constrained */
122
+ export declare const NO_RESOLVED_EDGES: ResolvedTileEdges<never>;
123
+ /**
124
+ * Derive the constraints of the four edges of this tile wholly from the current
125
+ * tile state
126
+ *
127
+ * The level difference (Δz), the coordinate transform, the step and the DEM of
128
+ * the constraint target are all brought together in a single call. The step is
129
+ * not baked into the vertex data (the mesh is a single one independent of the
130
+ * tile, and the step can only be passed as a uniform), so merely passing through
131
+ * here again every frame structurally prevents the mismatch "the DEM is new but
132
+ * the level difference is old".
133
+ *
134
+ * An edge for which `resolve` returns null is not constrained. Leaving only the
135
+ * step when the DEM of the constraint target cannot be held would mean
136
+ * constraining onto a polyline that steps one own DEM coarsely, and the crack
137
+ * that was supposed to be fixed would come back just there.
138
+ *
139
+ * @param keys The set of keys of the tiles actually drawn in this frame
140
+ * @param resolve Look up the DEM from the tile on the coarser side (null if it
141
+ * cannot be looked up)
142
+ */
143
+ export declare function resolveTileEdges<T>(keys: ReadonlySet<string>, tile: StitchTile, meshSize: number, resolve: (neighbor: StitchTile) => T | null): ResolvedTileEdges<T>;
144
+ /**
145
+ * The elevation after constraining (the same expression as drape_constrain in
146
+ * the vertex shader)
147
+ *
148
+ * The shader is the authority for the implementation, but the expression itself
149
+ * is placed here as a pure function so that it can be verified. `sample` returns
150
+ * the elevation of a node of the polyline on the coarser side.
151
+ *
152
+ * @param along The position along the edge (in this tile coordinates)
153
+ * @param step The node spacing of the coarser side (in this tile coordinates)
154
+ */
155
+ export declare function constrainEdgeElevation(along: number, step: number, sample: (at: number) => number, extent?: number): number;
@@ -0,0 +1,228 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * Stitching tile boundaries (resolving T-junctions)
5
+ *
6
+ * MapLibre chooses the zoom of terrain tiles by distance, so tiles of different
7
+ * zooms coexist within a single screen (in a pitched view z6 and z9 sit side by
8
+ * side). The difference is not necessarily a single level.
9
+ *
10
+ * When tiles of different zooms are adjacent, nodes that the coarser side does
11
+ * not have are lined up along the boundary of the finer side. The finer side
12
+ * takes the elevation of its own DEM at those nodes, but the coarser side joins
13
+ * node to node with a straight line, so the two surfaces separate in between (a
14
+ * T-junction). The basemap below shows through the gap that opens, and it looks
15
+ * like a dotted gap running along the tile boundary.
16
+ *
17
+ * The way to fix it is to "constrain the elevation of the finer side boundary
18
+ * onto the polyline of the coarser side". The boundary itself is a straight line
19
+ * in tile coordinates, so only the elevation has to be moved. Taking the node
20
+ * spacing of the coarser side (`delta * 2^Δz` in this tile coordinates) as the
21
+ * step, and using the value obtained by linearly interpolating the elevations at
22
+ * both ends of that step, the gap becomes structurally zero whatever the level
23
+ * difference Δz is.
24
+ *
25
+ * However, "the polyline of the coarser side" is decided by the DEM of the
26
+ * coarser side. MapLibre reads the DEM one level coarser than the render tile
27
+ * (`deltaZoom = 1`), so adjacent tiles of different zooms always read DEMs of
28
+ * different resolutions. Taking the node elevations from one own DEM yields not
29
+ * the polyline of the coarser side but "a polyline that steps one own DEM
30
+ * coarsely", and the two stay apart by the difference in DEM resolution. This is
31
+ * the true identity of the thin line that remains at tile boundaries.
32
+ *
33
+ * Therefore the constraint uses the DEM of the coarser side itself. Here, for
34
+ * each edge, we obtain the "step" and the "tile on the coarser side", and
35
+ * further produce the transform that maps one own tile coordinates to the tile
36
+ * coordinates of the coarser side. The actual constraining is done by the vertex
37
+ * shader (drape_constrain in renderer.ts).
38
+ */
39
+ import { TILE_EXTENT } from './mesh.js';
40
+ /** No constraint */
41
+ export const NO_EDGE_STEPS = { top: 0, bottom: 0, left: 0, right: 0 };
42
+ /** Four edges with no constraint */
43
+ export const NO_EDGE_STITCH = {
44
+ top: { step: 0, tile: null },
45
+ bottom: { step: 0, tile: null },
46
+ left: { step: 0, tile: null },
47
+ right: { step: 0, tile: null },
48
+ };
49
+ /**
50
+ * The key of a tile (folding the wrap in the longitude direction)
51
+ *
52
+ * `computeEdgeStitch` returns the neighbor in the frame before wrapping so that
53
+ * the coordinate transform can be built, so fold it here when looking up the
54
+ * set.
55
+ */
56
+ export function wrappedTileKey(tile) {
57
+ const span = 2 ** tile.z;
58
+ return `${tile.z}/${((tile.x % span) + span) % span}/${tile.y}`;
59
+ }
60
+ /**
61
+ * Build the set of keys from the set of tiles in view
62
+ *
63
+ * What is passed is "the tiles actually drawn in this frame". Putting in tiles
64
+ * that are not drawn would mean constraining onto the polyline of a counterpart
65
+ * that is not drawn.
66
+ */
67
+ export function buildTileKeySet(tiles) {
68
+ const set = new Set();
69
+ for (const tile of tiles)
70
+ set.add(wrappedTileKey(tile));
71
+ return set;
72
+ }
73
+ /** Floor division that holds even for negative values (x goes negative with the wrap) */
74
+ function floorShift(value, shift) {
75
+ return Math.floor(value / 2 ** shift);
76
+ }
77
+ /**
78
+ * Look up the neighboring tile
79
+ *
80
+ * Walking up the ancestors in order starting from the same zoom, the first one
81
+ * found is the neighbor (drawn tiles do not overlap, so at most one is found).
82
+ *
83
+ * The lookup uses the key wrapped in the longitude direction, but the x that is
84
+ * returned is expressed in the frame before wrapping. Doing so lets the caller
85
+ * build the transform "one own tile coordinates -> the neighbor tile
86
+ * coordinates" out of a difference and a ratio alone (`neighborTileTransform`).
87
+ *
88
+ * @returns The neighboring tile. null if it is not found
89
+ */
90
+ function neighborTile(keys, z, x, y) {
91
+ const span = 2 ** z;
92
+ if (y < 0 || y >= span)
93
+ return null;
94
+ // The longitude direction wraps around the world
95
+ const wrapped = ((x % span) + span) % span;
96
+ for (let nz = z; nz >= 0; nz--) {
97
+ const shift = z - nz;
98
+ if (keys.has(`${nz}/${wrapped >> shift}/${y >> shift}`)) {
99
+ return { z: nz, x: floorShift(x, shift), y: y >> shift };
100
+ }
101
+ }
102
+ return null;
103
+ }
104
+ /**
105
+ * Obtain the stitching of the four edges of this tile
106
+ *
107
+ * @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
108
+ */
109
+ export function computeEdgeStitch(keys, tile, meshSize) {
110
+ const delta = TILE_EXTENT / meshSize;
111
+ const edgeFor = (nx, ny) => {
112
+ const neighbor = neighborTile(keys, tile.z, nx, ny);
113
+ if (!neighbor || neighbor.z >= tile.z)
114
+ return { step: 0, tile: null };
115
+ return { step: delta * 2 ** (tile.z - neighbor.z), tile: neighbor };
116
+ };
117
+ return {
118
+ top: edgeFor(tile.x, tile.y - 1),
119
+ bottom: edgeFor(tile.x, tile.y + 1),
120
+ left: edgeFor(tile.x - 1, tile.y),
121
+ right: edgeFor(tile.x + 1, tile.y),
122
+ };
123
+ }
124
+ /** Take only the steps out of the stitching */
125
+ export function edgeStepsOf(stitch) {
126
+ return {
127
+ top: stitch.top.step,
128
+ bottom: stitch.bottom.step,
129
+ left: stitch.left.step,
130
+ right: stitch.right.step,
131
+ };
132
+ }
133
+ /**
134
+ * Obtain the constraint steps of the four edges of this tile
135
+ *
136
+ * @param meshSize The subdivision count of the terrain mesh (MapLibre default is 128)
137
+ */
138
+ export function computeEdgeSteps(keys, tile, meshSize) {
139
+ return edgeStepsOf(computeEdgeStitch(keys, tile, meshSize));
140
+ }
141
+ /**
142
+ * One own tile coordinates -> the tile coordinates of the neighbor (the coarser
143
+ * side)
144
+ *
145
+ * It is `q = p * scale + offset`. The scale factor is a power of 2 and the
146
+ * translation is an integer multiple of one mesh cell, so the mapping is exact
147
+ * even in float. That is, the nodes of the step land exactly on the mesh nodes
148
+ * of the coarser side, and read the same DEM texels with the same weights as the
149
+ * coarser side reads at its own vertices. This is the ground for "the edge
150
+ * vertices of the finer side lying exactly on the line segments of the coarser
151
+ * side".
152
+ */
153
+ export function neighborTileTransform(fine, coarse, extent = TILE_EXTENT) {
154
+ const scale = 2 ** (coarse.z - fine.z);
155
+ return {
156
+ scale,
157
+ offsetX: (fine.x * scale - coarse.x) * extent,
158
+ offsetY: (fine.y * scale - coarse.y) * extent,
159
+ };
160
+ }
161
+ /** No edge is constrained */
162
+ export const NO_RESOLVED_EDGES = {
163
+ top: null,
164
+ bottom: null,
165
+ left: null,
166
+ right: null,
167
+ };
168
+ /**
169
+ * Derive the constraints of the four edges of this tile wholly from the current
170
+ * tile state
171
+ *
172
+ * The level difference (Δz), the coordinate transform, the step and the DEM of
173
+ * the constraint target are all brought together in a single call. The step is
174
+ * not baked into the vertex data (the mesh is a single one independent of the
175
+ * tile, and the step can only be passed as a uniform), so merely passing through
176
+ * here again every frame structurally prevents the mismatch "the DEM is new but
177
+ * the level difference is old".
178
+ *
179
+ * An edge for which `resolve` returns null is not constrained. Leaving only the
180
+ * step when the DEM of the constraint target cannot be held would mean
181
+ * constraining onto a polyline that steps one own DEM coarsely, and the crack
182
+ * that was supposed to be fixed would come back just there.
183
+ *
184
+ * @param keys The set of keys of the tiles actually drawn in this frame
185
+ * @param resolve Look up the DEM from the tile on the coarser side (null if it
186
+ * cannot be looked up)
187
+ */
188
+ export function resolveTileEdges(keys, tile, meshSize, resolve) {
189
+ const stitch = computeEdgeStitch(keys, tile, meshSize);
190
+ const resolveEdge = (edge) => {
191
+ if (!edge.tile || edge.step <= 0)
192
+ return null;
193
+ const terrain = resolve(edge.tile);
194
+ if (terrain === null)
195
+ return null;
196
+ return {
197
+ step: edge.step,
198
+ tile: edge.tile,
199
+ transform: neighborTileTransform(tile, edge.tile),
200
+ terrain,
201
+ };
202
+ };
203
+ return {
204
+ top: resolveEdge(stitch.top),
205
+ bottom: resolveEdge(stitch.bottom),
206
+ left: resolveEdge(stitch.left),
207
+ right: resolveEdge(stitch.right),
208
+ };
209
+ }
210
+ /**
211
+ * The elevation after constraining (the same expression as drape_constrain in
212
+ * the vertex shader)
213
+ *
214
+ * The shader is the authority for the implementation, but the expression itself
215
+ * is placed here as a pure function so that it can be verified. `sample` returns
216
+ * the elevation of a node of the polyline on the coarser side.
217
+ *
218
+ * @param along The position along the edge (in this tile coordinates)
219
+ * @param step The node spacing of the coarser side (in this tile coordinates)
220
+ */
221
+ export function constrainEdgeElevation(along, step, sample, extent = TILE_EXTENT) {
222
+ const t0 = Math.floor(along / step) * step;
223
+ const t1 = Math.min(t0 + step, extent);
224
+ const e0 = sample(t0);
225
+ const e1 = sample(t1);
226
+ const w = t1 > t0 ? (along - t0) / (t1 - t0) : 0;
227
+ return e0 + (e1 - e0) * w;
228
+ }