@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.
- package/CHANGELOG.md +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* A static R-tree packed into typed arrays (the spatial index of a dataset)
|
|
5
|
+
*
|
|
6
|
+
* The rows are ordered along a Hilbert curve of the centers of their bboxes and grouped bottom up
|
|
7
|
+
* into nodes of a fixed size. The whole tree is three typed arrays, so it is built in one pass
|
|
8
|
+
* without an object per row, and it can be built in a Worker and sent to the main thread without
|
|
9
|
+
* a copy (`prepareDatasetColumnar`). The contents of a dataset are replaced as a
|
|
10
|
+
* whole, so a tree that cannot be updated in place is enough.
|
|
11
|
+
*
|
|
12
|
+
* A pure module: it depends on nothing.
|
|
13
|
+
*/
|
|
14
|
+
/** The number of entries of one node */
|
|
15
|
+
const DEFAULT_NODE_SIZE = 16;
|
|
16
|
+
/** The side of the Hilbert grid the centers are snapped to (2^16 cells) */
|
|
17
|
+
const HILBERT_SIDE = 1 << 16;
|
|
18
|
+
/**
|
|
19
|
+
* Builds a packed R-tree over the bboxes of the rows
|
|
20
|
+
*
|
|
21
|
+
* A row whose bbox is NaN (a row without a geometry) is left out.
|
|
22
|
+
*
|
|
23
|
+
* @param bounds `[minX, minY, maxX, maxY]` per row
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export function buildPackedRTree(bounds, nodeSize = DEFAULT_NODE_SIZE) {
|
|
28
|
+
const rowCount = bounds.length >> 2;
|
|
29
|
+
let numItems = 0;
|
|
30
|
+
for (let row = 0; row < rowCount; row++) {
|
|
31
|
+
if (!Number.isNaN(bounds[row * 4]))
|
|
32
|
+
numItems++;
|
|
33
|
+
}
|
|
34
|
+
// The level structure: leaves, then ceil(n / nodeSize) nodes per level up to a single root
|
|
35
|
+
// (an empty tree has the root alone)
|
|
36
|
+
let n = numItems;
|
|
37
|
+
let numNodes = n;
|
|
38
|
+
const levels = [n];
|
|
39
|
+
do {
|
|
40
|
+
n = Math.max(1, Math.ceil(n / nodeSize));
|
|
41
|
+
numNodes += n;
|
|
42
|
+
levels.push(numNodes);
|
|
43
|
+
} while (n !== 1);
|
|
44
|
+
const boxes = new Float64Array(numNodes * 4);
|
|
45
|
+
const indices = new Int32Array(numNodes);
|
|
46
|
+
const levelBounds = Int32Array.from(levels);
|
|
47
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
48
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
49
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
50
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
51
|
+
let leaf = 0;
|
|
52
|
+
for (let row = 0; row < rowCount; row++) {
|
|
53
|
+
const at = row * 4;
|
|
54
|
+
if (Number.isNaN(bounds[at]))
|
|
55
|
+
continue;
|
|
56
|
+
boxes[leaf * 4] = bounds[at];
|
|
57
|
+
boxes[leaf * 4 + 1] = bounds[at + 1];
|
|
58
|
+
boxes[leaf * 4 + 2] = bounds[at + 2];
|
|
59
|
+
boxes[leaf * 4 + 3] = bounds[at + 3];
|
|
60
|
+
indices[leaf] = row;
|
|
61
|
+
if (bounds[at] < minX)
|
|
62
|
+
minX = bounds[at];
|
|
63
|
+
if (bounds[at + 1] < minY)
|
|
64
|
+
minY = bounds[at + 1];
|
|
65
|
+
if (bounds[at + 2] > maxX)
|
|
66
|
+
maxX = bounds[at + 2];
|
|
67
|
+
if (bounds[at + 3] > maxY)
|
|
68
|
+
maxY = bounds[at + 3];
|
|
69
|
+
leaf++;
|
|
70
|
+
}
|
|
71
|
+
if (numItems === 0) {
|
|
72
|
+
// An empty tree: a root that nothing intersects
|
|
73
|
+
boxes.set([
|
|
74
|
+
Number.POSITIVE_INFINITY,
|
|
75
|
+
Number.POSITIVE_INFINITY,
|
|
76
|
+
Number.NEGATIVE_INFINITY,
|
|
77
|
+
Number.NEGATIVE_INFINITY,
|
|
78
|
+
]);
|
|
79
|
+
return { nodeSize, numItems, boxes, indices, levelBounds };
|
|
80
|
+
}
|
|
81
|
+
if (numItems > nodeSize) {
|
|
82
|
+
// Order the leaves along the Hilbert curve of their centers
|
|
83
|
+
const width = maxX - minX || 1;
|
|
84
|
+
const height = maxY - minY || 1;
|
|
85
|
+
const values = new Float64Array(numItems);
|
|
86
|
+
const scale = HILBERT_SIDE - 1;
|
|
87
|
+
for (let i = 0; i < numItems; i++) {
|
|
88
|
+
const cx = (boxes[i * 4] + boxes[i * 4 + 2]) / 2;
|
|
89
|
+
const cy = (boxes[i * 4 + 1] + boxes[i * 4 + 3]) / 2;
|
|
90
|
+
const x = Math.floor((scale * (cx - minX)) / width);
|
|
91
|
+
const y = Math.floor((scale * (cy - minY)) / height);
|
|
92
|
+
values[i] = hilbertIndex(x, y);
|
|
93
|
+
}
|
|
94
|
+
sortLeaves(values, boxes, indices, 0, numItems - 1, nodeSize);
|
|
95
|
+
}
|
|
96
|
+
// Build the nodes level by level, bottom up
|
|
97
|
+
let pos = 0;
|
|
98
|
+
let write = numItems;
|
|
99
|
+
for (let level = 0; level < levelBounds.length - 1; level++) {
|
|
100
|
+
const end = levelBounds[level];
|
|
101
|
+
while (pos < end) {
|
|
102
|
+
const first = pos;
|
|
103
|
+
let nodeMinX = Number.POSITIVE_INFINITY;
|
|
104
|
+
let nodeMinY = Number.POSITIVE_INFINITY;
|
|
105
|
+
let nodeMaxX = Number.NEGATIVE_INFINITY;
|
|
106
|
+
let nodeMaxY = Number.NEGATIVE_INFINITY;
|
|
107
|
+
for (let j = 0; j < nodeSize && pos < end; j++, pos++) {
|
|
108
|
+
if (boxes[pos * 4] < nodeMinX)
|
|
109
|
+
nodeMinX = boxes[pos * 4];
|
|
110
|
+
if (boxes[pos * 4 + 1] < nodeMinY)
|
|
111
|
+
nodeMinY = boxes[pos * 4 + 1];
|
|
112
|
+
if (boxes[pos * 4 + 2] > nodeMaxX)
|
|
113
|
+
nodeMaxX = boxes[pos * 4 + 2];
|
|
114
|
+
if (boxes[pos * 4 + 3] > nodeMaxY)
|
|
115
|
+
nodeMaxY = boxes[pos * 4 + 3];
|
|
116
|
+
}
|
|
117
|
+
boxes[write * 4] = nodeMinX;
|
|
118
|
+
boxes[write * 4 + 1] = nodeMinY;
|
|
119
|
+
boxes[write * 4 + 2] = nodeMaxX;
|
|
120
|
+
boxes[write * 4 + 3] = nodeMaxY;
|
|
121
|
+
indices[write] = first;
|
|
122
|
+
write++;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return { nodeSize, numItems, boxes, indices, levelBounds };
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Returns the rows whose bbox intersects the box (the edges count as intersecting), in no
|
|
129
|
+
* particular order
|
|
130
|
+
*
|
|
131
|
+
* @param out The array the rows are appended to
|
|
132
|
+
*
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
export function searchPackedRTree(tree, minX, minY, maxX, maxY, out = []) {
|
|
136
|
+
const { boxes, indices, levelBounds, nodeSize, numItems } = tree;
|
|
137
|
+
if (numItems === 0)
|
|
138
|
+
return out;
|
|
139
|
+
const queue = [];
|
|
140
|
+
let node = levelBounds[levelBounds.length - 1] - 1;
|
|
141
|
+
while (node !== undefined) {
|
|
142
|
+
const end = Math.min(node + nodeSize, levelEnd(levelBounds, node));
|
|
143
|
+
for (let pos = node; pos < end; pos++) {
|
|
144
|
+
const at = pos * 4;
|
|
145
|
+
if (maxX < boxes[at] ||
|
|
146
|
+
maxY < boxes[at + 1] ||
|
|
147
|
+
minX > boxes[at + 2] ||
|
|
148
|
+
minY > boxes[at + 3]) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
if (node < numItems)
|
|
152
|
+
out.push(indices[pos]);
|
|
153
|
+
else
|
|
154
|
+
queue.push(indices[pos]);
|
|
155
|
+
}
|
|
156
|
+
node = queue.pop();
|
|
157
|
+
}
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
/** The end of the level that the position belongs to */
|
|
161
|
+
function levelEnd(levelBounds, position) {
|
|
162
|
+
let lo = 0;
|
|
163
|
+
let hi = levelBounds.length - 1;
|
|
164
|
+
while (lo < hi) {
|
|
165
|
+
const mid = (lo + hi) >> 1;
|
|
166
|
+
if (levelBounds[mid] > position)
|
|
167
|
+
hi = mid;
|
|
168
|
+
else
|
|
169
|
+
lo = mid + 1;
|
|
170
|
+
}
|
|
171
|
+
return levelBounds[lo];
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* The distance along the Hilbert curve of a cell of the 2^16 grid
|
|
175
|
+
*/
|
|
176
|
+
function hilbertIndex(cellX, cellY) {
|
|
177
|
+
let x = cellX;
|
|
178
|
+
let y = cellY;
|
|
179
|
+
let d = 0;
|
|
180
|
+
for (let s = HILBERT_SIDE >> 1; s > 0; s >>= 1) {
|
|
181
|
+
const rx = (x & s) > 0 ? 1 : 0;
|
|
182
|
+
const ry = (y & s) > 0 ? 1 : 0;
|
|
183
|
+
d += s * s * ((3 * rx) ^ ry);
|
|
184
|
+
if (ry === 0) {
|
|
185
|
+
if (rx === 1) {
|
|
186
|
+
x = HILBERT_SIDE - 1 - x;
|
|
187
|
+
y = HILBERT_SIDE - 1 - y;
|
|
188
|
+
}
|
|
189
|
+
const t = x;
|
|
190
|
+
x = y;
|
|
191
|
+
y = t;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return d;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Sorts the leaves by their Hilbert value (quicksort on the parallel arrays)
|
|
198
|
+
*
|
|
199
|
+
* The order only matters between nodes, so a range that falls within one node is left as it is.
|
|
200
|
+
*/
|
|
201
|
+
function sortLeaves(values, boxes, indices, left, right, nodeSize) {
|
|
202
|
+
let lo = left;
|
|
203
|
+
let hi = right;
|
|
204
|
+
while (Math.floor(lo / nodeSize) < Math.floor(hi / nodeSize)) {
|
|
205
|
+
const pivot = values[(lo + hi) >> 1];
|
|
206
|
+
let i = lo - 1;
|
|
207
|
+
let j = hi + 1;
|
|
208
|
+
while (true) {
|
|
209
|
+
do
|
|
210
|
+
i++;
|
|
211
|
+
while (values[i] < pivot);
|
|
212
|
+
do
|
|
213
|
+
j--;
|
|
214
|
+
while (values[j] > pivot);
|
|
215
|
+
if (i >= j)
|
|
216
|
+
break;
|
|
217
|
+
swapLeaves(values, boxes, indices, i, j);
|
|
218
|
+
}
|
|
219
|
+
// Recurse into the smaller side, loop on the larger one (the stack stays shallow)
|
|
220
|
+
if (j - lo < hi - j) {
|
|
221
|
+
sortLeaves(values, boxes, indices, lo, j, nodeSize);
|
|
222
|
+
lo = j + 1;
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
sortLeaves(values, boxes, indices, j + 1, hi, nodeSize);
|
|
226
|
+
hi = j;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function swapLeaves(values, boxes, indices, i, j) {
|
|
231
|
+
const value = values[i];
|
|
232
|
+
values[i] = values[j];
|
|
233
|
+
values[j] = value;
|
|
234
|
+
const index = indices[i];
|
|
235
|
+
indices[i] = indices[j];
|
|
236
|
+
indices[j] = index;
|
|
237
|
+
const a = i * 4;
|
|
238
|
+
const b = j * 4;
|
|
239
|
+
for (let k = 0; k < 4; k++) {
|
|
240
|
+
const box = boxes[a + k];
|
|
241
|
+
boxes[a + k] = boxes[b + k];
|
|
242
|
+
boxes[b + k] = box;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* The splitting of the rows of a dataset into spatial chunks
|
|
5
|
+
*
|
|
6
|
+
* A pure function over typed arrays: it depends on neither the features, nor maplibre, nor
|
|
7
|
+
* WebGL, so it runs in a Worker as well (`prepareDatasetColumnar` calls it there). Both kinds of
|
|
8
|
+
* contents use it: the features (`chunk.ts` computes the per-row arrays from them) and the
|
|
9
|
+
* columnar input (`columnar/prepare.ts`).
|
|
10
|
+
*
|
|
11
|
+
* The rule: the rows are cut in half at the median of the centers of their bboxes (the way a k-d
|
|
12
|
+
* tree is built) until a range holds at most the target number of rows and the target number of
|
|
13
|
+
* vertices. Within a chunk the rows keep their original order (the draw order), and the chunks
|
|
14
|
+
* are ordered by the first row they hold.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Target number of features per chunk
|
|
18
|
+
*
|
|
19
|
+
* A chunk is also "the unit of work built in one frame". With terrain, building a chunk includes
|
|
20
|
+
* the subdivision and takes 0.2 to 0.5 seconds for 500 features (measured). Lowering the count
|
|
21
|
+
* makes the hitch per frame smaller at the cost of more draw calls. 96 was taken from "about
|
|
22
|
+
* 50 ms per chunk with terrain" (it was lowered from 192 because building got heavier once the
|
|
23
|
+
* step was matched to the real mesh of the tiles).
|
|
24
|
+
*
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
export const CHUNK_TARGET_SIZE = 96;
|
|
28
|
+
/**
|
|
29
|
+
* Target number of vertices per chunk
|
|
30
|
+
*
|
|
31
|
+
* Cutting by the count alone lets a single feature such as a municipal boundary with 130,000
|
|
32
|
+
* vertices bring in the work of dozens of features. Measured, building the chunk that contained
|
|
33
|
+
* that one feature (63 features, 226,000 vertices in total) took 1.4 seconds even with the
|
|
34
|
+
* terrain off. A chunk is "the unit of work built in one frame", so it is cut by the number of
|
|
35
|
+
* vertices as well.
|
|
36
|
+
*
|
|
37
|
+
* 40,000 was taken from "about 0.2 seconds per chunk with the terrain off". A feature that
|
|
38
|
+
* exceeds it on its own cannot be split any further, so it becomes a chunk of that one feature.
|
|
39
|
+
*
|
|
40
|
+
* @internal
|
|
41
|
+
*/
|
|
42
|
+
export const CHUNK_TARGET_VERTICES = 40000;
|
|
43
|
+
/**
|
|
44
|
+
* Target number of features per chunk for a large dataset
|
|
45
|
+
*
|
|
46
|
+
* @internal
|
|
47
|
+
*/
|
|
48
|
+
export const LARGE_CHUNK_TARGET_SIZE = 4096;
|
|
49
|
+
/**
|
|
50
|
+
* The count at which the target number is raised
|
|
51
|
+
*
|
|
52
|
+
* @internal
|
|
53
|
+
*/
|
|
54
|
+
export const LARGE_DATASET_THRESHOLD = 50000;
|
|
55
|
+
/**
|
|
56
|
+
* Returns the target number of features per chunk for the total count of a dataset
|
|
57
|
+
*
|
|
58
|
+
* A chunk is also the unit of drawing, so as their number grows, "switching the program and
|
|
59
|
+
* setting the uniforms" happens that many times per frame. Cutting 260,000 features in steps of
|
|
60
|
+
* 512 gives several hundred visible chunks, and that procedure costs more than the drawing
|
|
61
|
+
* itself.
|
|
62
|
+
*
|
|
63
|
+
* The culling gets coarser, but the bbox intersection of a chunk is cheap per frame and, coarse
|
|
64
|
+
* or not, the total number of vertices the GPU processes does not change (the vertices outside
|
|
65
|
+
* the screen are dropped at the clipping stage). The target number is therefore raised for a
|
|
66
|
+
* large dataset.
|
|
67
|
+
*
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
export function chunkTargetSizeFor(count) {
|
|
71
|
+
return count > LARGE_DATASET_THRESHOLD ? LARGE_CHUNK_TARGET_SIZE : CHUNK_TARGET_SIZE;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Splits the rows into spatial chunks
|
|
75
|
+
*
|
|
76
|
+
* A row whose bbox is NaN (a row without a geometry) is left out.
|
|
77
|
+
*
|
|
78
|
+
* It used to be "cut the whole bbox into a grid and assign a feature to the cell its bbox center
|
|
79
|
+
* falls into". That form breaks as soon as a single extremely wide feature (the outline of a
|
|
80
|
+
* whole country, a feature crossing the date line) is mixed in. The whole bbox grows to the size
|
|
81
|
+
* of the world because of that one feature, and so do the cells of the grid, so everything else
|
|
82
|
+
* falls into a single cell. Cutting at the median evens out the counts regardless of the
|
|
83
|
+
* distribution. An outlier goes into its own side as a single row and does not distort the rest
|
|
84
|
+
* of the splitting.
|
|
85
|
+
*
|
|
86
|
+
* @param bounds The bboxes, `[minX, minY, maxX, maxY]` per row
|
|
87
|
+
* @param vertexCounts The number of vertices per row (the estimate of the work)
|
|
88
|
+
* @param targetSize The target number of rows per chunk (decided from the number of rows with a
|
|
89
|
+
* geometry when omitted)
|
|
90
|
+
*
|
|
91
|
+
* @internal
|
|
92
|
+
*/
|
|
93
|
+
export function partitionRows(bounds, vertexCounts, targetSize) {
|
|
94
|
+
const rowCount = bounds.length >> 2;
|
|
95
|
+
const order = new Int32Array(rowCount);
|
|
96
|
+
let count = 0;
|
|
97
|
+
for (let row = 0; row < rowCount; row++) {
|
|
98
|
+
if (!Number.isNaN(bounds[row * 4]))
|
|
99
|
+
order[count++] = row;
|
|
100
|
+
}
|
|
101
|
+
if (count === 0) {
|
|
102
|
+
return { rows: new Int32Array(0), offsets: new Int32Array(1), bounds: new Float64Array(0) };
|
|
103
|
+
}
|
|
104
|
+
const target = targetSize ?? chunkTargetSizeFor(count);
|
|
105
|
+
const centerX = new Float64Array(rowCount);
|
|
106
|
+
const centerY = new Float64Array(rowCount);
|
|
107
|
+
for (let i = 0; i < count; i++) {
|
|
108
|
+
const at = order[i] * 4;
|
|
109
|
+
centerX[order[i]] = (bounds[at] + bounds[at + 2]) / 2;
|
|
110
|
+
centerY[order[i]] = (bounds[at + 1] + bounds[at + 3]) / 2;
|
|
111
|
+
}
|
|
112
|
+
/** The ranges of `order` that became chunks */
|
|
113
|
+
const ranges = [];
|
|
114
|
+
splitRange(0, count);
|
|
115
|
+
// Put the rows of each chunk back into the draw order, then order the chunks by their first row
|
|
116
|
+
for (const [from, to] of ranges)
|
|
117
|
+
order.subarray(from, to).sort();
|
|
118
|
+
ranges.sort((a, b) => order[a[0]] - order[b[0]]);
|
|
119
|
+
const rows = new Int32Array(count);
|
|
120
|
+
const offsets = new Int32Array(ranges.length + 1);
|
|
121
|
+
const chunkBounds = new Float64Array(ranges.length * 4);
|
|
122
|
+
let written = 0;
|
|
123
|
+
for (let c = 0; c < ranges.length; c++) {
|
|
124
|
+
const [from, to] = ranges[c];
|
|
125
|
+
offsets[c] = written;
|
|
126
|
+
let minX = Number.POSITIVE_INFINITY;
|
|
127
|
+
let minY = Number.POSITIVE_INFINITY;
|
|
128
|
+
let maxX = Number.NEGATIVE_INFINITY;
|
|
129
|
+
let maxY = Number.NEGATIVE_INFINITY;
|
|
130
|
+
for (let i = from; i < to; i++) {
|
|
131
|
+
const row = order[i];
|
|
132
|
+
rows[written++] = row;
|
|
133
|
+
const at = row * 4;
|
|
134
|
+
if (bounds[at] < minX)
|
|
135
|
+
minX = bounds[at];
|
|
136
|
+
if (bounds[at + 1] < minY)
|
|
137
|
+
minY = bounds[at + 1];
|
|
138
|
+
if (bounds[at + 2] > maxX)
|
|
139
|
+
maxX = bounds[at + 2];
|
|
140
|
+
if (bounds[at + 3] > maxY)
|
|
141
|
+
maxY = bounds[at + 3];
|
|
142
|
+
}
|
|
143
|
+
chunkBounds[c * 4] = minX;
|
|
144
|
+
chunkBounds[c * 4 + 1] = minY;
|
|
145
|
+
chunkBounds[c * 4 + 2] = maxX;
|
|
146
|
+
chunkBounds[c * 4 + 3] = maxY;
|
|
147
|
+
}
|
|
148
|
+
offsets[ranges.length] = written;
|
|
149
|
+
return { rows, offsets, bounds: chunkBounds };
|
|
150
|
+
/**
|
|
151
|
+
* Cuts the range [from, to) at the median down to the target count
|
|
152
|
+
*/
|
|
153
|
+
function splitRange(from, to) {
|
|
154
|
+
const size = to - from;
|
|
155
|
+
if (size <= 1) {
|
|
156
|
+
ranges.push([from, to]);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
let vertices = 0;
|
|
160
|
+
for (let i = from; i < to; i++)
|
|
161
|
+
vertices += vertexCounts[order[i]];
|
|
162
|
+
if (size <= target && vertices <= CHUNK_TARGET_VERTICES) {
|
|
163
|
+
ranges.push([from, to]);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Cut along the axis with the larger extent
|
|
167
|
+
let minCX = Number.POSITIVE_INFINITY;
|
|
168
|
+
let maxCX = Number.NEGATIVE_INFINITY;
|
|
169
|
+
let minCY = Number.POSITIVE_INFINITY;
|
|
170
|
+
let maxCY = Number.NEGATIVE_INFINITY;
|
|
171
|
+
for (let i = from; i < to; i++) {
|
|
172
|
+
const row = order[i];
|
|
173
|
+
if (centerX[row] < minCX)
|
|
174
|
+
minCX = centerX[row];
|
|
175
|
+
if (centerX[row] > maxCX)
|
|
176
|
+
maxCX = centerX[row];
|
|
177
|
+
if (centerY[row] < minCY)
|
|
178
|
+
minCY = centerY[row];
|
|
179
|
+
if (centerY[row] > maxCY)
|
|
180
|
+
maxCY = centerY[row];
|
|
181
|
+
}
|
|
182
|
+
// If the centers are concentrated at a single point, cutting does not separate them (it only
|
|
183
|
+
// adds chunks with the same bbox), so it stops there
|
|
184
|
+
if (maxCX === minCX && maxCY === minCY) {
|
|
185
|
+
ranges.push([from, to]);
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const axis = maxCX - minCX >= maxCY - minCY ? centerX : centerY;
|
|
189
|
+
const mid = from + (size >> 1);
|
|
190
|
+
selectNth(axis, from, to, mid);
|
|
191
|
+
splitRange(from, mid);
|
|
192
|
+
splitRange(mid, to);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Rearranges the range so that the element at mid becomes the median (quickselect)
|
|
196
|
+
*/
|
|
197
|
+
function selectNth(axis, from, to, nth) {
|
|
198
|
+
let lo = from;
|
|
199
|
+
let hi = to - 1;
|
|
200
|
+
while (lo < hi) {
|
|
201
|
+
// The middle value is used as the pivot (so that sorted input does not hit the worst case)
|
|
202
|
+
const pivot = axis[order[(lo + hi) >> 1]];
|
|
203
|
+
let i = lo;
|
|
204
|
+
let j = hi;
|
|
205
|
+
while (i <= j) {
|
|
206
|
+
while (axis[order[i]] < pivot)
|
|
207
|
+
i++;
|
|
208
|
+
while (axis[order[j]] > pivot)
|
|
209
|
+
j--;
|
|
210
|
+
if (i <= j) {
|
|
211
|
+
const swap = order[i];
|
|
212
|
+
order[i] = order[j];
|
|
213
|
+
order[j] = swap;
|
|
214
|
+
i++;
|
|
215
|
+
j--;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (nth <= j)
|
|
219
|
+
hi = j;
|
|
220
|
+
else if (nth >= i)
|
|
221
|
+
lo = i;
|
|
222
|
+
else
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|