@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,582 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { globeGridOf } from '../globe-subdivision.js';
4
+ import { quadMercatorCorners } from '../terrain/drape/quad.js';
5
+ import { getQuadDrapeFrame, isTerrainElevationActive, reportTerrainCoarsening, } from '../terrain/state.js';
6
+ import { calculateLngLatOffset, createProgram, getProjectionTransitionUniform, OFFSET_MODE_GLSL, } from './helpers.js';
7
+ import { ProjectionUniformManager } from './projection.js';
8
+ import { buildQuadGrid, computeQuadGridSize, } from './quad-grid.js';
9
+ /**
10
+ * Draws a textured quad on the map, such as a picture pasted onto it, following pitch,
11
+ * globe and terrain.
12
+ *
13
+ * Call `ensureShader` with the shader data of the frame and `setOffsetUniforms` before
14
+ * `draw`. On terrain the quad is painted as ground pixels when possible, otherwise it is
15
+ * subdivided to the terrain mesh.
16
+ */
17
+ export class QuadShader {
18
+ constructor(gl, terrain = null) {
19
+ Object.defineProperty(this, "gl", {
20
+ enumerable: true,
21
+ configurable: true,
22
+ writable: true,
23
+ value: void 0
24
+ });
25
+ Object.defineProperty(this, "program", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: null
30
+ });
31
+ Object.defineProperty(this, "variantName", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: ''
36
+ });
37
+ Object.defineProperty(this, "vao", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: null
42
+ });
43
+ Object.defineProperty(this, "positionBuffer", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: null
48
+ });
49
+ Object.defineProperty(this, "texCoordBuffer", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: null
54
+ });
55
+ // Projection uniform management
56
+ Object.defineProperty(this, "projectionUniformManager", {
57
+ enumerable: true,
58
+ configurable: true,
59
+ writable: true,
60
+ value: void 0
61
+ });
62
+ // Uniform locations (renderer-specific)
63
+ Object.defineProperty(this, "textureLoc", {
64
+ enumerable: true,
65
+ configurable: true,
66
+ writable: true,
67
+ value: null
68
+ });
69
+ Object.defineProperty(this, "opacityLoc", {
70
+ enumerable: true,
71
+ configurable: true,
72
+ writable: true,
73
+ value: null
74
+ });
75
+ // Stores the uniforms for offset mode
76
+ Object.defineProperty(this, "offsetUniforms", {
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true,
80
+ value: null
81
+ });
82
+ // The resources of the subdivision path (terrain present, no analytic drape)
83
+ Object.defineProperty(this, "gridVao", {
84
+ enumerable: true,
85
+ configurable: true,
86
+ writable: true,
87
+ value: null
88
+ });
89
+ Object.defineProperty(this, "gridPositionBuffer", {
90
+ enumerable: true,
91
+ configurable: true,
92
+ writable: true,
93
+ value: null
94
+ });
95
+ Object.defineProperty(this, "gridTexCoordBuffer", {
96
+ enumerable: true,
97
+ configurable: true,
98
+ writable: true,
99
+ value: null
100
+ });
101
+ Object.defineProperty(this, "gridIndexBuffer", {
102
+ enumerable: true,
103
+ configurable: true,
104
+ writable: true,
105
+ value: null
106
+ });
107
+ /** The most recently built grid (not rebuilt if the corners and divisions are the same) */
108
+ Object.defineProperty(this, "grid", {
109
+ enumerable: true,
110
+ configurable: true,
111
+ writable: true,
112
+ value: null
113
+ });
114
+ Object.defineProperty(this, "gridKey", {
115
+ enumerable: true,
116
+ configurable: true,
117
+ writable: true,
118
+ value: ''
119
+ });
120
+ /** The vertex offsets of the grid (a work array re-subtracting the center every frame) */
121
+ Object.defineProperty(this, "gridOffsets", {
122
+ enumerable: true,
123
+ configurable: true,
124
+ writable: true,
125
+ value: new Float32Array(0)
126
+ });
127
+ /** The capacity of the vertex buffer allocated on the GPU (number of elements) */
128
+ Object.defineProperty(this, "gridPositionCapacity", {
129
+ enumerable: true,
130
+ configurable: true,
131
+ writable: true,
132
+ value: 0
133
+ });
134
+ /**
135
+ * The terrain state of the draw instance being drawn (null draws without terrain)
136
+ *
137
+ * The CustomLayer passes its instance's context at construction. An extension renderer that
138
+ * owns a QuadShader calls `setTerrain(context.terrain)` with the draw context it receives.
139
+ */
140
+ Object.defineProperty(this, "terrain", {
141
+ enumerable: true,
142
+ configurable: true,
143
+ writable: true,
144
+ value: void 0
145
+ });
146
+ this.gl = gl;
147
+ this.terrain = terrain;
148
+ this.projectionUniformManager = new ProjectionUniformManager(gl, { terrain });
149
+ this.setupBuffers();
150
+ }
151
+ /**
152
+ * Sets the terrain state the next draws use (null draws without terrain)
153
+ */
154
+ setTerrain(terrain) {
155
+ this.terrain = terrain;
156
+ this.projectionUniformManager.setTerrain(terrain);
157
+ }
158
+ /**
159
+ * Initializes the buffers
160
+ */
161
+ setupBuffers() {
162
+ const gl = this.gl;
163
+ this.vao = gl.createVertexArray();
164
+ gl.bindVertexArray(this.vao);
165
+ // The position buffer (updated dynamically)
166
+ this.positionBuffer = gl.createBuffer();
167
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
168
+ gl.bufferData(gl.ARRAY_BUFFER, 8 * 4, gl.DYNAMIC_DRAW); // 4 vertices x 2 components
169
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
170
+ gl.enableVertexAttribArray(0);
171
+ // The texture coordinate buffer (fixed)
172
+ this.texCoordBuffer = gl.createBuffer();
173
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.texCoordBuffer);
174
+ // prettier-ignore
175
+ const texCoords = new Float32Array([
176
+ 0.0,
177
+ 0.0, // top-left
178
+ 1.0,
179
+ 0.0, // top-right
180
+ 0.0,
181
+ 1.0, // bottom-left
182
+ 1.0,
183
+ 1.0, // bottom-right
184
+ ]);
185
+ gl.bufferData(gl.ARRAY_BUFFER, texCoords, gl.STATIC_DRAW);
186
+ gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
187
+ gl.enableVertexAttribArray(1);
188
+ gl.bindVertexArray(null);
189
+ }
190
+ /**
191
+ * Sets the uniforms for offset mode
192
+ */
193
+ setOffsetUniforms(uniforms) {
194
+ this.offsetUniforms = uniforms;
195
+ }
196
+ /**
197
+ * Ensures the shader (recreating it when necessary)
198
+ */
199
+ ensureShader(shaderData) {
200
+ if (this.variantName === shaderData.variantName)
201
+ return;
202
+ if (this.program) {
203
+ this.gl.deleteProgram(this.program);
204
+ }
205
+ this.program = this.createQuadProgram(shaderData.vertexShaderPrelude, shaderData.define);
206
+ this.variantName = shaderData.variantName;
207
+ // Obtain the projection uniform locations
208
+ this.projectionUniformManager.getLocations(this.program);
209
+ // Obtain the renderer-specific uniform locations
210
+ this.textureLoc = this.gl.getUniformLocation(this.program, 'u_texture');
211
+ this.opacityLoc = this.gl.getUniformLocation(this.program, 'u_opacity');
212
+ }
213
+ /**
214
+ * Creates the shader program for a quad (offset mode)
215
+ */
216
+ createQuadProgram(prelude, define) {
217
+ const projTransitionUniform = getProjectionTransitionUniform(prelude);
218
+ const vertexSource = `#version 300 es
219
+ ${prelude}
220
+ ${define}
221
+ ${projTransitionUniform}${OFFSET_MODE_GLSL}
222
+ in vec2 a_pos; // relative coordinates (already computed at 64-bit precision on the CPU)
223
+ in vec2 a_texCoord;
224
+ out vec2 v_texCoord;
225
+ void main() {
226
+ // High precision version: uses relative coordinates computed at 64-bit precision on the CPU
227
+ gl_Position = project_position_to_clipspace_from_offset(a_pos, u_projection_matrix);
228
+ v_texCoord = a_texCoord;
229
+ }`;
230
+ const fragmentSource = `#version 300 es
231
+ precision highp float;
232
+ uniform sampler2D u_texture;
233
+ uniform float u_opacity;
234
+ in vec2 v_texCoord;
235
+ out vec4 fragColor;
236
+ void main() {
237
+ vec4 color = texture(u_texture, v_texCoord);
238
+ fragColor = vec4(color.rgb, color.a * u_opacity);
239
+ }`;
240
+ return createProgram(this.gl, vertexSource, fragmentSource);
241
+ }
242
+ /**
243
+ * Sets the projection uniforms (supporting offset mode + globe mode)
244
+ * @param projectionData MapLibre's ProjectionData
245
+ * @param zoom The current zoom level (used to switch offset mode)
246
+ */
247
+ setProjectionUniforms(projectionData, zoom) {
248
+ this.projectionUniformManager.setUniforms(projectionData, zoom, this.offsetUniforms);
249
+ }
250
+ /**
251
+ * Draws a quad
252
+ *
253
+ * @param vertices The four vertices of the quad (WGS84 coordinates [lng, lat])
254
+ * @param texture The texture
255
+ * @param opacity The opacity
256
+ * @param projectionData MapLibre's ProjectionData
257
+ * @param zoom The current zoom level
258
+ */
259
+ draw(vertices, texture, opacity, projectionData, zoom) {
260
+ if (!this.program)
261
+ return;
262
+ // On frames where terrain is enabled, first try the analytic drape (painting it as
263
+ // pixels of the ground surface). If it succeeds, the billboard is not drawn.
264
+ const terrain = this.terrain;
265
+ const terrainOn = terrain !== null && isTerrainElevationActive(terrain);
266
+ if (terrain && terrainOn) {
267
+ const frame = getQuadDrapeFrame(terrain);
268
+ if (frame?.renderer.drawQuad(vertices, texture, opacity, frame))
269
+ return;
270
+ }
271
+ const gl = this.gl;
272
+ gl.useProgram(this.program);
273
+ this.setProjectionUniforms(projectionData, zoom);
274
+ // Set the opacity
275
+ if (this.opacityLoc) {
276
+ gl.uniform1f(this.opacityLoc, opacity);
277
+ }
278
+ // Bind the texture
279
+ gl.activeTexture(gl.TEXTURE0);
280
+ gl.bindTexture(gl.TEXTURE_2D, texture);
281
+ if (this.textureLoc) {
282
+ gl.uniform1i(this.textureLoc, 0);
283
+ }
284
+ // Compute the relative coordinates on the CPU side (offset mode: computed at 64-bit
285
+ // precision)
286
+ // The shader's project_position_to_clipspace_from_offset handles it appropriately
287
+ // according to the zoom
288
+ const centerLngLat = this.offsetUniforms?.centerLngLat ?? [0, 0];
289
+ if (terrain && terrainOn && this.drawSubdivided(terrain, vertices, centerLngLat)) {
290
+ gl.bindVertexArray(null);
291
+ gl.bindTexture(gl.TEXTURE_2D, null);
292
+ return;
293
+ }
294
+ // On the globe (without terrain) the four corners would be joined by chords through the
295
+ // sphere. The quad is cut along the Mercator plane with the cell of the fills instead, so
296
+ // its edges and its picture lie on the sphere as they do on the Mercator map
297
+ // (view/globe-subdivision.ts)
298
+ if (terrain &&
299
+ !terrain.renderState.active &&
300
+ this.drawOnGlobe(globeGridOf(terrain, 'fill'), vertices, centerLngLat)) {
301
+ gl.bindVertexArray(null);
302
+ gl.bindTexture(gl.TEXTURE_2D, null);
303
+ return;
304
+ }
305
+ const topLeftOffset = calculateLngLatOffset(vertices.topLeft, centerLngLat);
306
+ const topRightOffset = calculateLngLatOffset(vertices.topRight, centerLngLat);
307
+ const bottomLeftOffset = calculateLngLatOffset(vertices.bottomLeft, centerLngLat);
308
+ const bottomRightOffset = calculateLngLatOffset(vertices.bottomRight, centerLngLat);
309
+ // Update the position data (relative coordinates)
310
+ gl.bindVertexArray(this.vao);
311
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.positionBuffer);
312
+ // prettier-ignore
313
+ const positions = new Float32Array([
314
+ topLeftOffset[0],
315
+ topLeftOffset[1],
316
+ topRightOffset[0],
317
+ topRightOffset[1],
318
+ bottomLeftOffset[0],
319
+ bottomLeftOffset[1],
320
+ bottomRightOffset[0],
321
+ bottomRightOffset[1],
322
+ ]);
323
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, positions);
324
+ // Draw
325
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
326
+ gl.bindVertexArray(null);
327
+ gl.bindTexture(gl.TEXTURE_2D, null);
328
+ }
329
+ /**
330
+ * Draws with a subdivided grid (the degraded path)
331
+ *
332
+ * Splits the four corners to the fineness of the terrain mesh grid and adds
333
+ * the DEM elevation per vertex. Applying the elevation to the vertices is
334
+ * done by the shared GLSL, so the shader is the same one as the billboard.
335
+ *
336
+ * @returns true if it was drawn. When no subdivision is needed (the terrain
337
+ * step is unavailable) it returns false and the caller draws with the
338
+ * conventional four corner vertices
339
+ */
340
+ drawSubdivided(terrain, vertices, centerLngLat) {
341
+ const stepGrid = terrain.renderState.stepGrid;
342
+ if (!(stepGrid > 0))
343
+ return false;
344
+ const quad = quadMercatorCorners(vertices);
345
+ const size = computeQuadGridSize(quad, stepGrid);
346
+ if (size.nx <= 1 && size.ny <= 1)
347
+ return false;
348
+ // The chord dips below the terrain in proportion to how coarsely it was split, so
349
+ // reflect that in the depth bias
350
+ reportTerrainCoarsening(terrain, size.coarsening);
351
+ return this.drawGrid(quad, size, centerLngLat);
352
+ }
353
+ /**
354
+ * Draws with a grid cut along the Mercator plane on the globe
355
+ *
356
+ * @param cell The cell of the fills on the globe (Mercator; 0 on a flat map)
357
+ * @returns true if it was drawn. A flat map, and a quad inside one cell, return false and
358
+ * the caller draws the four corners
359
+ */
360
+ drawOnGlobe(cell, vertices, centerLngLat) {
361
+ if (!(cell > 0))
362
+ return false;
363
+ const quad = quadMercatorCorners(vertices);
364
+ const size = computeQuadGridSize(quad, cell, 1);
365
+ if (size.nx <= 1 && size.ny <= 1)
366
+ return false;
367
+ return this.drawGrid(quad, size, centerLngLat);
368
+ }
369
+ /**
370
+ * Draws the quad as a grid of `size` interpolated on the Mercator plane (shared by the
371
+ * terrain and the globe)
372
+ */
373
+ drawGrid(quad, size, centerLngLat) {
374
+ const gl = this.gl;
375
+ const key = `${Array.from(quad).join(',')}|${size.nx}x${size.ny}`;
376
+ if (!this.grid || this.gridKey !== key) {
377
+ this.grid = buildQuadGrid(quad, size.nx, size.ny);
378
+ this.gridKey = key;
379
+ if (!this.uploadGridStatics(this.grid))
380
+ return false;
381
+ }
382
+ const grid = this.grid;
383
+ if (!this.gridVao || !this.gridPositionBuffer)
384
+ return false;
385
+ // The vertex offsets are re-subtracted every time the center moves (subtracted at 64-bit
386
+ // and then converted to Float32)
387
+ const needed = grid.vertexCount * 2;
388
+ if (this.gridOffsets.length < needed)
389
+ this.gridOffsets = new Float32Array(needed);
390
+ const offsets = this.gridOffsets;
391
+ const centerLng = centerLngLat[0];
392
+ const centerLat = centerLngLat[1];
393
+ for (let i = 0; i < needed; i += 2) {
394
+ offsets[i] = grid.lngLat[i] - centerLng;
395
+ offsets[i + 1] = grid.lngLat[i + 1] - centerLat;
396
+ }
397
+ gl.bindVertexArray(this.gridVao);
398
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.gridPositionBuffer);
399
+ if (this.gridPositionCapacity < needed) {
400
+ gl.bufferData(gl.ARRAY_BUFFER, offsets.subarray(0, needed), gl.DYNAMIC_DRAW);
401
+ this.gridPositionCapacity = needed;
402
+ }
403
+ else {
404
+ gl.bufferSubData(gl.ARRAY_BUFFER, 0, offsets.subarray(0, needed));
405
+ }
406
+ gl.drawElements(gl.TRIANGLES, grid.indices.length, gl.UNSIGNED_SHORT, 0);
407
+ return true;
408
+ }
409
+ /**
410
+ * Uploads the texture coordinates and indices of the grid to the GPU
411
+ */
412
+ uploadGridStatics(grid) {
413
+ const gl = this.gl;
414
+ if (!this.gridVao) {
415
+ this.gridVao = gl.createVertexArray();
416
+ this.gridPositionBuffer = gl.createBuffer();
417
+ this.gridTexCoordBuffer = gl.createBuffer();
418
+ this.gridIndexBuffer = gl.createBuffer();
419
+ if (!this.gridVao ||
420
+ !this.gridPositionBuffer ||
421
+ !this.gridTexCoordBuffer ||
422
+ !this.gridIndexBuffer) {
423
+ return false;
424
+ }
425
+ gl.bindVertexArray(this.gridVao);
426
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.gridPositionBuffer);
427
+ gl.vertexAttribPointer(0, 2, gl.FLOAT, false, 0, 0);
428
+ gl.enableVertexAttribArray(0);
429
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.gridTexCoordBuffer);
430
+ gl.vertexAttribPointer(1, 2, gl.FLOAT, false, 0, 0);
431
+ gl.enableVertexAttribArray(1);
432
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.gridIndexBuffer);
433
+ gl.bindVertexArray(null);
434
+ this.gridPositionCapacity = 0;
435
+ }
436
+ gl.bindVertexArray(this.gridVao);
437
+ gl.bindBuffer(gl.ARRAY_BUFFER, this.gridTexCoordBuffer);
438
+ gl.bufferData(gl.ARRAY_BUFFER, grid.texCoords, gl.STATIC_DRAW);
439
+ gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.gridIndexBuffer);
440
+ gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, grid.indices, gl.STATIC_DRAW);
441
+ gl.bindVertexArray(null);
442
+ return true;
443
+ }
444
+ /**
445
+ * Disposes of the resources
446
+ */
447
+ dispose() {
448
+ const gl = this.gl;
449
+ if (this.program) {
450
+ gl.deleteProgram(this.program);
451
+ this.program = null;
452
+ }
453
+ if (this.vao) {
454
+ gl.deleteVertexArray(this.vao);
455
+ this.vao = null;
456
+ }
457
+ if (this.positionBuffer) {
458
+ gl.deleteBuffer(this.positionBuffer);
459
+ this.positionBuffer = null;
460
+ }
461
+ if (this.texCoordBuffer) {
462
+ gl.deleteBuffer(this.texCoordBuffer);
463
+ this.texCoordBuffer = null;
464
+ }
465
+ if (this.gridVao) {
466
+ gl.deleteVertexArray(this.gridVao);
467
+ this.gridVao = null;
468
+ }
469
+ for (const buffer of [this.gridPositionBuffer, this.gridTexCoordBuffer, this.gridIndexBuffer]) {
470
+ if (buffer)
471
+ gl.deleteBuffer(buffer);
472
+ }
473
+ this.gridPositionBuffer = null;
474
+ this.gridTexCoordBuffer = null;
475
+ this.gridIndexBuffer = null;
476
+ this.grid = null;
477
+ this.gridKey = '';
478
+ this.gridPositionCapacity = 0;
479
+ }
480
+ }
481
+ /**
482
+ * Paints a quad with a fill and text as pixels of the terrain surface.
483
+ *
484
+ * Used by custom renderers that draw text on a filled quad. The fill is decided by a
485
+ * rectangle fill and the text by an SDF atlas lookup, both within the same
486
+ * fragment, so a mismatch of subdivision between the fill and the text cannot
487
+ * occur.
488
+ *
489
+ * Returns false on frames with no terrain and on frames that have terrain but
490
+ * no entry point for the analytic drape (the DEM has not arrived, the shader
491
+ * cannot be built). The caller falls back to the conventional way of drawing
492
+ * (the fill texture + a separate draw of the text).
493
+ *
494
+ * @param terrain The terrain state of the draw instance being drawn
495
+ * (`CustomRendererDrawContext.terrain`)
496
+ * @param corners The corners of the quad in degrees
497
+ * @param surface The fill and the text
498
+ * @param opacity The opacity, 0..1
499
+ * @returns true if it was painted; false when the caller must draw it another way
500
+ */
501
+ export function drawQuadSurfaceOnTerrain(terrain, corners, surface, opacity) {
502
+ if (!isTerrainElevationActive(terrain))
503
+ return false;
504
+ const frame = getQuadDrapeFrame(terrain);
505
+ if (!frame)
506
+ return false;
507
+ return frame.renderer.drawSurface(corners, surface, opacity, frame);
508
+ }
509
+ /** The valid range of the latitude */
510
+ const MAX_LATITUDE = 89.9;
511
+ /**
512
+ * Returns the corners of a rectangle of a size in degrees, rotated about its center.
513
+ *
514
+ * When a large image is placed at a low zoom level, the latitude may exceed
515
+ * +/-90 degrees. In that case it is scaled down automatically so that the
516
+ * whole thing is displayed.
517
+ *
518
+ * @param centerLng The center longitude
519
+ * @param centerLat The center latitude
520
+ * @param widthDeg The width (degrees)
521
+ * @param heightDeg The height (degrees)
522
+ * @param rotationRad The rotation angle (radians, counter-clockwise)
523
+ * @returns The four vertices of the quad (WGS84 coordinates [lng, lat])
524
+ */
525
+ export function computeQuadVertices(centerLng, centerLat, widthDeg, heightDeg, rotationRad) {
526
+ const cos = Math.cos(rotationRad);
527
+ const sin = Math.sin(rotationRad);
528
+ // The scale factor according to the latitude
529
+ // The real distance of 1 degree of longitude = the real distance of 1 degree of latitude
530
+ // x cos(latitude)
531
+ const latCos = Math.cos((centerLat * Math.PI) / 180);
532
+ // Normalize from degrees to a "latitude degree scale" (so that the real distances become
533
+ // equal)
534
+ // Longitude direction: widthDeg degrees x latCos -> equivalent latitude degrees
535
+ // Latitude direction: heightDeg degrees -> as is
536
+ let hwNorm = (widthDeg / 2) * latCos;
537
+ let hhNorm = heightDeg / 2;
538
+ // The local coordinates before rotation (a normalized isotropic coordinate system)
539
+ const baseCorners = [
540
+ { x: -hwNorm, y: hhNorm }, // top-left (north-west)
541
+ { x: hwNorm, y: hhNorm }, // top-right (north-east)
542
+ { x: -hwNorm, y: -hhNorm }, // bottom-left (south-west)
543
+ { x: hwNorm, y: -hhNorm }, // bottom-right (south-east)
544
+ ];
545
+ // Precompute the latitude offset after rotation to decide the scale factor
546
+ let maxLatOffset = 0;
547
+ for (const c of baseCorners) {
548
+ const ry = c.x * sin + c.y * cos;
549
+ maxLatOffset = Math.max(maxLatOffset, Math.abs(ry));
550
+ }
551
+ // Scale down when the latitude exceeds the range
552
+ const maxAllowedOffset = MAX_LATITUDE - Math.abs(centerLat);
553
+ if (maxLatOffset > maxAllowedOffset && maxLatOffset > 0) {
554
+ const scaleFactor = maxAllowedOffset / maxLatOffset;
555
+ hwNorm *= scaleFactor;
556
+ hhNorm *= scaleFactor;
557
+ }
558
+ // The local coordinates after the scale is applied
559
+ const corners = [
560
+ { x: -hwNorm, y: hhNorm }, // top-left (north-west)
561
+ { x: hwNorm, y: hhNorm }, // top-right (north-east)
562
+ { x: -hwNorm, y: -hhNorm }, // bottom-left (south-west)
563
+ { x: hwNorm, y: -hhNorm }, // bottom-right (south-east)
564
+ ];
565
+ // Apply the rotation and convert to longitude and latitude
566
+ const rotated = corners.map((c) => {
567
+ const rx = c.x * cos - c.y * sin;
568
+ const ry = c.x * sin + c.y * cos;
569
+ return {
570
+ // Convert to longitude: latitude degree scale -> longitude degrees (divide by latCos)
571
+ lng: centerLng + rx / latCos,
572
+ lat: centerLat + ry,
573
+ };
574
+ });
575
+ // Return as WGS84 coordinates (the Mercator conversion is done in the shader)
576
+ return {
577
+ topLeft: [rotated[0].lng, rotated[0].lat],
578
+ topRight: [rotated[1].lng, rotated[1].lat],
579
+ bottomLeft: [rotated[2].lng, rotated[2].lat],
580
+ bottomRight: [rotated[3].lng, rotated[3].lat],
581
+ };
582
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * The origin of a retained batch and the precision it leaves
3
+ *
4
+ * A retained batch bakes its vertices as Float32 offsets from an origin, and each frame the
5
+ * shader adds the Float32 uniform `u_origin_shift` (origin minus screen center). Both terms are
6
+ * rounded to 24 bits, so a vertex seen at the screen center is off by about
7
+ * `2^-24 * (|vertex - origin| + |origin - center|)`: roughly twice the distance from the origin
8
+ * to what is on screen, times 2^-24. The error is fixed by the distance, not by the zoom, so it
9
+ * grows on screen with every zoom level, and the part that comes from the shift changes as the
10
+ * camera pans (it shakes).
11
+ *
12
+ * The rule is therefore that the origin stays near what is on screen: a batch is built with the
13
+ * center of its extent as the origin, and when the error for the region on screen would exceed
14
+ * `RETAINED_ORIGIN_TOLERANCE_PX`, the batch is built again with the center of that region as the
15
+ * origin. At the zoom levels where the data spreads over a large part of the screen the error is
16
+ * far below a pixel, so this only happens at high zoom, where the region on screen is small.
17
+ */
18
+ import type { BoundingBox } from '../../store/types.js';
19
+ /** The largest screen error of the baked offsets that is accepted (CSS px) */
20
+ export declare const RETAINED_ORIGIN_TOLERANCE_PX = 0.1;
21
+ /**
22
+ * The center of a bounding box
23
+ */
24
+ export declare function boundsCenter(bounds: BoundingBox): [number, number];
25
+ /**
26
+ * The screen error (CSS px) that the baked offsets of a batch leave in a region
27
+ *
28
+ * It is the bound described in the module comment, measured at the corner of the region
29
+ * farthest from the origin. A latitude difference is longer on screen by 1 / cos φ, so it is
30
+ * weighted with the highest latitude of the region.
31
+ *
32
+ * @param origin The origin of the batch
33
+ * @param region The region on screen (longitude / latitude)
34
+ * @param zoom The zoom of the camera
35
+ */
36
+ export declare function retainedOriginErrorPx(origin: readonly [number, number], region: BoundingBox, zoom: number): number;
37
+ /**
38
+ * The origin a batch should be built with again for the current view (null = keep it)
39
+ *
40
+ * The region on screen is the extent of the batch clipped to the view. When the current origin
41
+ * leaves more than the tolerance there, the center of that region is proposed, provided it at
42
+ * least halves the error (so that a region that is large on screen, where no origin can do
43
+ * better, does not rebuild every frame).
44
+ *
45
+ * @param origin The origin the batch was built with
46
+ * @param extent The extent of the batch (null when unknown: kept)
47
+ * @param view The view (null when unknown: the whole extent is taken as on screen)
48
+ * @param zoom The zoom of the camera
49
+ */
50
+ export declare function rebasedRetainedOrigin(origin: readonly [number, number], extent: BoundingBox | null, view: BoundingBox | null, zoom: number): [number, number] | null;