@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,132 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { TERRAIN_DEPTH_BIAS } from '../terrain/metrics.js';
4
+ import { getTerrainCoarsening, setQuadDrapeFrame, setTerrainShadeLight, TERRAIN_ATLAS_TEXTURE_UNIT, } from '../terrain/state.js';
5
+ import { setDepthTestEnabled, syncDepthTestEnabled } from './depth-state.js';
6
+ /** Establishes the GL state this frame assumes, at the start of the drawing of a slot */
7
+ export function applySegmentGlState(gl, terrainContext, f) {
8
+ // Sync the record of the depth test with the actual state of this frame (the foundation that
9
+ // keeps the symbol rendering from asking gl.isEnabled every time; depth-state.ts)
10
+ syncDepthTestEnabled(gl);
11
+ // Deliver the same light as the analytic drape to the polygon fills of the vertex
12
+ // displacement path, so that the look of a fill does not jump when the paths swap
13
+ // (terrain/shade.ts). Without terrain it is null and there is no shading
14
+ setTerrainShadeLight(terrainContext, f.terrainState.active ? f.drapeLight : null);
15
+ if (f.terrainState.active && f.terrainState.atlasTexture) {
16
+ // The DEM atlas is left bound to a dedicated texture unit (every renderer uses unit 0 for
17
+ // its coordinate texture)
18
+ gl.activeTexture(gl.TEXTURE0 + TERRAIN_ATLAS_TEXTURE_UNIT);
19
+ gl.bindTexture(gl.TEXTURE_2D, f.terrainState.atlasTexture);
20
+ gl.activeTexture(gl.TEXTURE0);
21
+ }
22
+ f.restoreBlendState();
23
+ applySegmentDepthState(gl, terrainContext, f);
24
+ if (f.quadDrapeFrame) {
25
+ // The layer rendering keeps the depth test after a quad, whether or not the drape was used
26
+ f.quadDrapeFrame.keepDepthTest = true;
27
+ setQuadDrapeFrame(terrainContext, f.quadDrapeFrame);
28
+ }
29
+ }
30
+ /**
31
+ * Establishes the depth state of the layer rendering of a slot
32
+ *
33
+ * `applySegmentGlState` sets it at the start of a slot, and the drape of the segment, which
34
+ * changes the depth function and the offset, hands it back with this before the layers are
35
+ * drawn. The layers are therefore drawn in one depth state whether or not the drape was used.
36
+ * What the drape cannot paint (dashed lines, polygons with a dashed outline, the geometry being
37
+ * drawn, the features of extensions, the datasets not handed over to it) is
38
+ * drawn after it by the vertex displacement path and must be hidden by the terrain in the same
39
+ * way. Symbols switch the depth test off themselves (`drawBillboardsWithoutDepth`).
40
+ */
41
+ export function applySegmentDepthState(gl, terrainContext, f) {
42
+ // Depth (used only when there is terrain)
43
+ //
44
+ // MapLibre hands control to a '3d' CustomLayer with the depth test enabled, LEQUAL, and
45
+ // writing allowed. The depth of the terrain mesh is written into the framebuffer of the
46
+ // screen, so enabling the test correctly hides the features behind a mountain. Writing,
47
+ // however, is turned off: the stacking order of core (the layer order, the selection UI in
48
+ // front) was built on a draw order without depth, and letting our own drawings order each
49
+ // other by depth would break it. gl.depthRange is not rewritten (MapLibre sets a narrowed
50
+ // range shared with the terrain mesh). The depth function is set to the LEQUAL MapLibre
51
+ // hands over, so that it is the same after the drape.
52
+ if (f.terrainState.active && !f.wideFallback) {
53
+ setDepthTestEnabled(gl, true);
54
+ gl.depthMask(false);
55
+ gl.depthFunc(gl.LEQUAL);
56
+ // The depth bias is applied in proportion to the slope. The disagreement between the
57
+ // terrain mesh and our own polygons is largest on a slope, so a constant lift cannot cover
58
+ // it. The factor of polygonOffset is proportional to "the screen-space gradient of the
59
+ // depth", which fits the shape of this problem.
60
+ //
61
+ // The amount is made proportional to "the coarseness of the step". A coarsely subdivided
62
+ // polygon becomes a chord between the nodes, and on a hilltop the chord sinks below the
63
+ // terrain. Measured, the sinking was at most 1.2 m for a step of 7.8 m, 3.7 m for 15.6 m
64
+ // and 5.2 m for 31 m (the hills of northern Kawasaki). The coarser the step, the deeper it
65
+ // sinks, so the bias grows by the same amount.
66
+ const bias = TERRAIN_DEPTH_BIAS * getTerrainCoarsening(terrainContext);
67
+ gl.enable(gl.POLYGON_OFFSET_FILL);
68
+ gl.polygonOffset(-bias, -bias);
69
+ }
70
+ else {
71
+ setDepthTestEnabled(gl, false);
72
+ }
73
+ }
74
+ /** Restores the GL state to the defaults of maplibre at the end of the drawing of a slot */
75
+ export function restoreSegmentGlState(gl, f) {
76
+ if (f.terrainState.active && !f.wideFallback) {
77
+ gl.depthMask(true);
78
+ gl.disable(gl.POLYGON_OFFSET_FILL);
79
+ gl.polygonOffset(0, 0);
80
+ }
81
+ // The depth function goes back to the default of maplibre (the slot drew with LEQUAL)
82
+ gl.depthFunc(gl.LESS);
83
+ setDepthTestEnabled(gl, true);
84
+ }
85
+ /**
86
+ * Establishes the GL state of the analytic drape
87
+ *
88
+ * Composite with premultiplied alpha (the coverage is evaluated once per pixel, so an overlap
89
+ * is never painted twice).
90
+ *
91
+ * What the drape draws is the ground itself. It coincides with the terrain surface of maplibre
92
+ * at the same height, so on pixels of equal depth the winner wavers and the edges get eaten away
93
+ * (pronounced on a shallow slope; confirmed in the field). The depth function is set to LEQUAL so
94
+ * that equality wins, and the slope-proportional bias (which exists to fill the sinking of the
95
+ * chords of the CPU subdivision) is not applied: the surfaces of the drape are not chords, so it
96
+ * is not needed. The occlusion is carried by the depth test itself, so it must not be turned off.
97
+ *
98
+ * The depth bias (polygonOffset) is not used. The factor is proportional to the screen-space
99
+ * gradient of the depth, so it acts too strongly on a shallow slope, and its unit depends on the
100
+ * resolution of the depth buffer. The drape lifts its vertices ever so slightly to win instead
101
+ * (DRAPE_LIFT_RATIO in drape/renderer.ts).
102
+ */
103
+ export function applyDrapeGlState(gl) {
104
+ applyDrapeBlendState(gl);
105
+ setDepthTestEnabled(gl, true);
106
+ gl.depthFunc(gl.LEQUAL);
107
+ gl.disable(gl.POLYGON_OFFSET_FILL);
108
+ }
109
+ /**
110
+ * Goes back to the drape after an image was interleaved (the blending and the depth test; the
111
+ * depth function and the offset were left as the drape set them)
112
+ */
113
+ export function resumeDrapeGlState(gl) {
114
+ applyDrapeBlendState(gl);
115
+ setDepthTestEnabled(gl, true);
116
+ }
117
+ /**
118
+ * Establishes the GL state of the symbols and the UI (no depth test)
119
+ *
120
+ * From here on it is not "something painted onto the ground" but the symbols and the UI.
121
+ * Points, handles and selection boxes are billboards, so with the depth in effect they disappear
122
+ * entirely as soon as they sink a little into the ground. Measured, enabling the terrain made
123
+ * every point invisible. Symbols are always drawn in front.
124
+ */
125
+ export function enterSymbolGlState(gl) {
126
+ setDepthTestEnabled(gl, false);
127
+ }
128
+ /** Premultiplied alpha compositing of the drape */
129
+ function applyDrapeBlendState(gl) {
130
+ gl.enable(gl.BLEND);
131
+ gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
132
+ }
@@ -0,0 +1,6 @@
1
+ export type { BlendCapableGL } from './blend.js';
2
+ export { applyDrawBlendState } from './blend.js';
3
+ export type { CustomLayerDeps, CustomLayerInterface } from './custom-layer.js';
4
+ export { createCustomLayer } from './custom-layer.js';
5
+ export type { RenderSegment, RenderSlot } from './slots.js';
6
+ export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, renderSlotLayerId } from './slots.js';
@@ -0,0 +1,5 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ export { applyDrawBlendState } from './blend.js';
4
+ export { createCustomLayer } from './custom-layer.js';
5
+ export { PRIMARY_RENDER_LAYER_ID, partitionLayerOrder, renderSlotLayerId } from './slots.js';
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The render scope of one draw instance
3
+ *
4
+ * Everything the rendering of one CustomLayer keeps between frames and that must never be seen
5
+ * by another draw instance: the selection scope shared with the modes, the terrain state, and
6
+ * the caches of triangulation and style evaluation keyed by feature id. Two instances on the
7
+ * same page (a print preview next to the editor, a duplicated document with the same ids)
8
+ * therefore never read each other's triangles, styles or terrain.
9
+ *
10
+ * The CustomLayer creates it (the selection scope is handed in, because the modes use the same
11
+ * one) and passes the parts each renderer needs at construction.
12
+ */
13
+ import { EarcutCache } from '../cache/earcut.js';
14
+ import { StyleRuleCache } from '../cache/style-rule.js';
15
+ import { TerrainContext } from '../terrain/context.js';
16
+ import type { SelectionScope } from '../ui/selection-scope.js';
17
+ export interface RenderScope {
18
+ /** The selection scope of the draw instance (shared with the modes) */
19
+ readonly selection: SelectionScope;
20
+ /** The terrain state of the draw instance */
21
+ readonly terrain: TerrainContext;
22
+ /** Triangulation results keyed by feature id */
23
+ readonly earcut: EarcutCache;
24
+ /** Evaluated style rules keyed by feature id */
25
+ readonly styleRules: StyleRuleCache;
26
+ }
27
+ /**
28
+ * Creates the render scope of one draw instance
29
+ */
30
+ export declare function createRenderScope(selection: SelectionScope): RenderScope;
@@ -0,0 +1,28 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * The render scope of one draw instance
5
+ *
6
+ * Everything the rendering of one CustomLayer keeps between frames and that must never be seen
7
+ * by another draw instance: the selection scope shared with the modes, the terrain state, and
8
+ * the caches of triangulation and style evaluation keyed by feature id. Two instances on the
9
+ * same page (a print preview next to the editor, a duplicated document with the same ids)
10
+ * therefore never read each other's triangles, styles or terrain.
11
+ *
12
+ * The CustomLayer creates it (the selection scope is handed in, because the modes use the same
13
+ * one) and passes the parts each renderer needs at construction.
14
+ */
15
+ import { EarcutCache } from '../cache/earcut.js';
16
+ import { StyleRuleCache } from '../cache/style-rule.js';
17
+ import { TerrainContext } from '../terrain/context.js';
18
+ /**
19
+ * Creates the render scope of one draw instance
20
+ */
21
+ export function createRenderScope(selection) {
22
+ return {
23
+ selection,
24
+ terrain: new TerrainContext(),
25
+ earcut: new EarcutCache(),
26
+ styleRules: new StyleRuleCache(),
27
+ };
28
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Per-layer rendering
3
+ *
4
+ * The per-layer rendering loop called from CustomLayer's render()
5
+ */
6
+ import type { ProjectionData } from 'maplibre-gl';
7
+ import type { DatasetManager } from '../../display/manager.js';
8
+ import type { CustomFeatureHandler, CustomRendererDrawContext, LayerAwareOverlayRenderer } from '../../extension/index.js';
9
+ import type { Store } from '../../store/store.js';
10
+ import type { BoundingBox, Feature, Layer } from '../../store/types.js';
11
+ import type { FeatureCompanionRegistry } from '../feature-companion.js';
12
+ import type { Renderers } from './renderers.js';
13
+ import type { StoreRetainedCache } from './store-retained.js';
14
+ /**
15
+ * Draw features and overlays layer by layer
16
+ *
17
+ * The loop walks the stacking order of the Store (`store.getLayerOrder()`). Its entries are a
18
+ * mix of layer ids and dataset ids, and for each entry it does the following.
19
+ *
20
+ * - A layer exists: draw it in retained / immediate mode as before
21
+ * - A dataset whose order is 'layer-order' exists: draw that dataset
22
+ * - Neither of them (an unknown id): skip it (not an error)
23
+ *
24
+ * In addition, datasets (display) have two insertion points outside the layer
25
+ * loop. below-store is drawn before every layer (behind them) and above-store after every layer
26
+ * (in front of them). Batching uses the same BatchManager as the Store. The per-layer frames
27
+ * (beginFrame / endFrame) are closed inside the loop, so their state never mixes with a frame
28
+ * opened outside it. The batch of a dataset is also closed at a layer boundary, so inserting
29
+ * one in the middle of the order never nests GL state.
30
+ *
31
+ * There are two paths for the features of the Store.
32
+ *
33
+ * - Retained mode (storeRetained is present and the renderers support it): draws the retained
34
+ * batches prepared per layer. The features argument is not used. Thinning of a retained batch
35
+ * is done per chunk, so the bbox of the expanded viewport is computed once per frame and passed
36
+ * in. Immediate chunks, which draw one feature at a time, are thinned per feature as well, so
37
+ * the set of visible ids is passed too (only once it becomes necessary).
38
+ * - Immediate mode (the path used before): walks features every frame and draws them.
39
+ *
40
+ * The rendering result (including the z-order) is the same either way.
41
+ *
42
+ * An external renderer (a custom feature type or a layer-aware overlay) may rewrite the GL blend
43
+ * state for its own purposes. If it comes back having left it rewritten, everything drawn later
44
+ * in that frame (the layers that follow and the datasets) is drawn with the
45
+ * wrong blending, so `restoreBlendState` is called at the point control comes back, to
46
+ * re-establish the contract of the frame.
47
+ *
48
+ * @param companions Providers of companion drawing (those of this draw instance)
49
+ * @param features Features to draw in immediate mode (not used in retained mode)
50
+ * @param datasets Datasets (not drawn when omitted)
51
+ * @param storeRetained Retained batch cache for drawing the Store (immediate mode when omitted)
52
+ * @param restoreBlendState Re-establishes our own blend state (not re-established when omitted)
53
+ * @param range The segment (slot) to draw (every entry when omitted)
54
+ * @param view The part of the view to draw, on one copy of the world (the expanded viewport
55
+ * of the ViewportFilter when omitted). A view across the antimeridian is drawn once per
56
+ * copy, each with its own range
57
+ */
58
+ export declare function renderLayers(r: Renderers, store: Store, features: Feature[], selectedIdSet: Set<string>, defaultProjectionData: ProjectionData, zoom: number, customRenderers: Map<string, CustomFeatureHandler['renderer']>, customRendererContext: CustomRendererDrawContext, companions: FeatureCompanionRegistry, layerAwareRenderers: LayerAwareOverlayRenderer[], datasets?: DatasetManager, storeRetained?: StoreRetainedCache, restoreBlendState?: () => void, range?: RenderLayersRange, view?: RenderLayersView): void;
59
+ /**
60
+ * The context of the custom renderers for one layer (the context of the frame with the opacity
61
+ * of the layer)
62
+ *
63
+ * The same object is returned when the opacity is already the one of the context, so a map whose
64
+ * layers are all opaque allocates nothing per layer.
65
+ */
66
+ export declare function layerRendererContext(base: CustomRendererDrawContext, layer: Layer): CustomRendererDrawContext;
67
+ /**
68
+ * The part of the view one rendering covers (one copy of the world)
69
+ */
70
+ export interface RenderLayersView {
71
+ /** The range to draw, in stored longitudes (thins the chunks) */
72
+ readonly bounds: BoundingBox;
73
+ /** The ids of the features inside `bounds` (thins the immediate chunks one by one) */
74
+ readonly getVisibleIds: () => ReadonlySet<string>;
75
+ }
76
+ /**
77
+ * Specification of the segment (slot) to draw
78
+ *
79
+ * from / to is [from, to) in layerOrder. first is the first slot (it draws the datasets below
80
+ * the order), last is the last slot (it draws the datasets above the order).
81
+ */
82
+ export interface RenderLayersRange {
83
+ readonly from: number;
84
+ readonly to: number;
85
+ readonly first: boolean;
86
+ readonly last: boolean;
87
+ }
@@ -0,0 +1,187 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { drawFeatureCompanionsInFrame } from '../feature-companion.js';
4
+ import { layerDrawFactors } from '../renderers/draw-factors.js';
5
+ /**
6
+ * Draw features and overlays layer by layer
7
+ *
8
+ * The loop walks the stacking order of the Store (`store.getLayerOrder()`). Its entries are a
9
+ * mix of layer ids and dataset ids, and for each entry it does the following.
10
+ *
11
+ * - A layer exists: draw it in retained / immediate mode as before
12
+ * - A dataset whose order is 'layer-order' exists: draw that dataset
13
+ * - Neither of them (an unknown id): skip it (not an error)
14
+ *
15
+ * In addition, datasets (display) have two insertion points outside the layer
16
+ * loop. below-store is drawn before every layer (behind them) and above-store after every layer
17
+ * (in front of them). Batching uses the same BatchManager as the Store. The per-layer frames
18
+ * (beginFrame / endFrame) are closed inside the loop, so their state never mixes with a frame
19
+ * opened outside it. The batch of a dataset is also closed at a layer boundary, so inserting
20
+ * one in the middle of the order never nests GL state.
21
+ *
22
+ * There are two paths for the features of the Store.
23
+ *
24
+ * - Retained mode (storeRetained is present and the renderers support it): draws the retained
25
+ * batches prepared per layer. The features argument is not used. Thinning of a retained batch
26
+ * is done per chunk, so the bbox of the expanded viewport is computed once per frame and passed
27
+ * in. Immediate chunks, which draw one feature at a time, are thinned per feature as well, so
28
+ * the set of visible ids is passed too (only once it becomes necessary).
29
+ * - Immediate mode (the path used before): walks features every frame and draws them.
30
+ *
31
+ * The rendering result (including the z-order) is the same either way.
32
+ *
33
+ * An external renderer (a custom feature type or a layer-aware overlay) may rewrite the GL blend
34
+ * state for its own purposes. If it comes back having left it rewritten, everything drawn later
35
+ * in that frame (the layers that follow and the datasets) is drawn with the
36
+ * wrong blending, so `restoreBlendState` is called at the point control comes back, to
37
+ * re-establish the contract of the frame.
38
+ *
39
+ * @param companions Providers of companion drawing (those of this draw instance)
40
+ * @param features Features to draw in immediate mode (not used in retained mode)
41
+ * @param datasets Datasets (not drawn when omitted)
42
+ * @param storeRetained Retained batch cache for drawing the Store (immediate mode when omitted)
43
+ * @param restoreBlendState Re-establishes our own blend state (not re-established when omitted)
44
+ * @param range The segment (slot) to draw (every entry when omitted)
45
+ * @param view The part of the view to draw, on one copy of the world (the expanded viewport
46
+ * of the ViewportFilter when omitted). A view across the antimeridian is drawn once per
47
+ * copy, each with its own range
48
+ */
49
+ export function renderLayers(r, store, features, selectedIdSet, defaultProjectionData, zoom, customRenderers, customRendererContext, companions, layerAwareRenderers, datasets, storeRetained, restoreBlendState, range, view) {
50
+ const fullOrder = store.getLayerOrder();
51
+ // When a segment (slot) is given, only the entries of that segment are drawn. The datasets
52
+ // below the order (below-store) are drawn only by the first segment and those above it
53
+ // (above-store) only by the last segment (the same thing is not drawn once per slot)
54
+ const layerOrder = range ? fullOrder.slice(range.from, range.to) : fullOrder;
55
+ const drawBelow = range ? range.first : true;
56
+ const drawAbove = range ? range.last : true;
57
+ const tentative = store.getTentative();
58
+ // Implementations without the renderers of retained mode (a test stub, for example) fall back
59
+ // to the immediate mode used before
60
+ const retainedRenderers = storeRetained !== undefined && typeof r.batchManager.getRetainedRenderers === 'function'
61
+ ? r.batchManager.getRetainedRenderers()
62
+ : undefined;
63
+ const useRetained = storeRetained !== undefined && retainedRenderers !== undefined;
64
+ if (useRetained)
65
+ storeRetained.beginFrame(companions);
66
+ // The range used to thin the retained chunks and the chunks of the datasets.
67
+ // It does not depend on the number of features, so once per frame is enough (it is computed
68
+ // regardless of the rendering path and passed to draw / drawOne as an argument; the manager is
69
+ // not left to look it up lazily). An implementation without a ViewportFilter (a test stub, for
70
+ // example) does not compute it and leaves it to the default of the dataset.
71
+ const viewportBounds = view?.bounds ??
72
+ (typeof r.viewportFilter?.getBounds === 'function' ? r.viewportFilter.getBounds() : undefined);
73
+ // Immediate chunks (dashed lines, images, custom types) cannot be thinned by the chunk bbox
74
+ // alone: once a chunk touches the view, even features outside the screen are drawn one by one.
75
+ // The set of visible ids is passed so that the same per-feature thinning as immediate mode is
76
+ // applied. Querying the spatial index once per frame is enough, and it is not needed at all in
77
+ // a frame without a single immediate chunk, so it is looked up once, when first needed.
78
+ let visibleIdsMemo;
79
+ const canFilterVisible = view !== undefined ||
80
+ (viewportBounds !== undefined && typeof r.viewportFilter?.getVisibleIds === 'function');
81
+ const getVisibleIds = canFilterVisible
82
+ ? () => {
83
+ if (!visibleIdsMemo) {
84
+ visibleIdsMemo = view ? view.getVisibleIds() : r.viewportFilter.getVisibleIds();
85
+ }
86
+ return visibleIdsMemo;
87
+ }
88
+ : undefined;
89
+ // Insertion point 1: behind every layer of the Store
90
+ if (drawBelow) {
91
+ datasets?.draw('below-store', r.batchManager, defaultProjectionData, zoom, viewportBounds);
92
+ }
93
+ // Group the features by layer id (immediate mode only)
94
+ const featuresByLayer = new Map();
95
+ if (!useRetained) {
96
+ for (const feature of features) {
97
+ const layerFeatures = featuresByLayer.get(feature.layerId) ?? [];
98
+ layerFeatures.push(feature);
99
+ featuresByLayer.set(feature.layerId, layerFeatures);
100
+ }
101
+ }
102
+ for (const layerId of layerOrder) {
103
+ // The layer is needed to evaluate the style rule (layer.styleRule), so it is passed to the
104
+ // frame of the batch.
105
+ const layer = store.getLayer(layerId);
106
+ // An entry that is not a layer is drawn as a dataset taking part in the
107
+ // stacking order. If it is not a dataset either, it is skipped (the order is the single
108
+ // source of truth, and an id that is not on it is not drawn).
109
+ if (!layer) {
110
+ datasets?.drawOne(layerId, r.batchManager, defaultProjectionData, zoom, viewportBounds);
111
+ continue;
112
+ }
113
+ // The custom renderers and the companions of the layer get its opacity in their context
114
+ const layerContext = layerRendererContext(customRendererContext, layer);
115
+ if (useRetained && retainedRenderers) {
116
+ storeRetained.drawLayer(layerId, layer, defaultProjectionData, zoom, {
117
+ renderers: retainedRenderers,
118
+ batchManager: r.batchManager,
119
+ customRenderers,
120
+ customRendererContext: layerContext,
121
+ companions,
122
+ getVisibleIds,
123
+ restoreBlendState,
124
+ }, viewportBounds);
125
+ }
126
+ else {
127
+ const layerFeatures = featuresByLayer.get(layerId) ?? [];
128
+ r.batchManager.beginFrame(defaultProjectionData, zoom, layer);
129
+ for (const feature of layerFeatures) {
130
+ const isSelected = selectedIdSet.has(feature.id);
131
+ // Companion drawing (feature companion): drawn right before the feature itself, that is,
132
+ // one z below it. If no provider at all is registered, not even has is called.
133
+ drawFeatureCompanionsInFrame(companions, feature, r.batchManager, defaultProjectionData, zoom, layer, layerContext, restoreBlendState);
134
+ const customRenderer = customRenderers.get(feature.type);
135
+ if (customRenderer) {
136
+ // To keep the draw order (painter's algorithm), the core batch that has accumulated is
137
+ // flushed first and only then the custom feature is drawn immediately.
138
+ // A batch is not painted until endFrame, so without flushing here a custom feature
139
+ // would ignore layer.order and be drawn before the core features of the same layer.
140
+ r.batchManager.endFrame();
141
+ customRenderer.draw({
142
+ id: feature.id,
143
+ type: feature.type,
144
+ coordinates: feature.coordinates,
145
+ properties: feature.properties,
146
+ style: feature.style,
147
+ }, defaultProjectionData, zoom, layerContext);
148
+ // Re-establish the blend state that the external renderer may have rewritten.
149
+ restoreBlendState?.();
150
+ // Restart the batch for the core features that follow.
151
+ r.batchManager.beginFrame(defaultProjectionData, zoom, layer);
152
+ }
153
+ else {
154
+ r.batchManager.processFeature(feature, isSelected);
155
+ }
156
+ }
157
+ r.batchManager.endFrame();
158
+ }
159
+ // Tentative rendering
160
+ if (tentative && tentative.layerId === layerId) {
161
+ r.tentativeRenderer.drawGeometry(tentative, defaultProjectionData, zoom);
162
+ }
163
+ // Layer-aware overlay rendering (an overlay is not content of the layer, so it keeps the
164
+ // context of the frame, at opacity 1)
165
+ for (const renderer of layerAwareRenderers) {
166
+ renderer.drawForLayer(layerId, defaultProjectionData, zoom, customRendererContext);
167
+ // Re-establish the blend state that the external renderer may have rewritten
168
+ restoreBlendState?.();
169
+ }
170
+ }
171
+ // Insertion point 2: in front of every layer of the Store (behind the selection UI and
172
+ // tentative)
173
+ if (drawAbove) {
174
+ datasets?.draw('above-store', r.batchManager, defaultProjectionData, zoom, viewportBounds);
175
+ }
176
+ }
177
+ /**
178
+ * The context of the custom renderers for one layer (the context of the frame with the opacity
179
+ * of the layer)
180
+ *
181
+ * The same object is returned when the opacity is already the one of the context, so a map whose
182
+ * layers are all opaque allocates nothing per layer.
183
+ */
184
+ export function layerRendererContext(base, layer) {
185
+ const opacity = layerDrawFactors(layer).opacity;
186
+ return base.opacity === opacity ? base : { ...base, opacity };
187
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Initialization and disposal of the renderers
3
+ *
4
+ * Lifecycle management of every renderer that CustomLayer uses
5
+ */
6
+ import type { Map as MapLibreMap } from 'maplibre-gl';
7
+ import type { CustomFeatureHandler } from '../../extension/index.js';
8
+ import type { FeatureStyleConfig } from '../../shared/config/feature-style.js';
9
+ import type { RenderingConfig } from '../../shared/config/rendering.js';
10
+ import type { SelectionUIConfig } from '../../shared/config/selection.js';
11
+ import type { PixelRatioInput } from '../../shared/utils/pixel-ratio.js';
12
+ import type { SpatialIndex } from '../../store/spatial/spatial-index.js';
13
+ import type { Store } from '../../store/store.js';
14
+ import { TextureCache } from '../cache/texture.js';
15
+ import { BatchManager } from '../renderers/batch-manager.js';
16
+ import { FeatureDrawer } from '../renderers/drawer.js';
17
+ import { type ImageErrorFn, ImageRenderer } from '../renderers/image.js';
18
+ import { SDFLineRenderer } from '../renderers/line/sdf-line.js';
19
+ import { PointInstanceRenderer } from '../renderers/point/point-instance.js';
20
+ import { PointShapeRenderer } from '../renderers/point/point-shape.js';
21
+ import { PolygonBatchRenderer } from '../renderers/polygon/batch.js';
22
+ import { FillShaderManager } from '../renderers/polygon/fill.js';
23
+ import { SDFPolygonRenderer } from '../renderers/polygon/sdf-polygon.js';
24
+ import { StrokeRenderer } from '../renderers/stroke.js';
25
+ import { ShaderInitializer } from '../shaders/initializer.js';
26
+ import { QuadShader } from '../shaders/quad.js';
27
+ import { BoxSelectionRenderer } from '../ui/box-selection.js';
28
+ import { SelectionHandlesRenderer, SelectionUIRenderer } from '../ui/index.js';
29
+ import { TentativeRenderer } from '../ui/tentative.js';
30
+ import { ViewportFilter } from '../viewport.js';
31
+ import type { RenderScope } from './render-scope.js';
32
+ /**
33
+ * The initialized renderers
34
+ */
35
+ export interface Renderers {
36
+ textureCache: TextureCache;
37
+ quadShader: QuadShader;
38
+ imageRenderer: ImageRenderer;
39
+ strokeRenderer: StrokeRenderer;
40
+ sdfLineRenderer: SDFLineRenderer;
41
+ pointShapeRenderer: PointShapeRenderer;
42
+ pointInstanceRenderer: PointInstanceRenderer;
43
+ polygonBatchRenderer: PolygonBatchRenderer;
44
+ sdfPolygonRenderer: SDFPolygonRenderer;
45
+ fillShaderManager: FillShaderManager;
46
+ selectionUIRenderer: SelectionUIRenderer;
47
+ selectionHandlesRenderer: SelectionHandlesRenderer;
48
+ featureDrawer: FeatureDrawer;
49
+ tentativeRenderer: TentativeRenderer;
50
+ boxSelectionRenderer: BoxSelectionRenderer;
51
+ viewportFilter: ViewportFilter;
52
+ shaderInitializer: ShaderInitializer;
53
+ batchManager: BatchManager;
54
+ }
55
+ /**
56
+ * What the renderers of one CustomLayer are built from
57
+ */
58
+ export interface InitRenderersDeps {
59
+ gl: WebGL2RenderingContext;
60
+ map: MapLibreMap;
61
+ store: Store;
62
+ spatialIndex: SpatialIndex;
63
+ featureStyle: FeatureStyleConfig;
64
+ selectionConfig: SelectionUIConfig;
65
+ renderingConfig: RenderingConfig;
66
+ customFeatureHandlers: CustomFeatureHandler[] | undefined;
67
+ /** Injected rendering pixel ratio (when omitted, read from window every time) */
68
+ pixelRatio?: PixelRatioInput;
69
+ /** The state and the caches owned by the draw instance (never shared between instances) */
70
+ scope: RenderScope;
71
+ /** Where the failure to load the image of an Image feature is reported */
72
+ onImageError?: ImageErrorFn;
73
+ }
74
+ /**
75
+ * Initialize the renderers
76
+ */
77
+ export declare function initRenderers(deps: InitRenderersDeps): Renderers;
78
+ /**
79
+ * Dispose the renderers
80
+ */
81
+ export declare function disposeRenderers(r: Renderers): void;