@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,24 @@
|
|
|
1
|
+
import { type TessellationStep } from '../view/terrain/tessellation.js';
|
|
2
|
+
import { type DisplayChunk } from './chunk.js';
|
|
3
|
+
/**
|
|
4
|
+
* Whether this chunk has to be re-baked
|
|
5
|
+
*
|
|
6
|
+
* The decision is a single fingerprint of the tile composition. The fingerprint contains "the
|
|
7
|
+
* zoom composition of the tiles that cover its patch", "the coarsening factor" and "the relation
|
|
8
|
+
* to the region of the subdivision" (tilingSignature in view/terrain/tiling.ts).
|
|
9
|
+
*
|
|
10
|
+
* Moving the camera changes the zoom of the tiles used in the distance. Since the step is matched
|
|
11
|
+
* to the real mesh of the tiles, a surface already baked is stale once the composition changes.
|
|
12
|
+
* This was the truth behind the observation that the geometry is correct and yet "it is clean
|
|
13
|
+
* only right after a reload, and reaching the same place by panning or zooming shows dotted
|
|
14
|
+
* punch-through and seams on the ridges and the valleys".
|
|
15
|
+
*
|
|
16
|
+
* Conversely, nothing is re-baked while the composition is the same. Re-baking every chunk just
|
|
17
|
+
* because the region shifted or the zoom moved slightly would give a frame of several hundred
|
|
18
|
+
* milliseconds on every pan.
|
|
19
|
+
*/
|
|
20
|
+
export declare function needsRetessellation(state: {
|
|
21
|
+
builtGrid: number;
|
|
22
|
+
builtTilingKey: string | null;
|
|
23
|
+
chunk: DisplayChunk;
|
|
24
|
+
}, step: TessellationStep | null): boolean;
|
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { resolvePixelRatio } from '../shared/utils/pixel-ratio.js';
|
|
4
|
+
import { getSurfaceTessellationStep } from '../view/globe-subdivision.js';
|
|
5
|
+
import { boundsCenter, rebasedRetainedOrigin } from '../view/shaders/retained-origin.js';
|
|
6
|
+
import { getAnchorElevationGeneration } from '../view/terrain/anchor.js';
|
|
7
|
+
import { isTerrainCameraMoving, reportTerrainCoarsening } from '../view/terrain/state.js';
|
|
8
|
+
import { mercatorX, mercatorY } from '../view/terrain/tessellation.js';
|
|
9
|
+
import { tilingSignature } from '../view/terrain/tiling.js';
|
|
10
|
+
import { boundsIntersect } from './chunk.js';
|
|
11
|
+
import { createChunkBuildJob, disposeChunkBatches, drawChunkBatches, rebuildChunkPoints, } from './retained.js';
|
|
12
|
+
import { sameRowsInMasks } from './thinning.js';
|
|
13
|
+
import { createChunkTriangulator, globalTriangulationScheduler, } from './triangulation.js';
|
|
14
|
+
/**
|
|
15
|
+
* Whether this chunk has to be re-baked
|
|
16
|
+
*
|
|
17
|
+
* The decision is a single fingerprint of the tile composition. The fingerprint contains "the
|
|
18
|
+
* zoom composition of the tiles that cover its patch", "the coarsening factor" and "the relation
|
|
19
|
+
* to the region of the subdivision" (tilingSignature in view/terrain/tiling.ts).
|
|
20
|
+
*
|
|
21
|
+
* Moving the camera changes the zoom of the tiles used in the distance. Since the step is matched
|
|
22
|
+
* to the real mesh of the tiles, a surface already baked is stale once the composition changes.
|
|
23
|
+
* This was the truth behind the observation that the geometry is correct and yet "it is clean
|
|
24
|
+
* only right after a reload, and reaching the same place by panning or zooming shows dotted
|
|
25
|
+
* punch-through and seams on the ridges and the valleys".
|
|
26
|
+
*
|
|
27
|
+
* Conversely, nothing is re-baked while the composition is the same. Re-baking every chunk just
|
|
28
|
+
* because the region shifted or the zoom moved slightly would give a frame of several hundred
|
|
29
|
+
* milliseconds on every pan.
|
|
30
|
+
*/
|
|
31
|
+
export function needsRetessellation(state, step) {
|
|
32
|
+
if (!step)
|
|
33
|
+
return false;
|
|
34
|
+
// A shape baked uncut (no terrain, no globe) is re-baked once the terrain is alive or the globe
|
|
35
|
+
// is drawn
|
|
36
|
+
if (state.builtGrid <= 0)
|
|
37
|
+
return true;
|
|
38
|
+
return state.builtTilingKey !== chunkTilingKey(state.chunk, step);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Fingerprint of the tile composition that covers the patch of a chunk
|
|
42
|
+
*/
|
|
43
|
+
function chunkTilingKey(chunk, step) {
|
|
44
|
+
const bounds = chunk.bounds;
|
|
45
|
+
return tilingSignature(step.tiling ?? null, step.region ?? null, step.coarsen && step.coarsen > 1 ? step.coarsen : 1, step.grid, mercatorX(bounds.minX),
|
|
46
|
+
// The mercator y decreases as the latitude increases
|
|
47
|
+
mercatorY(bounds.maxY), mercatorX(bounds.maxX), mercatorY(bounds.minY));
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Time that may be spent building the retained batches in one frame (milliseconds)
|
|
51
|
+
*
|
|
52
|
+
* The weight of building a chunk changes by orders of magnitude with its contents. With terrain
|
|
53
|
+
* the work of cutting the surfaces along the grid of the terrain mesh is added, and without it
|
|
54
|
+
* there is still earcut and the packing of the arrays. Slicing by the number of features would
|
|
55
|
+
* make it wait for nothing when it is light and blow a frame with a single chunk when it is
|
|
56
|
+
* heavy.
|
|
57
|
+
*
|
|
58
|
+
* It is therefore sliced by "the time spent". What exceeds the budget is deferred to the next
|
|
59
|
+
* frame and the chunks not built yet appear over several frames (looking the same as tiles
|
|
60
|
+
* arriving one after another). A chunk whose step has merely gone stale keeps drawing the
|
|
61
|
+
* retained batch of the previous step until it is re-baked.
|
|
62
|
+
*
|
|
63
|
+
* Building everything without a budget made a single frame reach 3.2 seconds (terrain off) to
|
|
64
|
+
* over 30 seconds (terrain on) on this map (8,172 administrative boundaries, 64 chunks).
|
|
65
|
+
* Exactly one chunk is always built (progress is made even with a budget of 0).
|
|
66
|
+
*
|
|
67
|
+
* A host that draws a frame to read it back turns the time slicing off (`buildBudgetMs` of the
|
|
68
|
+
* host is then infinite): every chunk in view is built in the frame.
|
|
69
|
+
*/
|
|
70
|
+
const CHUNK_BUILD_BUDGET_MS = 12;
|
|
71
|
+
/**
|
|
72
|
+
* A monotonic clock (it works even when the test environment has no performance)
|
|
73
|
+
*/
|
|
74
|
+
function nowMs() {
|
|
75
|
+
return typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The retained chunks of one dataset
|
|
79
|
+
*
|
|
80
|
+
* @internal
|
|
81
|
+
*/
|
|
82
|
+
export class DisplayChunkSet {
|
|
83
|
+
constructor(host) {
|
|
84
|
+
Object.defineProperty(this, "host", {
|
|
85
|
+
enumerable: true,
|
|
86
|
+
configurable: true,
|
|
87
|
+
writable: true,
|
|
88
|
+
value: host
|
|
89
|
+
});
|
|
90
|
+
/** The chunks (in draw order) */
|
|
91
|
+
Object.defineProperty(this, "chunks", {
|
|
92
|
+
enumerable: true,
|
|
93
|
+
configurable: true,
|
|
94
|
+
writable: true,
|
|
95
|
+
value: []
|
|
96
|
+
});
|
|
97
|
+
/**
|
|
98
|
+
* The full set of renderers used in the most recent draw
|
|
99
|
+
*
|
|
100
|
+
* It is remembered so that the GPU resources can be released on dispose and when the layer is
|
|
101
|
+
* disposed.
|
|
102
|
+
*/
|
|
103
|
+
Object.defineProperty(this, "renderers", {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
configurable: true,
|
|
106
|
+
writable: true,
|
|
107
|
+
value: null
|
|
108
|
+
});
|
|
109
|
+
/** The devicePixelRatio the retained batches were built with (null when not built) */
|
|
110
|
+
Object.defineProperty(this, "builtDevicePixelRatio", {
|
|
111
|
+
enumerable: true,
|
|
112
|
+
configurable: true,
|
|
113
|
+
writable: true,
|
|
114
|
+
value: null
|
|
115
|
+
});
|
|
116
|
+
/** The generation of the anchor elevation baked into the retained batches (-1 = not yet) */
|
|
117
|
+
Object.defineProperty(this, "builtAnchorElevationGeneration", {
|
|
118
|
+
enumerable: true,
|
|
119
|
+
configurable: true,
|
|
120
|
+
writable: true,
|
|
121
|
+
value: -1
|
|
122
|
+
});
|
|
123
|
+
/**
|
|
124
|
+
* Generation of the set of features
|
|
125
|
+
*
|
|
126
|
+
* The completion notification of the triangulation arrives seconds or tens of seconds later.
|
|
127
|
+
* If the contents have been replaced by then (if the generation has advanced), nothing is done.
|
|
128
|
+
*/
|
|
129
|
+
Object.defineProperty(this, "featuresGeneration", {
|
|
130
|
+
enumerable: true,
|
|
131
|
+
configurable: true,
|
|
132
|
+
writable: true,
|
|
133
|
+
value: 0
|
|
134
|
+
});
|
|
135
|
+
Object.defineProperty(this, "disposed", {
|
|
136
|
+
enumerable: true,
|
|
137
|
+
configurable: true,
|
|
138
|
+
writable: true,
|
|
139
|
+
value: false
|
|
140
|
+
});
|
|
141
|
+
/** Whether the most recent draw left a chunk unbuilt */
|
|
142
|
+
Object.defineProperty(this, "lastPending", {
|
|
143
|
+
enumerable: true,
|
|
144
|
+
configurable: true,
|
|
145
|
+
writable: true,
|
|
146
|
+
value: false
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
/** Generation of the set of features (advances on every `replace`) */
|
|
150
|
+
get generation() {
|
|
151
|
+
return this.featuresGeneration;
|
|
152
|
+
}
|
|
153
|
+
/** The renderers used in the most recent draw (null before the first draw or after release) */
|
|
154
|
+
get retainedRenderers() {
|
|
155
|
+
return this.renderers;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Whether the most recent draw left a chunk unbuilt (a later frame builds it)
|
|
159
|
+
*
|
|
160
|
+
* It stays true while the chunks are being built over several frames and turns false at the
|
|
161
|
+
* first frame that leaves nothing unbuilt, so a caller can tell when everything is drawn.
|
|
162
|
+
*/
|
|
163
|
+
get hasPendingBuild() {
|
|
164
|
+
return this.lastPending;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Takes new contents split into chunks (the old chunks and their GPU resources are released)
|
|
168
|
+
*
|
|
169
|
+
* @param chunks The spatial chunks of the contents (in draw order)
|
|
170
|
+
*/
|
|
171
|
+
replace(chunks) {
|
|
172
|
+
this.disposeChunks();
|
|
173
|
+
this.featuresGeneration++;
|
|
174
|
+
this.lastPending = chunks.length > 0;
|
|
175
|
+
this.chunks = chunks.map((chunk) => ({
|
|
176
|
+
chunk,
|
|
177
|
+
batches: null,
|
|
178
|
+
job: null,
|
|
179
|
+
jobGrid: 0,
|
|
180
|
+
jobTilingKey: null,
|
|
181
|
+
builtGrid: 0,
|
|
182
|
+
builtTilingKey: null,
|
|
183
|
+
builtDraped: false,
|
|
184
|
+
jobDraped: false,
|
|
185
|
+
origin: null,
|
|
186
|
+
jobOrigin: null,
|
|
187
|
+
viewOrigin: null,
|
|
188
|
+
onTriangulated: null,
|
|
189
|
+
pointsMask: null,
|
|
190
|
+
jobMask: null,
|
|
191
|
+
}));
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Draws the chunks that intersect the viewport
|
|
195
|
+
*
|
|
196
|
+
* It only draws the retained batches of the chunks that intersect (building them the first time
|
|
197
|
+
* when necessary). The features that cannot be retained are sent to the immediate-mode path per
|
|
198
|
+
* chunk.
|
|
199
|
+
*/
|
|
200
|
+
draw(frame) {
|
|
201
|
+
const { target, renderers, terrain, projectionData, zoom, bounds, factors } = frame;
|
|
202
|
+
this.renderers = renderers;
|
|
203
|
+
this.syncDevicePixelRatio();
|
|
204
|
+
this.syncAnchorElevationGeneration(terrain);
|
|
205
|
+
// The building of the retained batches is limited to one chunk in this frame (the build
|
|
206
|
+
// budget of a frame, see the time budget above). While the camera is moving, the old step keeps
|
|
207
|
+
// being drawn and the re-bake is deferred (it would be redone anyway once the movement ends).
|
|
208
|
+
// A limit on the slices is needed only when there is terrain. Without terrain, building is
|
|
209
|
+
// just earcut and the packing of the arrays, and building every visible chunk at once takes a
|
|
210
|
+
// few milliseconds (the behaviour before is kept).
|
|
211
|
+
// The step of the terrain, or on the globe the cell of its fills
|
|
212
|
+
const step = getSurfaceTessellationStep(terrain, 'fill');
|
|
213
|
+
const drapedFills = this.host.drapedFills();
|
|
214
|
+
const drawn = this.host.drawnRows();
|
|
215
|
+
const budget = this.host.buildBudgetMs ?? CHUNK_BUILD_BUDGET_MS;
|
|
216
|
+
const budgetStart = nowMs();
|
|
217
|
+
let builtHere = 0;
|
|
218
|
+
/** Whether more may still be built in this frame (at least one is built) */
|
|
219
|
+
const canBuild = () => builtHere === 0 || nowMs() - budgetStart < budget;
|
|
220
|
+
const settled = !isTerrainCameraMoving(terrain);
|
|
221
|
+
/** Whether anything is left over (the next frame is requested by itself) */
|
|
222
|
+
let pending = false;
|
|
223
|
+
for (const state of this.chunks) {
|
|
224
|
+
if (!boundsIntersect(state.chunk.bounds, bounds))
|
|
225
|
+
continue;
|
|
226
|
+
// Whether a rebuild is needed. If it is, a job is started and advanced by the budget of the
|
|
227
|
+
// frame. The batches of the previous version keep being drawn until the job finishes, so
|
|
228
|
+
// even a large surface covering the view does not stall a frame and the picture being drawn
|
|
229
|
+
// is not missing anything.
|
|
230
|
+
// A chunk whose way of handing over the polygons and lines changed is re-baked as well (the
|
|
231
|
+
// analytic drape being switched on or off)
|
|
232
|
+
// A chunk seen far from its origin at high zoom is built again around the view (the batches
|
|
233
|
+
// it has keep being drawn until then)
|
|
234
|
+
const rebased = state.batches !== null && !state.job
|
|
235
|
+
? rebasedRetainedOrigin(chunkOrigin(state), state.chunk.bounds, bounds, zoom)
|
|
236
|
+
: null;
|
|
237
|
+
if (rebased)
|
|
238
|
+
state.viewOrigin = rebased;
|
|
239
|
+
const stale = state.batches !== null &&
|
|
240
|
+
(needsRetessellation(state, step) || state.builtDraped !== drapedFills || rebased !== null);
|
|
241
|
+
// Building a new chunk is also deferred until the camera stops (treated the same as a
|
|
242
|
+
// re-bake). Zooming out lets new chunks enter all at once as the view widens (137 of them
|
|
243
|
+
// measured), and a build of 20 to 50 ms per step while moving makes the gesture stutter
|
|
244
|
+
// (measured). Starting to build while moving leaves a blank until it is finished anyway, so
|
|
245
|
+
// building after it stops costs only one beat at the start. The drawing of the existing
|
|
246
|
+
// batches continues below as before (the appearance is unchanged).
|
|
247
|
+
if (!settled && (state.job || !state.batches || stale))
|
|
248
|
+
pending = true;
|
|
249
|
+
if (settled && !state.job && (!state.batches || stale)) {
|
|
250
|
+
const origin = state.viewOrigin ?? boundsCenter(state.chunk.bounds);
|
|
251
|
+
state.jobOrigin = origin;
|
|
252
|
+
// Nothing is walked here: the job walks the rows of the chunk when it is stepped, within
|
|
253
|
+
// the budget of the frame (walking every visible chunk at once would put the resolution
|
|
254
|
+
// of the styles of the whole view on one frame)
|
|
255
|
+
state.job = createChunkBuildJob(this.host.collector(state.chunk.rows, {
|
|
256
|
+
isExternallyRenderedPoint: this.host.externalPointFilter(),
|
|
257
|
+
skipDrapedFills: drapedFills,
|
|
258
|
+
}, drawn), renderers, origin, this.chunkTriangulator(state));
|
|
259
|
+
state.jobMask = drawn;
|
|
260
|
+
state.jobGrid = step?.grid ?? 0;
|
|
261
|
+
state.jobTilingKey = step ? chunkTilingKey(state.chunk, step) : null;
|
|
262
|
+
state.jobDraped = drapedFills;
|
|
263
|
+
}
|
|
264
|
+
// A job in progress is not advanced while the camera is moving either (a single step can
|
|
265
|
+
// blow through the budget, and paying it during a gesture always stutters).
|
|
266
|
+
if (state.job && !settled)
|
|
267
|
+
pending = true;
|
|
268
|
+
if (state.job && settled) {
|
|
269
|
+
if (canBuild()) {
|
|
270
|
+
builtHere++;
|
|
271
|
+
const done = state.job.step(budgetStart + budget, nowMs);
|
|
272
|
+
if (done) {
|
|
273
|
+
const built = state.job.take();
|
|
274
|
+
state.job = null;
|
|
275
|
+
if (built) {
|
|
276
|
+
// The old version is discarded only after the new one is complete (no flicker)
|
|
277
|
+
if (state.batches)
|
|
278
|
+
disposeChunkBatches(state.batches, renderers);
|
|
279
|
+
state.batches = built;
|
|
280
|
+
state.origin = state.jobOrigin;
|
|
281
|
+
state.builtGrid = state.jobGrid;
|
|
282
|
+
state.builtTilingKey = state.jobTilingKey;
|
|
283
|
+
state.builtDraped = state.jobDraped;
|
|
284
|
+
state.pointsMask = state.jobMask;
|
|
285
|
+
}
|
|
286
|
+
// When it could not be built (the shaders are not initialized) it is rebuilt on the
|
|
287
|
+
// next frame
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
pending = true;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
pending = true;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// A chunk that has never been built has nothing to draw at this point
|
|
298
|
+
if (!state.batches)
|
|
299
|
+
continue;
|
|
300
|
+
// The points follow the rows drawn now before the chunk is drawn, in every frame, while
|
|
301
|
+
// the camera moves as well: until they do, the points of another zoom band would be drawn
|
|
302
|
+
// at this scale (after a large zoom out, piled up into a solid patch). Only the point part
|
|
303
|
+
// is rebuilt, so the cost is a walk over the rows of the chunk plus the packing of the
|
|
304
|
+
// points it draws, which the thinning bounds by what fits on screen. A chunk whose rows are
|
|
305
|
+
// drawn alike in both masks (no point, or no change of its points) rebuilds nothing
|
|
306
|
+
if (state.pointsMask !== drawn && !this.rebuildPoints(state, renderers, drawn)) {
|
|
307
|
+
pending = true;
|
|
308
|
+
}
|
|
309
|
+
// Report to the depth bias how coarse the shape being drawn is. If the step has got finer
|
|
310
|
+
// than when it was baked, the shape being drawn is coarse by that ratio
|
|
311
|
+
if (step && state.builtGrid > step.grid) {
|
|
312
|
+
reportTerrainCoarsening(terrain, state.builtGrid / step.grid);
|
|
313
|
+
}
|
|
314
|
+
drawChunkBatches(state.batches, renderers, zoom, projectionData, factors);
|
|
315
|
+
// The features that cannot be retained are drawn immediately, right after the retained
|
|
316
|
+
// batches of the chunk, the points last (the immediate-mode path is not multiplied by the
|
|
317
|
+
// factors)
|
|
318
|
+
const { fallback, pointFallback } = state.batches;
|
|
319
|
+
if (fallback.length > 0 || pointFallback.length > 0) {
|
|
320
|
+
target.beginFrame(projectionData, zoom);
|
|
321
|
+
for (const feature of fallback)
|
|
322
|
+
target.processFeature(feature, false);
|
|
323
|
+
for (const feature of pointFallback)
|
|
324
|
+
target.processFeature(feature, false);
|
|
325
|
+
target.endFrame();
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
// If any chunk was left unbuilt, one more frame is asked for
|
|
329
|
+
this.lastPending = pending;
|
|
330
|
+
if (pending)
|
|
331
|
+
this.host.requestRepaint();
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Discards the retained batches of every chunk (the splitting is kept and they are rebuilt on
|
|
335
|
+
* the next draw)
|
|
336
|
+
*
|
|
337
|
+
* The queue of the triangulation is not touched. Discarding the work in progress on every
|
|
338
|
+
* rebuild would keep the triangulation of a huge polygon from ever finishing.
|
|
339
|
+
*/
|
|
340
|
+
invalidateAll() {
|
|
341
|
+
this.host.onInvalidateAll();
|
|
342
|
+
for (const state of this.chunks) {
|
|
343
|
+
this.invalidate(state);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Releases only the GPU resources (the chunks are built again on the next draw)
|
|
348
|
+
*
|
|
349
|
+
* It is called when the rendering layer is disposed.
|
|
350
|
+
*/
|
|
351
|
+
releaseRetained() {
|
|
352
|
+
this.invalidateAll();
|
|
353
|
+
this.renderers = null;
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Releases everything: the GPU resources, the chunks and the waiting for the triangulation
|
|
357
|
+
*
|
|
358
|
+
* A notification of the triangulation that arrives afterwards does nothing.
|
|
359
|
+
*/
|
|
360
|
+
dispose() {
|
|
361
|
+
this.disposed = true;
|
|
362
|
+
this.forgetTriangulation();
|
|
363
|
+
this.disposeChunks();
|
|
364
|
+
this.renderers = null;
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Discards the retained batches of a single chunk (they are rebuilt on the next draw)
|
|
368
|
+
*/
|
|
369
|
+
invalidate(state) {
|
|
370
|
+
// The build in progress is discarded too. Now that the contents changed, what is half built
|
|
371
|
+
// is stale
|
|
372
|
+
if (state.job) {
|
|
373
|
+
if (this.renderers)
|
|
374
|
+
state.job.dispose(this.renderers);
|
|
375
|
+
state.job = null;
|
|
376
|
+
}
|
|
377
|
+
if (!state.batches)
|
|
378
|
+
return;
|
|
379
|
+
if (this.renderers) {
|
|
380
|
+
disposeChunkBatches(state.batches, this.renderers);
|
|
381
|
+
}
|
|
382
|
+
state.batches = null;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Discards the chunks themselves (the GPU resources are released as well)
|
|
386
|
+
*/
|
|
387
|
+
disposeChunks() {
|
|
388
|
+
this.invalidateAll();
|
|
389
|
+
this.chunks = [];
|
|
390
|
+
}
|
|
391
|
+
/**
|
|
392
|
+
* Creates the receiver of the triangulation for a single chunk
|
|
393
|
+
*
|
|
394
|
+
* A polygon whose vertex count exceeds the threshold is not triangulated on the spot but queued
|
|
395
|
+
* into the time-sliced list (the fill of that polygon does not appear yet). Once the
|
|
396
|
+
* triangulation is finished, only the retained batches of this chunk are rebuilt and a repaint
|
|
397
|
+
* is requested.
|
|
398
|
+
*/
|
|
399
|
+
chunkTriangulator(state) {
|
|
400
|
+
// The contents may have been replaced by the time the notification arrives. The generation
|
|
401
|
+
// watches for that
|
|
402
|
+
const generation = this.featuresGeneration;
|
|
403
|
+
const onReady = () => {
|
|
404
|
+
if (this.disposed || generation !== this.featuresGeneration)
|
|
405
|
+
return;
|
|
406
|
+
this.invalidate(state);
|
|
407
|
+
this.host.requestRepaint();
|
|
408
|
+
};
|
|
409
|
+
state.onTriangulated = onReady;
|
|
410
|
+
return createChunkTriangulator(onReady, this.scheduler());
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Takes the receivers of this chunk set off the queue of the triangulation
|
|
414
|
+
*
|
|
415
|
+
* The scheduler discards a job nobody waits for any more (the triangulation is not kept running
|
|
416
|
+
* for a dataset that has been removed). It is called only on disposal (not on a rebuild).
|
|
417
|
+
*/
|
|
418
|
+
forgetTriangulation() {
|
|
419
|
+
const scheduler = this.scheduler();
|
|
420
|
+
for (const state of this.chunks) {
|
|
421
|
+
if (!state.onTriangulated)
|
|
422
|
+
continue;
|
|
423
|
+
scheduler.forget(state.onTriangulated);
|
|
424
|
+
state.onTriangulated = null;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
scheduler() {
|
|
428
|
+
return this.host.triangulationScheduler ?? globalTriangulationScheduler;
|
|
429
|
+
}
|
|
430
|
+
/**
|
|
431
|
+
* Follows the changes of the rendering pixel ratio
|
|
432
|
+
*
|
|
433
|
+
* Line widths and point sizes are converted to physical pixels and baked into the retained
|
|
434
|
+
* batches, so they have to be rebuilt when the display scale or the display itself changes. It
|
|
435
|
+
* is an insurance against a change of the rendering environment rather than of the features or
|
|
436
|
+
* the rules, and it normally never happens. When the ratio is injected it is a fixed value, so
|
|
437
|
+
* it is always "unchanged" and nothing is ever rebuilt.
|
|
438
|
+
*/
|
|
439
|
+
syncDevicePixelRatio() {
|
|
440
|
+
const dpr = resolvePixelRatio(this.host.pixelRatio);
|
|
441
|
+
if (this.builtDevicePixelRatio === dpr)
|
|
442
|
+
return;
|
|
443
|
+
if (this.builtDevicePixelRatio !== null) {
|
|
444
|
+
this.invalidateAll();
|
|
445
|
+
}
|
|
446
|
+
this.builtDevicePixelRatio = dpr;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Rebuilds the retained batches of the points as the DEMs arrive
|
|
450
|
+
*
|
|
451
|
+
* A point bakes the elevation of its anchor into the instance (a_instance_elevation_m of
|
|
452
|
+
* point-instance). DEM tiles arrive asynchronously, so at the moment of the first bake most of
|
|
453
|
+
* the points still have an elevation of 0. Without a re-bake, only the points are left behind
|
|
454
|
+
* at sea level and stay buried in the terrain.
|
|
455
|
+
*
|
|
456
|
+
* core advances the generation by one whenever the coverage of the DEM changes
|
|
457
|
+
* (getAnchorElevationGeneration). The retained cache on the store side (syncTerrainGeneration
|
|
458
|
+
* of store-retained) and the retained batches of custom renderers look at the same
|
|
459
|
+
* generation; only the datasets did not.
|
|
460
|
+
*
|
|
461
|
+
* The first time (= nothing has been baked yet) nothing is rebuilt. It is about to be baked, so
|
|
462
|
+
* there is nothing to discard.
|
|
463
|
+
*
|
|
464
|
+
* Polygons and lines do not refer to the terrain elevation at all, so they are not touched when
|
|
465
|
+
* the DEM coverage changes. Discarding the whole retained batches regardless of the type
|
|
466
|
+
* (`invalidateAll`) would, for a dataset with large surfaces, stall the main thread for
|
|
467
|
+
* seconds on every change of the DEM coverage by rebuilding every chunk including earcut. Only
|
|
468
|
+
* the retained batches of the points are rebuilt with `rebuildChunkPoints`.
|
|
469
|
+
*/
|
|
470
|
+
syncAnchorElevationGeneration(terrain) {
|
|
471
|
+
const generation = getAnchorElevationGeneration(terrain);
|
|
472
|
+
if (this.builtAnchorElevationGeneration === generation)
|
|
473
|
+
return;
|
|
474
|
+
if (this.builtAnchorElevationGeneration !== -1) {
|
|
475
|
+
this.refreshPointElevations();
|
|
476
|
+
}
|
|
477
|
+
this.builtAnchorElevationGeneration = generation;
|
|
478
|
+
}
|
|
479
|
+
/**
|
|
480
|
+
* Rebuilds only the retained batches of the points with the latest DEM elevations
|
|
481
|
+
*
|
|
482
|
+
* For a chunk whose retained batches have never been built (`state.batches === null`) nothing
|
|
483
|
+
* happens here, because the build of the next draw uses the latest elevations of that moment
|
|
484
|
+
* directly. The rows drawn are those the point part was built with (a change of them is the
|
|
485
|
+
* business of the draw loop).
|
|
486
|
+
*/
|
|
487
|
+
refreshPointElevations() {
|
|
488
|
+
const renderers = this.renderers;
|
|
489
|
+
if (!renderers)
|
|
490
|
+
return;
|
|
491
|
+
for (const state of this.chunks) {
|
|
492
|
+
if (!state.batches)
|
|
493
|
+
continue;
|
|
494
|
+
// A chunk without a single baked point has nothing to rewrite when the elevations change.
|
|
495
|
+
// For a dataset of polygons only (administrative boundaries, for example) every chunk
|
|
496
|
+
// drops out here and a change of the DEM coverage costs nothing. The points drawn in
|
|
497
|
+
// immediate mode look their elevation up every frame, so they are never left behind.
|
|
498
|
+
if (state.batches.points.length === 0)
|
|
499
|
+
continue;
|
|
500
|
+
this.rebuildPointPart(state, renderers, state.pointsMask);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Brings the point part of a built chunk to the rows `drawn`
|
|
505
|
+
*
|
|
506
|
+
* @returns false when it could not be rebuilt (the shaders are not ready; the previous point
|
|
507
|
+
* part is kept and it is tried again on the next draw)
|
|
508
|
+
*/
|
|
509
|
+
rebuildPoints(state, renderers, drawn) {
|
|
510
|
+
if (!sameRowsInMasks(state.pointsMask, drawn, state.chunk.rows)) {
|
|
511
|
+
if (!this.rebuildPointPart(state, renderers, drawn))
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
state.pointsMask = drawn;
|
|
515
|
+
return true;
|
|
516
|
+
}
|
|
517
|
+
/** Rebuilds the point part of a built chunk with the rows `drawn` */
|
|
518
|
+
rebuildPointPart(state, renderers, drawn) {
|
|
519
|
+
return rebuildChunkPoints(state.batches, this.host.collector(state.chunk.rows, { isExternallyRenderedPoint: this.host.externalPointFilter(), pointsOnly: true }, drawn), renderers, chunkOrigin(state));
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
/**
|
|
523
|
+
* The origin of the relative coordinates of the built batches of a chunk
|
|
524
|
+
*
|
|
525
|
+
* The coordinates of a retained batch are baked relative to this origin. Passing a different
|
|
526
|
+
* origin to the re-bake of the points alone (rebuildChunkPoints) than to the build would shift
|
|
527
|
+
* every re-baked point by the difference of the origins, so both read the origin recorded with
|
|
528
|
+
* the batches. A build starts from the center of the chunk bounds, or from the origin chosen for
|
|
529
|
+
* the view.
|
|
530
|
+
*/
|
|
531
|
+
function chunkOrigin(state) {
|
|
532
|
+
return state.origin ?? boundsCenter(state.chunk.bounds);
|
|
533
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from './partition.js';
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { getBoundingBox } from '../shared/utils/feature-bbox.js';
|
|
4
|
+
import { CHUNK_TARGET_SIZE, partitionRows } from './partition.js';
|
|
5
|
+
export { CHUNK_TARGET_SIZE, CHUNK_TARGET_VERTICES, chunkTargetSizeFor, LARGE_CHUNK_TARGET_SIZE, LARGE_DATASET_THRESHOLD, } from './partition.js';
|
|
6
|
+
/**
|
|
7
|
+
* Whether two bboxes intersect
|
|
8
|
+
*
|
|
9
|
+
* @internal
|
|
10
|
+
*/
|
|
11
|
+
export function boundsIntersect(a, b) {
|
|
12
|
+
return a.minX <= b.maxX && a.maxX >= b.minX && a.minY <= b.maxY && a.maxY >= b.minY;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Number of vertices of a feature (an estimate of the amount of work)
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export function countVertices(feature) {
|
|
20
|
+
const geometry = feature;
|
|
21
|
+
const walk = (value, depth) => {
|
|
22
|
+
if (!Array.isArray(value))
|
|
23
|
+
return 0;
|
|
24
|
+
if (depth === 0)
|
|
25
|
+
return 1;
|
|
26
|
+
let total = 0;
|
|
27
|
+
for (const item of value)
|
|
28
|
+
total += walk(item, depth - 1);
|
|
29
|
+
return total;
|
|
30
|
+
};
|
|
31
|
+
switch (geometry.type) {
|
|
32
|
+
case 'Point':
|
|
33
|
+
return 1;
|
|
34
|
+
case 'LineString':
|
|
35
|
+
case 'MultiPoint':
|
|
36
|
+
return walk(geometry.coordinates, 1);
|
|
37
|
+
case 'Polygon':
|
|
38
|
+
case 'MultiLineString':
|
|
39
|
+
return walk(geometry.coordinates, 2);
|
|
40
|
+
case 'MultiPolygon':
|
|
41
|
+
return walk(geometry.coordinates, 3);
|
|
42
|
+
default:
|
|
43
|
+
return 1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Computes the bboxes of the features all at once, `[minX, minY, maxX, maxY]` per feature
|
|
48
|
+
*
|
|
49
|
+
* The spatial index and the splitting both read this one array (it is not computed twice).
|
|
50
|
+
*
|
|
51
|
+
* @internal
|
|
52
|
+
*/
|
|
53
|
+
export function computeFeatureBounds(features) {
|
|
54
|
+
const bounds = new Float64Array(features.length * 4);
|
|
55
|
+
for (let i = 0; i < features.length; i++) {
|
|
56
|
+
const bbox = getBoundingBox(features[i]);
|
|
57
|
+
bounds[i * 4] = bbox.minX;
|
|
58
|
+
bounds[i * 4 + 1] = bbox.minY;
|
|
59
|
+
bounds[i * 4 + 2] = bbox.maxX;
|
|
60
|
+
bounds[i * 4 + 3] = bbox.maxY;
|
|
61
|
+
}
|
|
62
|
+
return bounds;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Turns the flat result of the splitting into chunks
|
|
66
|
+
*
|
|
67
|
+
* @internal
|
|
68
|
+
*/
|
|
69
|
+
export function toDisplayChunks(partitioned) {
|
|
70
|
+
const { rows, offsets, bounds } = partitioned;
|
|
71
|
+
const chunks = new Array(offsets.length - 1);
|
|
72
|
+
for (let c = 0; c < chunks.length; c++) {
|
|
73
|
+
const chunkRows = rows.subarray(offsets[c], offsets[c + 1]);
|
|
74
|
+
chunks[c] = {
|
|
75
|
+
rows: chunkRows,
|
|
76
|
+
bounds: {
|
|
77
|
+
minX: bounds[c * 4],
|
|
78
|
+
minY: bounds[c * 4 + 1],
|
|
79
|
+
maxX: bounds[c * 4 + 2],
|
|
80
|
+
maxY: bounds[c * 4 + 3],
|
|
81
|
+
},
|
|
82
|
+
firstIndex: chunkRows[0],
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
return chunks;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Splits the features into spatial chunks (`partitionRows` over their bboxes)
|
|
89
|
+
*
|
|
90
|
+
* @param features The features in draw order
|
|
91
|
+
* @param targetSize The target number of features per chunk
|
|
92
|
+
* @param featureBounds The precomputed bboxes (computed here when omitted)
|
|
93
|
+
*
|
|
94
|
+
* @internal
|
|
95
|
+
*/
|
|
96
|
+
export function partitionIntoChunks(features, targetSize = CHUNK_TARGET_SIZE, featureBounds) {
|
|
97
|
+
if (features.length === 0)
|
|
98
|
+
return [];
|
|
99
|
+
const bounds = featureBounds ?? computeFeatureBounds(features);
|
|
100
|
+
const vertexCounts = new Float64Array(features.length);
|
|
101
|
+
for (let i = 0; i < features.length; i++)
|
|
102
|
+
vertexCounts[i] = countVertices(features[i]);
|
|
103
|
+
return toDisplayChunks(partitionRows(bounds, vertexCounts, targetSize));
|
|
104
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The subpath `@sakuzu/maplibre-gl-draw/columnar`
|
|
3
|
+
*
|
|
4
|
+
* The parts of the columnar input of the datasets that can run in a Worker: the
|
|
5
|
+
* preparation of a table and the list of its buffers for `postMessage`, with the types of the
|
|
6
|
+
* table. It depends on neither maplibre nor WebGL nor the DOM, so a Worker that reads a file can
|
|
7
|
+
* import it without pulling in the engine.
|
|
8
|
+
*
|
|
9
|
+
* @module columnar
|
|
10
|
+
*/
|
|
11
|
+
export { columnarTransferables, prepareDatasetColumnar } from './prepare.js';
|
|
12
|
+
export type { DatasetColumn, DatasetColumnarGeometry, DatasetColumnarGeometryType, DatasetColumnarInput, DatasetColumnarMixedGeometry, DatasetColumnarPrepared, DatasetDictionaryCodes, DatasetDictionaryColumn, } from './types.js';
|