@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,604 @@
1
+ // SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ import { DRAPE_BLOCK_EDGES, drapeQuantizedGeometry } from './geometry.js';
4
+ /** The minimum number of divisions of the grid (per side) */
5
+ export const DRAPE_MIN_CELLS = 8;
6
+ /** The maximum number of divisions of the grid (per side) */
7
+ export const DRAPE_MAX_CELLS = 64;
8
+ /**
9
+ * The maximum number of divisions of the grid (per side) allowed on a retry
10
+ *
11
+ * Only when cells that exceed the budget remain is the grid made this fine and rebuilt.
12
+ */
13
+ export const DRAPE_RETRY_MAX_CELLS = 128;
14
+ /**
15
+ * The target number of edges to put into one cell (the grid is made finer so as not to exceed it)
16
+ *
17
+ * It is set at half of the upper limit of the work per pixel (DRAPE_MAX_CELL_WORK). If the
18
+ * target were the same as the limit, even a single straightforward feature would sit right at
19
+ * the limit and unnecessary quantization would be applied.
20
+ */
21
+ export const DRAPE_TARGET_EDGES_PER_CELL = 12;
22
+ /** The target number of elements to put into one cell (this decides the number of runs) */
23
+ export const DRAPE_TARGET_ELEMENTS_PER_CELL = 4;
24
+ /** The maximum number of edges one cell can hold (a cell that exceeds it signals degradation) */
25
+ export const DRAPE_MAX_EDGES_PER_CELL = 256;
26
+ /**
27
+ * The maximum number of runs (the span of one feature) one cell can hold
28
+ *
29
+ * A cell that exceeds it is truncated inside that cell alone (the elements at the back of the
30
+ * draw order = in front are dropped). The only cells this applies to are those of a coarse
31
+ * distant tile where dozens of items overlap in a single pixel. The map as a whole is never
32
+ * degraded.
33
+ */
34
+ export const DRAPE_MAX_RUNS_PER_CELL = 128;
35
+ /**
36
+ * The maximum number of edges handled by a single tile
37
+ *
38
+ * First the vertices are quantized onto a grid (LOD) to make them fit. A tile that still
39
+ * exceeds the limit is not built and returns the degradation signal instead (discarding it
40
+ * after building would stall the frame for exactly that long).
41
+ *
42
+ * The value was taken from measurements. Putting 8,172 administrative boundaries (about 1.1
43
+ * million vertices) through a single tile, building the index takes 0.8ms at z13, 1.2ms at
44
+ * z12, 4.0ms at z11, 15.6ms at z10 and 23.4ms at z9. 200,000 edges is roughly 20ms, and the
45
+ * only tiles that reach this amount are the coarse ones, of which there are just a few in the
46
+ * view (they are built only once, and after that the cache of the tile index takes over). The
47
+ * amount for the whole view is held down separately by the budget of the edge texture
48
+ * (DRAPE_MAX_EDGE_TEXELS in bin-store).
49
+ */
50
+ export const DRAPE_MAX_EDGES_PER_TILE = 200000;
51
+ /**
52
+ * The upper limit of the amount solved per cell (the average of runs + edges)
53
+ *
54
+ * A fragment walks the runs of its own cell in order and, for each run, sweeps the edges of
55
+ * that cell. The work per pixel is therefore roughly "the number of runs + the number of edges
56
+ * of that cell". When the map is zoomed far out, nested administrative areas (prefectures,
57
+ * districts, municipalities) and neighboring areas pile up dozens deep in a single cell and
58
+ * this amount jumps. In measurements it reached 500ms per frame over the whole Kanto region at
59
+ * z8.7.
60
+ *
61
+ * A tile that exceeds this is not suited to the analytic evaluation. The vertex displacement
62
+ * path takes it over (in a zoomed-out view the relief of the terrain is small on screen, so
63
+ * vertex displacement does not break down either).
64
+ *
65
+ * The actual limit is scaled up by the number of tiles in the view. The screen is shared out
66
+ * among the tiles, so the more tiles there are the fewer pixels each one has, and the same
67
+ * work per pixel costs less for the frame as a whole (`drapeCellWorkBudget`).
68
+ */
69
+ export const DRAPE_MAX_CELL_WORK = 24;
70
+ /**
71
+ * Derives the upper limit of the work per cell from the number of tiles in the view
72
+ */
73
+ export function drapeCellWorkBudget(tileCount) {
74
+ const factor = Math.min(8, Math.max(1, tileCount / 4));
75
+ return DRAPE_MAX_CELL_WORK * factor;
76
+ }
77
+ /**
78
+ * The number of edges at which the vertices start being quantized onto a grid
79
+ *
80
+ * A tile below this solves the original geometry as it is (every view at a normal zoom is on
81
+ * this side, and quantization applies only to coarse distant tiles).
82
+ */
83
+ export const DRAPE_LOD_TRIGGER = 16000;
84
+ /** The resolution of the quantization grid (a single tile is stepped by 2^9 = 512) */
85
+ const DRAPE_TILE_SAMPLES_LOG2 = 9;
86
+ /**
87
+ * The lower bound of the quantization (a single tile is never made coarser than 2^8 = 256)
88
+ *
89
+ * A terrain tile is drawn at roughly 512 pixels on screen, so this step corresponds to 2
90
+ * pixels. Quantizing more coarsely than this makes polygons look like staircase-shaped blocks
91
+ * (verified in the field, the whole Kanto region at z8.7). A tile that does not fit even when
92
+ * made coarser is not suited to the analytic evaluation, so it is handed to the vertex
93
+ * displacement path.
94
+ */
95
+ const DRAPE_MIN_SAMPLES_LOG2 = 8;
96
+ /**
97
+ * The smallest size a terrain tile is assumed to occupy on screen (physical pixels)
98
+ *
99
+ * Outlines are drawn with a width in screen pixels, so even an edge outside a cell can paint
100
+ * pixels inside the cell. This is the conservative estimate used to convert that margin into
101
+ * in-tile coordinates (an actual tile is often drawn larger than this, and the margin comes out
102
+ * on the safe side by that much).
103
+ */
104
+ const TILE_SCREEN_PX = 256;
105
+ /**
106
+ * The lower and upper bounds of the margin (in-tile coordinates)
107
+ *
108
+ * Outlines are drawn with a width in screen pixels, so even an edge outside a cell can paint
109
+ * pixels inside the cell. The lower bound is the minimum needed to keep that from being missed
110
+ * (the drawn range fits inside the tile's [0, 1], so the margin is decided by the thickness of
111
+ * the outline alone).
112
+ */
113
+ const MIN_MARGIN = 0.0025;
114
+ // The upper bound is the size of the coarsest cell (1 / DRAPE_MIN_CELLS). A margin larger than
115
+ // that would amount to "handing a single edge out to the whole tile", and only the index bloats
116
+ const MAX_MARGIN = 1 / DRAPE_MIN_CELLS;
117
+ /**
118
+ * Builds the key of the selection highlight
119
+ *
120
+ * So that IDs colliding across datasets are never mistaken for one another, the dataset
121
+ * ID and the feature ID are tied together with a delimiter. The side that builds the elements
122
+ * (`pass.ts`) and the side that collects the selection (`view/layer/drape-planner.ts`) use the
123
+ * same function.
124
+ */
125
+ export function drapeSelectionKey(datasetId, featureId) {
126
+ return `${datasetId}\u0000${featureId}`;
127
+ }
128
+ /**
129
+ * The margin of an element (in-tile coordinates)
130
+ *
131
+ * A line is drawn with a thickness in screen pixels, so even an edge outside a cell paints
132
+ * pixels inside the cell. This is the margin used to hand that reach out to the cells. For an
133
+ * element that has a reference zoom the thickness changes by `2^(zoom - widthZoom)`, so the
134
+ * same factor is applied to the estimate as well. Forgetting to apply it eats the fringe of a
135
+ * thickened, zoomed-in line at the cell boundaries and chips it away into a jagged edge.
136
+ *
137
+ * @param strokeWidthPx The thickness at the reference zoom (physical pixels)
138
+ * @param widthZoom The reference zoom of the thickness (negative means fixed in screen pixels)
139
+ * @param zoom The current zoom
140
+ */
141
+ export function drapeMarginOf(strokeWidthPx, widthZoom = -1, zoom = 0) {
142
+ const scale = widthZoom >= 0 ? 2 ** (zoom - widthZoom) : 1;
143
+ const half = strokeWidthPx * scale * 0.5 + 1;
144
+ return Math.min(MAX_MARGIN, Math.max(MIN_MARGIN, half / TILE_SCREEN_PX));
145
+ }
146
+ /**
147
+ * Decides the number of divisions of the grid (a power of two)
148
+ *
149
+ * From the number of edges it picks a resolution that fits within "the target number per cell",
150
+ * and holds it back to the range where a cell does not become smaller than the margin (if the
151
+ * margin were larger than a cell, a single edge would be scattered as far as the cell after
152
+ * the next one and only the index would bloat).
153
+ */
154
+ export function chooseGrid(edgeCount, margin, elementCount = 0) {
155
+ let grid = DRAPE_MIN_CELLS;
156
+ const want = Math.max(Math.sqrt(Math.max(1, edgeCount) / DRAPE_TARGET_EDGES_PER_CELL), Math.sqrt(Math.max(1, elementCount) / DRAPE_TARGET_ELEMENTS_PER_CELL));
157
+ while (grid < DRAPE_MAX_CELLS && grid < want)
158
+ grid *= 2;
159
+ while (grid > DRAPE_MIN_CELLS && 1 / grid < margin)
160
+ grid /= 2;
161
+ return grid;
162
+ }
163
+ /**
164
+ * Performs the binning for a single tile
165
+ *
166
+ * @param elements The elements in draw order (the whole ordering. The index becomes the row of
167
+ * the style)
168
+ * @param tile The tile
169
+ * @param candidates The indices of the elements narrowed down in advance (when omitted, every
170
+ * element is looked at)
171
+ */
172
+ export function binTile(elements, tile, options) {
173
+ const candidates = options?.candidates;
174
+ const maxCellWork = options?.maxCellWork ?? DRAPE_MAX_CELL_WORK;
175
+ const zoom = options?.zoom ?? 0;
176
+ const scale = 2 ** tile.z;
177
+ const floorLevel = tile.z + DRAPE_MIN_SAMPLES_LOG2;
178
+ // Pass 1: pick the relevant elements and estimate the amount of edges. If the amount is
179
+ // large, swap in geometry whose vertices have been quantized onto a grid (LOD) matching the
180
+ // resolution of that tile.
181
+ let quantizeLevel = 0;
182
+ let picked = pickElements(elements, candidates, tile, scale, quantizeLevel, zoom);
183
+ if (picked.edgeEstimate > DRAPE_LOD_TRIGGER) {
184
+ // Start from a grid that steps a single tile by roughly 512 and make it coarser one level
185
+ // at a time until it fits the budget. It must not skip ahead. The number of edges does not
186
+ // fall in proportion to the coarseness of the quantization; past a certain coarseness
187
+ // whole polygons collapse and it drops all at once. Skipping would pick a grid far coarser
188
+ // than necessary and polygons would look like square blocks (verified in the field, the
189
+ // whole Kanto region at z8.7)
190
+ for (quantizeLevel = tile.z + DRAPE_TILE_SAMPLES_LOG2; quantizeLevel >= floorLevel; quantizeLevel--) {
191
+ picked = pickElements(elements, candidates, tile, scale, quantizeLevel, zoom);
192
+ if (picked.edgeEstimate <= DRAPE_MAX_EDGES_PER_TILE)
193
+ break;
194
+ }
195
+ if (quantizeLevel < floorLevel)
196
+ quantizeLevel = floorLevel;
197
+ }
198
+ if (picked.edgeEstimate > DRAPE_MAX_EDGES_PER_TILE) {
199
+ // It does not fit even after quantization. Building alone takes hundreds of milliseconds,
200
+ // so it is degraded without being built
201
+ return emptyBins(DRAPE_MIN_CELLS, picked.edgeEstimate, true);
202
+ }
203
+ let grid = chooseGrid(picked.edgeEstimate, picked.maxMargin, picked.indices.length);
204
+ if (picked.indices.length === 0)
205
+ return emptyBins(grid, picked.edgeEstimate, false);
206
+ // Pass 2: actually build it. If cells that exceed the budget of a cell remain, those cells
207
+ // end up "solving inside/outside with too few edges" and show up as square blotches where a
208
+ // whole cell is painted. While truncation remains the grid is made finer, and if that is
209
+ // still not enough the quantization is made coarser and it is rebuilt. Only when there is
210
+ // nothing left to try does it return the degradation signal.
211
+ for (let attempt = 0; attempt < 10; attempt++) {
212
+ const bins = assembleBins(elements, picked, tile, scale, grid, zoom);
213
+ // A tile with too much work per pixel does not get any lighter whether the quantization is
214
+ // applied or the grid is made finer (the sheer number of deeply overlapping polygons is
215
+ // the cost). It is not suited to the analytic evaluation, so it returns the degradation
216
+ // signal as it is
217
+ if (bins.cellWork > maxCellWork)
218
+ return { ...bins, overflow: true };
219
+ if (bins.truncatedCells === 0)
220
+ return bins;
221
+ if (grid < DRAPE_RETRY_MAX_CELLS) {
222
+ grid *= 2;
223
+ continue;
224
+ }
225
+ if (quantizeLevel === 0) {
226
+ quantizeLevel = tile.z + DRAPE_TILE_SAMPLES_LOG2;
227
+ }
228
+ else if (quantizeLevel > floorLevel) {
229
+ quantizeLevel -= 1;
230
+ }
231
+ else {
232
+ return { ...bins, overflow: true };
233
+ }
234
+ picked = pickElements(elements, candidates, tile, scale, quantizeLevel, zoom);
235
+ // A grid that has once been made finer is never put back (putting it back would only
236
+ // repeat the work of making it finer)
237
+ grid = Math.max(grid, chooseGrid(picked.edgeEstimate, picked.maxMargin, picked.indices.length));
238
+ }
239
+ return emptyBins(DRAPE_MIN_CELLS, picked.edgeEstimate, true);
240
+ }
241
+ /** Empty bins (the common way to return for a degradation and for no relevant elements) */
242
+ function emptyBins(grid, edgeEstimate, overflow) {
243
+ return {
244
+ grid,
245
+ cells: new Int32Array(grid * grid * 2),
246
+ runs: new Float32Array(0),
247
+ edges: new Float32Array(0),
248
+ overflow,
249
+ truncatedCells: 0,
250
+ cellWork: 0,
251
+ edgeEstimate,
252
+ maxEdgesPerCell: 0,
253
+ maxRunsPerCell: 0,
254
+ };
255
+ }
256
+ /**
257
+ * Actually builds the picked elements into the index with the grid that was decided
258
+ */
259
+ function assembleBins(elements, picked, tile, scale, grid, zoom) {
260
+ const tileX = tile.x;
261
+ const tileY = tile.y;
262
+ const cellCount = grid * grid;
263
+ const cellSize = 1 / grid;
264
+ const cells = new Int32Array(cellCount * 2);
265
+ /** The edges in in-tile coordinates (four numbers per edge). Stacked across elements */
266
+ const edgeXY = [];
267
+ /** The runs per cell. Triples of (elementIndex, inside, edgeListIndex) laid out in a row */
268
+ const cellRuns = new Array(cellCount);
269
+ /** The lists of edge indices that the runs point to */
270
+ const runEdges = [];
271
+ /** The inside/outside difference per row (width grid + 1) */
272
+ const rowDiff = new Int8Array(grid * (grid + 1));
273
+ const rowTouched = new Uint8Array(grid);
274
+ const touchedRows = [];
275
+ /** The cell assignment for a single element */
276
+ const scratch = new Map();
277
+ /** The number of cells truncated for exceeding the budget */
278
+ let truncatedCells = 0;
279
+ /** The diagnostic values */
280
+ let maxEdgesPerCell = 0;
281
+ let maxRunsPerCell = 0;
282
+ const pushRun = (cell, elementIndex, inside, list) => {
283
+ let target = cellRuns[cell];
284
+ if (!target) {
285
+ target = [];
286
+ cellRuns[cell] = target;
287
+ }
288
+ let edgeListIndex = -1;
289
+ if (list !== undefined && list.length > 0) {
290
+ edgeListIndex = runEdges.length;
291
+ runEdges.push(list);
292
+ }
293
+ target.push(elementIndex, inside, edgeListIndex);
294
+ };
295
+ for (let p = 0; p < picked.indices.length; p++) {
296
+ const index = picked.indices[p];
297
+ const element = elements[index];
298
+ const margin = drapeMarginOf(element.strokeWidthPx, element.widthZoom, zoom);
299
+ scratch.clear();
300
+ touchedRows.length = 0;
301
+ rowTouched.fill(0);
302
+ for (const path of picked.geometries[p].paths) {
303
+ scanPath(path, element.kind, tileX, tileY, scale, margin, grid, cellSize, edgeXY, scratch, rowDiff, rowTouched, touchedRows);
304
+ }
305
+ // Turn the cells that are inside and the cells the edges touch into runs (they are stacked
306
+ // in the order of the elements, so this comes out as the draw order)
307
+ const emitted = new Set();
308
+ for (const row of touchedRows) {
309
+ const base = row * (grid + 1);
310
+ let inside = 0;
311
+ for (let i = 0; i < grid; i++) {
312
+ inside ^= rowDiff[base + i];
313
+ const cell = row * grid + i;
314
+ const list = scratch.get(cell);
315
+ if (inside === 0 && list === undefined)
316
+ continue;
317
+ emitted.add(cell);
318
+ pushRun(cell, index, inside, list);
319
+ }
320
+ rowDiff.fill(0, base, base + grid + 1);
321
+ }
322
+ for (const [cell, list] of scratch) {
323
+ if (emitted.has(cell))
324
+ continue;
325
+ pushRun(cell, index, 0, list);
326
+ }
327
+ }
328
+ // Repacking (laid out in the order cell -> run -> edge)
329
+ const runs = [];
330
+ const edges = [];
331
+ for (let c = 0; c < cellCount; c++) {
332
+ const list = cellRuns[c];
333
+ cells[c * 2] = runs.length / 4;
334
+ if (!list) {
335
+ cells[c * 2 + 1] = 0;
336
+ continue;
337
+ }
338
+ let runCount = 0;
339
+ let truncated = false;
340
+ for (let i = 0; i + 2 < list.length; i += 3) {
341
+ if (runCount >= DRAPE_MAX_RUNS_PER_CELL) {
342
+ truncated = true;
343
+ break;
344
+ }
345
+ const edgeListIndex = list[i + 2];
346
+ const edgeStart = edges.length / 4;
347
+ let edgeCount = 0;
348
+ if (edgeListIndex >= 0) {
349
+ for (const at of runEdges[edgeListIndex]) {
350
+ if (edgeCount >= DRAPE_MAX_EDGES_PER_CELL) {
351
+ truncated = true;
352
+ break;
353
+ }
354
+ edges.push(edgeXY[at * 4], edgeXY[at * 4 + 1], edgeXY[at * 4 + 2], edgeXY[at * 4 + 3]);
355
+ edgeCount++;
356
+ }
357
+ }
358
+ runs.push(list[i], edgeStart, edgeCount, list[i + 1]);
359
+ runCount++;
360
+ if (edgeCount > maxEdgesPerCell)
361
+ maxEdgesPerCell = edgeCount;
362
+ }
363
+ if (truncated)
364
+ truncatedCells++;
365
+ if (runCount > maxRunsPerCell)
366
+ maxRunsPerCell = runCount;
367
+ cells[c * 2 + 1] = runCount;
368
+ }
369
+ return {
370
+ grid,
371
+ cells,
372
+ runs: new Float32Array(runs),
373
+ edges: new Float32Array(edges),
374
+ overflow: false,
375
+ truncatedCells,
376
+ cellWork: (runs.length / 4 + edges.length / 4) / cellCount,
377
+ edgeEstimate: picked.edgeEstimate,
378
+ maxEdgesPerCell,
379
+ maxRunsPerCell,
380
+ };
381
+ }
382
+ /**
383
+ * Picks the elements relevant to a tile by their bounding box
384
+ *
385
+ * @param quantizeLevel 0 uses the original geometry, anything else uses the geometry quantized
386
+ * to that resolution
387
+ */
388
+ function pickElements(elements, candidates, tile, scale, quantizeLevel, zoom) {
389
+ const indices = [];
390
+ const geometries = [];
391
+ let edgeEstimate = 0;
392
+ let maxMargin = MIN_MARGIN;
393
+ // Quantization can move a vertex outward by half a step of the grid, so it is added to the
394
+ // margin used for the selection
395
+ const quantizeSlack = quantizeLevel > 0 ? 2 ** -quantizeLevel : 0;
396
+ const length = candidates ? candidates.length : elements.length;
397
+ for (let n = 0; n < length; n++) {
398
+ const index = candidates ? candidates[n] : n;
399
+ const element = elements[index];
400
+ const margin = drapeMarginOf(element.strokeWidthPx, element.widthZoom, zoom);
401
+ const m = margin / scale + quantizeSlack;
402
+ const box = element.bounds;
403
+ if (box.maxX < tile.x / scale - m ||
404
+ box.minX > (tile.x + 1) / scale + m ||
405
+ box.maxY < tile.y / scale - m ||
406
+ box.minY > (tile.y + 1) / scale + m) {
407
+ continue;
408
+ }
409
+ // This is where the coordinates are converted for the first time (only the features that
410
+ // touch the view)
411
+ const base = element.geometry();
412
+ if (base.edgeCount === 0)
413
+ continue;
414
+ const geometry = quantizeLevel > 0 ? drapeQuantizedGeometry(base, quantizeLevel) : base;
415
+ if (geometry.edgeCount === 0)
416
+ continue;
417
+ indices.push(index);
418
+ geometries.push(geometry);
419
+ if (margin > maxMargin)
420
+ maxMargin = margin;
421
+ edgeEstimate += countNearEdges(geometry, tile.x, tile.y, scale, m);
422
+ }
423
+ return { indices, geometries, edgeEstimate, maxMargin };
424
+ }
425
+ /**
426
+ * Streams a single path into the grid of the tile
427
+ *
428
+ * A polygon does two jobs at once. One is the assignment of edges to cells, the other is the
429
+ * tallying of "the inside/outside of the cell origin". The latter counts the crossings to the
430
+ * right of the origin, so an edge outside the tile on the right also counts (it becomes a flip
431
+ * of a whole row). An edge outside on the left flips nothing, so it can be dropped.
432
+ */
433
+ function scanPath(path, kind, tileX, tileY, scale, margin, grid, cellSize, edgeXY, scratch, rowDiff, rowTouched, touchedRows) {
434
+ const xy = path.xy;
435
+ const vertexCount = xy.length / 2;
436
+ const blockCount = path.blocks.length / 4;
437
+ for (let b = 0; b < blockCount; b++) {
438
+ const by0 = path.blocks[b * 4 + 1] * scale - tileY;
439
+ const by1 = path.blocks[b * 4 + 3] * scale - tileY;
440
+ if (by1 < -margin || by0 > 1 + margin)
441
+ continue;
442
+ const bx0 = path.blocks[b * 4] * scale - tileX;
443
+ const bx1 = path.blocks[b * 4 + 2] * scale - tileX;
444
+ if (bx1 < -margin)
445
+ continue;
446
+ if (kind === 1 && bx0 > 1 + margin)
447
+ continue;
448
+ const from = b * DRAPE_BLOCK_EDGES;
449
+ const to = Math.min(path.edgeCount, from + DRAPE_BLOCK_EDGES);
450
+ for (let e = from; e < to; e++) {
451
+ const v1 = e + 1 < vertexCount ? e + 1 : 0;
452
+ const x0 = xy[e * 2] * scale - tileX;
453
+ const y0 = xy[e * 2 + 1] * scale - tileY;
454
+ const x1 = xy[v1 * 2] * scale - tileX;
455
+ const y1 = xy[v1 * 2 + 1] * scale - tileY;
456
+ if (x0 === x1 && y0 === y1)
457
+ continue;
458
+ if (kind === 0) {
459
+ accumulateInside(x0, y0, x1, y1, grid, cellSize, rowDiff, rowTouched, touchedRows);
460
+ }
461
+ scatterEdge(x0, y0, x1, y1, margin, grid, cellSize, edgeXY, scratch);
462
+ }
463
+ }
464
+ }
465
+ /**
466
+ * Adds "the crossings to the right of the cell origin" for a single edge to the row difference
467
+ *
468
+ * Every cell whose origin lies to the left of the crossing point xint is flipped. The range
469
+ * that is flipped is [0, k), so by setting 0 and k in the difference array and afterwards
470
+ * taking the exclusive OR from the left in order, the inside/outside of the whole row comes
471
+ * out.
472
+ */
473
+ function accumulateInside(x0, y0, x1, y1, grid, cellSize, rowDiff, rowTouched, touchedRows) {
474
+ if (y0 === y1)
475
+ return;
476
+ const yLo = Math.min(y0, y1);
477
+ const yHi = Math.max(y0, y1);
478
+ let jLo = Math.ceil(yLo / cellSize);
479
+ let jHi = Math.floor(yHi / cellSize);
480
+ if (jLo < 0)
481
+ jLo = 0;
482
+ if (jHi > grid - 1)
483
+ jHi = grid - 1;
484
+ if (jLo > jHi)
485
+ return;
486
+ const inv = 1 / (y1 - y0);
487
+ for (let j = jLo; j <= jHi; j++) {
488
+ const yj = j * cellSize;
489
+ if (y0 > yj === y1 > yj)
490
+ continue;
491
+ const t = (yj - y0) * inv;
492
+ const xint = x0 + t * (x1 - x0);
493
+ let k = Math.ceil(xint / cellSize);
494
+ if (k <= 0)
495
+ continue;
496
+ if (k > grid)
497
+ k = grid;
498
+ const base = j * (grid + 1);
499
+ if (rowTouched[j] === 0) {
500
+ rowTouched[j] = 1;
501
+ touchedRows.push(j);
502
+ }
503
+ rowDiff[base] ^= 1;
504
+ rowDiff[base + k] ^= 1;
505
+ }
506
+ }
507
+ /**
508
+ * Assigns a single edge to the cells it passes through (including the margin)
509
+ *
510
+ * Sweeping the bounding box as it is would touch a whole rectangle of cells for a single edge
511
+ * that crosses the tile diagonally. The segment is cut per row to obtain the range of x, and
512
+ * only the columns in that range are touched.
513
+ */
514
+ function scatterEdge(x0, y0, x1, y1, margin, grid, cellSize, edgeXY, scratch) {
515
+ const exLo = Math.min(x0, x1) - margin;
516
+ const exHi = Math.max(x0, x1) + margin;
517
+ const eyLo = Math.min(y0, y1) - margin;
518
+ const eyHi = Math.max(y0, y1) + margin;
519
+ if (exHi < 0 || exLo > 1 || eyHi < 0 || eyLo > 1)
520
+ return;
521
+ let jLo = Math.floor(eyLo / cellSize);
522
+ let jHi = Math.floor(eyHi / cellSize);
523
+ if (jLo < 0)
524
+ jLo = 0;
525
+ if (jHi > grid - 1)
526
+ jHi = grid - 1;
527
+ if (jLo > jHi)
528
+ return;
529
+ const at = edgeXY.length / 4;
530
+ edgeXY.push(x0, y0, x1, y1);
531
+ const horizontal = y0 === y1;
532
+ const inv = horizontal ? 0 : 1 / (y1 - y0);
533
+ for (let j = jLo; j <= jHi; j++) {
534
+ let xa;
535
+ let xb;
536
+ if (horizontal) {
537
+ xa = Math.min(x0, x1);
538
+ xb = Math.max(x0, x1);
539
+ }
540
+ else {
541
+ let t0 = (j * cellSize - margin - y0) * inv;
542
+ let t1 = ((j + 1) * cellSize + margin - y0) * inv;
543
+ if (t0 > t1) {
544
+ const swap = t0;
545
+ t0 = t1;
546
+ t1 = swap;
547
+ }
548
+ if (t0 < 0)
549
+ t0 = 0;
550
+ if (t1 > 1)
551
+ t1 = 1;
552
+ if (t0 > t1)
553
+ continue;
554
+ const xt0 = x0 + t0 * (x1 - x0);
555
+ const xt1 = x0 + t1 * (x1 - x0);
556
+ xa = Math.min(xt0, xt1);
557
+ xb = Math.max(xt0, xt1);
558
+ }
559
+ xa -= margin;
560
+ xb += margin;
561
+ if (xb < 0 || xa > 1)
562
+ continue;
563
+ let iLo = Math.floor(xa / cellSize);
564
+ let iHi = Math.floor(xb / cellSize);
565
+ if (iLo < 0)
566
+ iLo = 0;
567
+ if (iHi > grid - 1)
568
+ iHi = grid - 1;
569
+ for (let i = iLo; i <= iHi; i++) {
570
+ const cell = j * grid + i;
571
+ const list = scratch.get(cell);
572
+ // No limit is applied here. Applying one would create "a cell that silently lost edges",
573
+ // the inside/outside test would go wrong and a whole cell would be painted. Truncation
574
+ // is detected during the repacking
575
+ if (list)
576
+ list.push(at);
577
+ else
578
+ scratch.set(cell, [at]);
579
+ }
580
+ }
581
+ }
582
+ /**
583
+ * Counts the number of edges near the tile (an estimate for deciding the resolution of the grid)
584
+ */
585
+ function countNearEdges(geometry, tileX, tileY, scale, margin) {
586
+ const x0 = tileX / scale - margin;
587
+ const y0 = tileY / scale - margin;
588
+ const x1 = (tileX + 1) / scale + margin;
589
+ const y1 = (tileY + 1) / scale + margin;
590
+ let count = 0;
591
+ for (const path of geometry.paths) {
592
+ const blockCount = path.blocks.length / 4;
593
+ for (let b = 0; b < blockCount; b++) {
594
+ if (path.blocks[b * 4 + 2] < x0 ||
595
+ path.blocks[b * 4] > x1 ||
596
+ path.blocks[b * 4 + 3] < y0 ||
597
+ path.blocks[b * 4 + 1] > y1) {
598
+ continue;
599
+ }
600
+ count += Math.min(DRAPE_BLOCK_EDGES, path.edgeCount - b * DRAPE_BLOCK_EDGES);
601
+ }
602
+ }
603
+ return count;
604
+ }
@@ -0,0 +1,37 @@
1
+ import type { DrapeTerrainTexture, UniformSet } from './shared.js';
2
+ import type { ResolvedTileEdges } from './stitch.js';
3
+ /** The order of the edges (used to assemble the uniform names) */
4
+ export declare const EDGE_NAMES: readonly ["top", "bottom", "left", "right"];
5
+ export type EdgeName = (typeof EDGE_NAMES)[number];
6
+ /**
7
+ * The DEM texture unit per edge (one's own DEM is unit 0)
8
+ *
9
+ * 6 is not used. The DEM atlas (TERRAIN_ATLAS_TEXTURE_UNIT in state.ts) is bound to 6 at the
10
+ * head of the frame and stays there, and every renderer of the vertex displacement path reads
11
+ * it as u_dem_atlas as is. Overwriting it here would make whatever is drawn after the drape
12
+ * rendering (a preview being drawn, dashed lines and so on) look elevations up in a broken
13
+ * texture and fly off screen. 1 to 4 are used by the data textures (renderer.ts) and the
14
+ * contents of the quads (quad.ts).
15
+ */
16
+ export declare const EDGE_UNITS: Record<EdgeName, number>;
17
+ /**
18
+ * The GLSL of the edge constraint (injected into the vertex shader)
19
+ *
20
+ * It goes after TERRAIN_SAMPLE_GLSL (because it uses u_terrain_exaggeration and the upstream DEM
21
+ * functions it carries). The caller
22
+ * obtains the constrained elevation with `drape_edge_constrained(a_pos, ele)`.
23
+ */
24
+ export declare const EDGE_CONSTRAIN_GLSL: string;
25
+ /** The names of the uniforms the edge constraint uses (for getUniformLocation) */
26
+ export declare const EDGE_CONSTRAIN_UNIFORMS: readonly string[];
27
+ /**
28
+ * Writes the uniforms of the edge constraint
29
+ *
30
+ * The step and the DEM are both written from one and the same value (the result of
31
+ * resolveTileEdges). They all come out of the terrain tile state at one and the same instant,
32
+ * so the inconsistency "the DEM is new but the step is old" cannot occur. An edge with no
33
+ * coarse neighbor (an edge that is not constrained) gets one's own DEM at unit scale with a
34
+ * translation of 0. It is never referenced because the step is 0, but leaving an unbound
35
+ * sampler makes the rendering itself fail in some implementations.
36
+ */
37
+ export declare function applyEdgeConstrainUniforms(gl: WebGL2RenderingContext, set: UniformSet, edges: ResolvedTileEdges<DrapeTerrainTexture>, own: DrapeTerrainTexture): void;