@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,135 @@
1
+ /**
2
+ * Position computation for UI anchors (the single source for rendering and hit testing)
3
+ *
4
+ * When the terrain is enabled, the position of "UI decided by a single point" such as points,
5
+ * vertex handles, midpoint handles, scale handles and rotation handles necessarily disagrees
6
+ * unless the following two things are upheld.
7
+ *
8
+ * 1. An anchor is "longitude/latitude + ground elevation" (longitude/latitude alone drops it
9
+ * to sea level 0)
10
+ * 2. Rendering and hit testing share the result of putting the same elevation through the same
11
+ * projection
12
+ *
13
+ * Previously 2 was not upheld. The vertex shader looked the elevation up in the DEM atlas
14
+ * while hit testing called MapLibre's `map.project`. With two sources, fixing only one of them
15
+ * lets the problem come back. So this module was made the single source, in the following
16
+ * shape.
17
+ *
18
+ * - The hit testing side arrives here through the injection point in `shared/math/transform.ts`
19
+ * - The rendering side has the point renderer receive the elevation computed here as a vertex
20
+ * attribute
21
+ *
22
+ * Both the elevation value and the projection formula become single, so they agree
23
+ * structurally.
24
+ *
25
+ * The source of the elevation is the surface MapLibre draws: `map.queryTerrainElevation`,
26
+ * which samples the terrain tile drawn at the point (`ground.ts`). `map.project` reads the same
27
+ * function, and the value includes the exaggeration. It is a different path from the DEM atlas
28
+ * and the drape (the GPU-side elevation used by polygons and lines), but those read the same
29
+ * DEM textures with the same placement (`upstream-terrain.ts`), so they agree; the end-to-end test
30
+ * `src/e2e/terrain.e2e.test.ts` holds all of them to `map.queryTerrainElevation`. For anchors
31
+ * alone the CPU-side value is authoritative and is handed to the GPU.
32
+ *
33
+ * The projection formula is a copy of the vertex shader's (OFFSET_MODE_GLSL in
34
+ * `shaders/helpers.ts`). It goes through the same branch, including the condition for
35
+ * switching to offset mode (zoom >= 12). The lift (liftMeters) is not added. That exists for
36
+ * rendering reasons, to avoid Z-fighting with the terrain mesh; anchors are drawn without a
37
+ * depth test so they do not need it, and adding it would make them disagree with
38
+ * `map.project`.
39
+ *
40
+ * `map.project` itself is not used for hit testing, although with the same elevation it lands
41
+ * within hundredths of a pixel of this projection. Hit testing must follow what the shader
42
+ * draws, and `map.project` is fast only where a drawn tile covers the point: measured on
43
+ * maplibre 6.11.1 with 10 000 points it takes 2.6 ms (pitch 0) to 4.2 ms (pitch 60) inside
44
+ * the view, but 36 to 46 us a point outside it, where it walks the covering tiles for every
45
+ * call. Hit testing and bounding boxes project vertices outside the view, so that would stall.
46
+ */
47
+ import type { Map as MapLibreMap } from 'maplibre-gl';
48
+ import type { OffsetUniforms } from '../shaders/helpers.js';
49
+ import { type TerrainContext } from './context.js';
50
+ import { type TerrainLike } from './detect.js';
51
+ import { type TerrainElevationQuery } from './ground.js';
52
+ /**
53
+ * Returns a number that changes whenever the elevations {@link anchorElevationMeters} returns
54
+ * may have changed (the DEM coverage changed).
55
+ *
56
+ * Compare it between frames to know when positions baked with elevations must be rebuilt.
57
+ *
58
+ * @param context The terrain state of the draw instance
59
+ * @returns The generation number
60
+ */
61
+ export declare function getAnchorElevationGeneration(context: TerrainContext): number;
62
+ /**
63
+ * Establishes the anchor projection for this frame (custom-layer calls it every frame)
64
+ *
65
+ * When the terrain is disabled, call `clearAnchorFrame` instead.
66
+ */
67
+ export declare function setAnchorFrame(context: TerrainContext, options: {
68
+ terrain: TerrainLike | null;
69
+ /**
70
+ * The map the ground elevation is asked from (`map.queryTerrainElevation`). Without it the
71
+ * elevation of the current zoom level is used
72
+ */
73
+ elevationQuery?: TerrainElevationQuery | null;
74
+ zoom: number;
75
+ elevationScale: number;
76
+ mainMatrix: number[];
77
+ offsetUniforms: OffsetUniforms;
78
+ width: number;
79
+ height: number;
80
+ /** Camera position (Mercator). null when it cannot be obtained */
81
+ cameraMercator?: readonly [number, number, number] | null;
82
+ }): void;
83
+ /**
84
+ * Returns the anchor projection to the inactive state (a frame with no terrain, or when the
85
+ * layer is destroyed)
86
+ *
87
+ * From then on `projectAnchor` returns null and hit testing falls back to MapLibre's project
88
+ * (exactly the same path as before the terrain was introduced).
89
+ */
90
+ export declare function clearAnchorFrame(context: TerrainContext): void;
91
+ /**
92
+ * Returns the ground elevation of a point in meters, as the terrain of the current frame
93
+ * gives it (exaggeration included).
94
+ *
95
+ * Where the terrain is drawn this is the value of `map.queryTerrainElevation`, the elevation
96
+ * of the surface maplibre draws. Outside the drawn tiles it is read from the DEM tile of the
97
+ * current zoom level, which is cheaper and may differ slightly (nothing is drawn there).
98
+ * Values are cached for the frame; when the drawn tiles change,
99
+ * {@link getAnchorElevationGeneration} advances.
100
+ *
101
+ * Inside a plugin, prefer `PluginContext.anchorElevationMeters`, which is bound to the draw
102
+ * instance.
103
+ *
104
+ * @param context The terrain state of the draw instance
105
+ * @param lng The longitude in degrees
106
+ * @param lat The latitude in degrees
107
+ * @returns The elevation in meters. 0 when the terrain is disabled (0 means "add no
108
+ * elevation")
109
+ */
110
+ export declare function anchorElevationMeters(context: TerrainContext, lng: number, lat: number): number;
111
+ /**
112
+ * Injects the anchor projection into the hit testing side (once when the layer is created)
113
+ *
114
+ * It is bound per map. When a page has several rendering instances (the screen + a thumbnail +
115
+ * a preview + printing), keeping only one globally would make hit testing run against
116
+ * the frame of the instance created last.
117
+ *
118
+ * @param map The map to inject into
119
+ * @param context That map's terrain state
120
+ */
121
+ export declare function installAnchorProjector(map: MapLibreMap, context: TerrainContext): void;
122
+ /**
123
+ * Removes the injection (when the layer is destroyed)
124
+ */
125
+ export declare function uninstallAnchorProjector(map: MapLibreMap): void;
126
+ /**
127
+ * Helper that looks at the terrain the map holds and decides whether anchors are usable
128
+ *
129
+ * Keeping an entry point that takes `map` directly makes it easy to assemble the frame state
130
+ * from outside custom-layer (from tests, for example).
131
+ */
132
+ export declare function anchorViewportOf(map: MapLibreMap): {
133
+ width: number;
134
+ height: number;
135
+ };
@@ -0,0 +1,226 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { setAnchorProjector, } from '../../shared/math/index.js';
4
+ import { nearestLongitude } from '../../shared/math/longitude.js';
5
+ import { INACTIVE_ANCHOR_FRAME } from './context.js';
6
+ import { getRenderableTerrainTiles } from './detect.js';
7
+ import { groundElevationMeters } from './ground.js';
8
+ /**
9
+ * The zoom at which offset mode is switched on
10
+ *
11
+ * It must be the same value as the check on the vertex shader side (each renderer raises
12
+ * u_use_offset_mode at `zoom >= 12`).
13
+ */
14
+ const OFFSET_MODE_MIN_ZOOM = 12;
15
+ /**
16
+ * Returns a number that changes whenever the elevations {@link anchorElevationMeters} returns
17
+ * may have changed (the DEM coverage changed).
18
+ *
19
+ * Compare it between frames to know when positions baked with elevations must be rebuilt.
20
+ *
21
+ * @param context The terrain state of the draw instance
22
+ * @returns The generation number
23
+ */
24
+ export function getAnchorElevationGeneration(context) {
25
+ return context.elevationGeneration;
26
+ }
27
+ /**
28
+ * Advances the generation by looking at whether the DEM coverage changed
29
+ *
30
+ * The comparison uses a string listing the identifiers of the tile set. The number of tiles
31
+ * per frame is a few dozen, so building it every frame is negligible.
32
+ */
33
+ function syncCoverage(context, terrain) {
34
+ const changed = terrain
35
+ ? context.coverage.update(getRenderableTerrainTiles(terrain))
36
+ : context.coverage.clear();
37
+ if (changed)
38
+ context.elevationGeneration++;
39
+ }
40
+ /**
41
+ * Establishes the anchor projection for this frame (custom-layer calls it every frame)
42
+ *
43
+ * When the terrain is disabled, call `clearAnchorFrame` instead.
44
+ */
45
+ export function setAnchorFrame(context, options) {
46
+ const { terrain, zoom, elevationScale, mainMatrix, offsetUniforms, width, height } = options;
47
+ context.anchorFrame = {
48
+ terrain,
49
+ elevationQuery: options.elevationQuery ?? null,
50
+ tileZoom: Math.floor(zoom),
51
+ elevationScale,
52
+ mainMatrix,
53
+ offsetUniforms,
54
+ useOffsetMode: zoom >= OFFSET_MODE_MIN_ZOOM,
55
+ width,
56
+ height,
57
+ cameraMercator: options.cameraMercator ?? null,
58
+ };
59
+ context.elevationCache.clear();
60
+ context.occlusionCache.clear();
61
+ syncCoverage(context, terrain);
62
+ }
63
+ /**
64
+ * Returns the anchor projection to the inactive state (a frame with no terrain, or when the
65
+ * layer is destroyed)
66
+ *
67
+ * From then on `projectAnchor` returns null and hit testing falls back to MapLibre's project
68
+ * (exactly the same path as before the terrain was introduced).
69
+ */
70
+ export function clearAnchorFrame(context) {
71
+ context.anchorFrame = INACTIVE_ANCHOR_FRAME;
72
+ if (context.elevationCache.size > 0)
73
+ context.elevationCache = new Map();
74
+ if (context.occlusionCache.size > 0)
75
+ context.occlusionCache = new Map();
76
+ syncCoverage(context, null);
77
+ }
78
+ /**
79
+ * Whether the anchor is active (the terrain is enabled and the frame state is established)
80
+ *
81
+ * @internal
82
+ */
83
+ export function isAnchorActive(context) {
84
+ const frame = context.anchorFrame;
85
+ return frame.terrain !== null && frame.mainMatrix !== null;
86
+ }
87
+ /**
88
+ * Returns the ground elevation of a point in meters, as the terrain of the current frame
89
+ * gives it (exaggeration included).
90
+ *
91
+ * Where the terrain is drawn this is the value of `map.queryTerrainElevation`, the elevation
92
+ * of the surface maplibre draws. Outside the drawn tiles it is read from the DEM tile of the
93
+ * current zoom level, which is cheaper and may differ slightly (nothing is drawn there).
94
+ * Values are cached for the frame; when the drawn tiles change,
95
+ * {@link getAnchorElevationGeneration} advances.
96
+ *
97
+ * Inside a plugin, prefer `PluginContext.anchorElevationMeters`, which is bound to the draw
98
+ * instance.
99
+ *
100
+ * @param context The terrain state of the draw instance
101
+ * @param lng The longitude in degrees
102
+ * @param lat The latitude in degrees
103
+ * @returns The elevation in meters. 0 when the terrain is disabled (0 means "add no
104
+ * elevation")
105
+ */
106
+ export function anchorElevationMeters(context, lng, lat) {
107
+ const frame = context.anchorFrame;
108
+ const terrain = frame.terrain;
109
+ if (!terrain)
110
+ return 0;
111
+ const key = `${lng},${lat}`;
112
+ const cached = context.elevationCache.get(key);
113
+ if (cached !== undefined)
114
+ return cached;
115
+ const elevation = groundElevationMeters(frame.elevationQuery, terrain, context.coverage, drawnLongitude(context, lng), lat, frame.tileZoom);
116
+ context.elevationCache.set(key, elevation);
117
+ return elevation;
118
+ }
119
+ /**
120
+ * The longitude of the copy of the world a point is drawn on: the copy nearest to the camera
121
+ * (across the antimeridian the view draws the other side as a second copy)
122
+ *
123
+ * @internal
124
+ */
125
+ export function drawnLongitude(context, lng) {
126
+ const offsetUniforms = context.anchorFrame.offsetUniforms;
127
+ return offsetUniforms ? nearestLongitude(lng, offsetUniforms.centerLngLat64[0]) : lng;
128
+ }
129
+ /**
130
+ * Maps an anchor (longitude/latitude + ground elevation) to screen coordinates
131
+ *
132
+ * It goes through the same branch, the same matrix and the same elevation as the vertex
133
+ * shader. It returns null when the terrain is disabled or the frame state has not been
134
+ * established (the caller then falls back to MapLibre's project).
135
+ *
136
+ * The context is that of the draw instance whose map the point is projected onto, so several
137
+ * rendering instances on a page (the screen + a thumbnail + a preview + printing) are
138
+ * never mixed up.
139
+ *
140
+ * @internal
141
+ */
142
+ export function projectAnchor(context, lng, lat) {
143
+ const frame = context.anchorFrame;
144
+ const { mainMatrix: m, offsetUniforms, terrain, width, height } = frame;
145
+ if (!m || !terrain || width <= 0 || height <= 0)
146
+ return null;
147
+ const elevationMercator = anchorElevationMeters(context, lng, lat) * frame.elevationScale;
148
+ // The anchor is projected on the copy of the world it is drawn on
149
+ const drawnLng = drawnLongitude(context, lng);
150
+ let clipX;
151
+ let clipY;
152
+ let clipW;
153
+ if (frame.useOffsetMode && offsetUniforms) {
154
+ // Offset mode: linearize relative to the center
155
+ // (the same formula as project_offset_to_clipspace in the shader)
156
+ const { centerLngLat, projectionCenter, unitsPerDegree, unitsPerDegree2 } = offsetUniforms;
157
+ const lngOffset = drawnLng - centerLngLat[0];
158
+ const latOffset = lat - centerLngLat[1];
159
+ const mercX = lngOffset * (unitsPerDegree[0] + unitsPerDegree2[0] * latOffset);
160
+ const mercY = latOffset * (unitsPerDegree[1] + unitsPerDegree2[1] * latOffset);
161
+ // offset.w = 0, so the fourth column of the matrix has no effect. The translation comes
162
+ // from projectionCenter
163
+ clipX = m[0] * mercX + m[4] * mercY + m[8] * elevationMercator + projectionCenter[0];
164
+ clipY = m[1] * mercX + m[5] * mercY + m[9] * elevationMercator + projectionCenter[1];
165
+ clipW = m[3] * mercX + m[7] * mercY + m[11] * elevationMercator + projectionCenter[3];
166
+ }
167
+ else {
168
+ // Low zoom: put the absolute Mercator coordinates through the matrix as they are
169
+ // (the same formula as projectTileWithElevation in the shader)
170
+ const mercX = (drawnLng + 180) / 360;
171
+ const latRad = (lat * Math.PI) / 180;
172
+ const mercY = (1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2;
173
+ clipX = m[0] * mercX + m[4] * mercY + m[8] * elevationMercator + m[12];
174
+ clipY = m[1] * mercX + m[5] * mercY + m[9] * elevationMercator + m[13];
175
+ clipW = m[3] * mercX + m[7] * mercY + m[11] * elevationMercator + m[15];
176
+ }
177
+ // clipW <= 0 means behind the camera. Dividing by it as is produces coordinates folded over
178
+ // to the opposite side of the screen, and hit testing hits "a point that is not visible". It
179
+ // is returned as unusable (the caller either falls back to MapLibre's project or drops it
180
+ // from the candidates).
181
+ if (!Number.isFinite(clipW) || clipW <= 0)
182
+ return null;
183
+ const ndcX = clipX / clipW;
184
+ const ndcY = clipY / clipW;
185
+ return {
186
+ x: (ndcX * 0.5 + 0.5) * width,
187
+ y: (1 - (ndcY * 0.5 + 0.5)) * height,
188
+ };
189
+ }
190
+ /**
191
+ * Injects the anchor projection into the hit testing side (once when the layer is created)
192
+ *
193
+ * It is bound per map. When a page has several rendering instances (the screen + a thumbnail +
194
+ * a preview + printing), keeping only one globally would make hit testing run against
195
+ * the frame of the instance created last.
196
+ *
197
+ * @param map The map to inject into
198
+ * @param context That map's terrain state
199
+ */
200
+ export function installAnchorProjector(map, context) {
201
+ const projector = {
202
+ project: (lng, lat) => projectAnchor(context, lng, lat),
203
+ };
204
+ setAnchorProjector(map, projector);
205
+ }
206
+ /**
207
+ * Removes the injection (when the layer is destroyed)
208
+ */
209
+ export function uninstallAnchorProjector(map) {
210
+ setAnchorProjector(map, null);
211
+ }
212
+ /**
213
+ * Helper that looks at the terrain the map holds and decides whether anchors are usable
214
+ *
215
+ * Keeping an entry point that takes `map` directly makes it easy to assemble the frame state
216
+ * from outside custom-layer (from tests, for example).
217
+ */
218
+ export function anchorViewportOf(map) {
219
+ const canvas = map.getCanvas();
220
+ // Returned in CSS pixels (the same unit as map.project). Where clientWidth becomes 0 (when
221
+ // hidden, or in tests) it falls back to the attribute value
222
+ return {
223
+ width: canvas.clientWidth || canvas.width,
224
+ height: canvas.clientHeight || canvas.height,
225
+ };
226
+ }
@@ -0,0 +1,132 @@
1
+ import type { OffsetUniforms } from '../shaders/helpers.js';
2
+ import type { TerrainLike } from './detect.js';
3
+ import { type TerrainElevationQuery } from './ground.js';
4
+ /**
5
+ * The terrain state of one frame: whether the terrain is drawn and the DEM atlas the shaders
6
+ * read elevations from.
7
+ */
8
+ export interface TerrainRenderState {
9
+ /** Whether the terrain is enabled and the DEM atlas is usable */
10
+ readonly active: boolean;
11
+ /** The DEM atlas (not terrarium, but RGBA8 packing the elevation as 24-bit fixed point) */
12
+ readonly atlasTexture: WebGLTexture | null;
13
+ /** The Mercator rectangle the atlas covers, [x0, y0, 1/width, 1/height] */
14
+ readonly atlasRect: readonly [number, number, number, number];
15
+ /** The number of texels of the atlas, [width, height] */
16
+ readonly atlasSize: readonly [number, number];
17
+ /** The conversion factor from meters to Mercator z (represented by the latitude of the
18
+ * screen center) */
19
+ readonly elevationScale: number;
20
+ /** The lift above the ground (in meters). A rendering implementation value to avoid
21
+ * Z-fighting */
22
+ readonly liftMeters: number;
23
+ /** The subdivision step (in meters). 0 means no subdivision */
24
+ readonly stepMeters: number;
25
+ /**
26
+ * The grid spacing of the subdivision (in Mercator units)
27
+ *
28
+ * The node spacing 1/(2^z * meshSize) of MapLibre's terrain mesh. Placing the subdivision
29
+ * points on this grid makes our own polygons agree with MapLibre's terrain surface at the
30
+ * nodes.
31
+ */
32
+ readonly stepGrid: number;
33
+ /**
34
+ * The generation of the subdivision
35
+ *
36
+ * When the step changes, the subdivision baked on the CPU side (the fill and outline of
37
+ * polygons) becomes stale. Retained batches rebuild on a change of this value. It is counted
38
+ * per instance, so it is never compared with another instance's generation.
39
+ */
40
+ readonly generation: number;
41
+ }
42
+ /** The state when the terrain is disabled */
43
+ export declare const INACTIVE_TERRAIN_STATE: TerrainRenderState;
44
+ /**
45
+ * Which drape path drew the quads of the last frame, for diagnostics.
46
+ *
47
+ * It exists so that hands-on verification can confirm "which of the paths is running on the
48
+ * screen right now". It is not used for rendering.
49
+ */
50
+ export interface TerrainDrapeDebug {
51
+ /** Whether the analytic drape was used */
52
+ used: boolean;
53
+ /** The reason it was not used */
54
+ reason: string;
55
+ /** The number of features put on the drape */
56
+ featureCount: number;
57
+ /** The total number of edges */
58
+ edgeCount: number;
59
+ /** The number of tiles drawn */
60
+ tileCount: number;
61
+ /** The maximum number of runs per cell */
62
+ maxRunsPerCell: number;
63
+ /** The maximum number of edges per cell */
64
+ maxEdgesPerCell: number;
65
+ /** The maximum number of edges involved in a single tile of the view */
66
+ maxTileEdges: number;
67
+ /** The number of cells truncated for exceeding the budget (a local degradation) */
68
+ truncatedCells: number;
69
+ /** The number of tiles that could not be put through the analytic evaluation and were not
70
+ * drawn */
71
+ unfitTiles: number;
72
+ /** The number of runs whose cell origin was inside the feature */
73
+ insideRuns: number;
74
+ /** The number of features that did not go on the drape and were routed to the previous
75
+ * path */
76
+ excluded: number;
77
+ /** The number of features actually handed to the previous path */
78
+ immediate: number;
79
+ }
80
+ /** The initial diagnostic values */
81
+ export declare const INITIAL_DRAPE_DEBUG: TerrainDrapeDebug;
82
+ /**
83
+ * The values needed for this frame's anchor projection
84
+ */
85
+ export interface AnchorFrame {
86
+ terrain: TerrainLike | null;
87
+ /**
88
+ * The map the ground elevation is asked from (`map.queryTerrainElevation`, `ground.ts`).
89
+ * null where there is none (tests); then the elevation of the current zoom level is used
90
+ */
91
+ elevationQuery: TerrainElevationQuery | null;
92
+ /** The same value as MapLibre's transform.tileZoom (the zoom level of the fallback) */
93
+ tileZoom: number;
94
+ /** The factor from meters to Mercator z (represented by the latitude of the screen
95
+ * center) */
96
+ elevationScale: number;
97
+ /** The projection matrix being handed to the vertex shader */
98
+ mainMatrix: number[] | null;
99
+ /** The uniforms of offset mode (the center of the linearization) */
100
+ offsetUniforms: OffsetUniforms | null;
101
+ /** Whether offset mode is used (the same as the shader's u_use_offset_mode) */
102
+ useOffsetMode: boolean;
103
+ /** The viewport (in CSS pixels, the same unit as map.project) */
104
+ width: number;
105
+ height: number;
106
+ /**
107
+ * The camera position (Mercator; z is meters converted into Mercator)
108
+ *
109
+ * Used to decide whether a symbol is occluded by the terrain, along the segment from the
110
+ * camera to the anchor (`occlusion.ts`). It is null in environments where it cannot be
111
+ * obtained, and is then treated as not occluded.
112
+ */
113
+ cameraMercator: readonly [number, number, number] | null;
114
+ }
115
+ /** The frame used when the anchor projection is unavailable */
116
+ export declare const INACTIVE_ANCHOR_FRAME: AnchorFrame;
117
+ /**
118
+ * The terrain state of one draw instance.
119
+ *
120
+ * Treat it as an opaque handle: a custom renderer receives it as
121
+ * `CustomRendererDrawContext.terrain` and passes it to the renderers and to the terrain
122
+ * functions (such as {@link anchorElevationMeters} and {@link drawQuadSurfaceOnTerrain}).
123
+ * Constructing one gives a state with no terrain.
124
+ */
125
+ export declare class TerrainContext {
126
+ /** This frame's terrain state (read by the shaders' projection uniforms) */
127
+ renderState: TerrainRenderState;
128
+ }
129
+ /**
130
+ * Releases an instance's terrain state (when the layer is destroyed)
131
+ */
132
+ export declare function releaseTerrainContext(context: TerrainContext): void;