@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,529 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { binTile, drapeCellWorkBudget } from './binning.js';
|
|
4
|
+
/** The number of style texels per element */
|
|
5
|
+
export const DRAPE_STYLE_TEXELS = 4;
|
|
6
|
+
/**
|
|
7
|
+
* The index of the texel the selection highlight uses within the style table
|
|
8
|
+
*
|
|
9
|
+
* 0 = fill, 1 = stroke, 2 = specifications (width, kind, source, reference zoom), 3 =
|
|
10
|
+
* selection. The selection alone is put in a separate texel so that the index (the binning)
|
|
11
|
+
* need not be touched at all when the selection changes. Mixing it into the same texel as the
|
|
12
|
+
* color or the width would mean rebuilding the other values too on every rewrite.
|
|
13
|
+
*/
|
|
14
|
+
export const DRAPE_SELECTION_TEXEL = 3;
|
|
15
|
+
/** The upper bound on the tiles retained (beyond it, those outside the view are dropped and
|
|
16
|
+
* the arrays are repacked) */
|
|
17
|
+
const MAX_CACHED_TILES = 96;
|
|
18
|
+
/** The upper bound on the number of edge texels (16 bytes per texel, so 1M is 16MB) */
|
|
19
|
+
export const DRAPE_MAX_EDGE_TEXELS = 1048576;
|
|
20
|
+
/** The key of a tile */
|
|
21
|
+
export function drapeTileKey(tile) {
|
|
22
|
+
return `${tile.z}/${tile.x}/${tile.y}`;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* The arrays packed into the data textures (append-only)
|
|
26
|
+
*
|
|
27
|
+
* Adding a tile only piles it onto the end, so the transfer to the GPU is limited to the rows
|
|
28
|
+
* that were added (the renderer remembers the position it has transferred up to).
|
|
29
|
+
*/
|
|
30
|
+
export class DrapePackBuilder {
|
|
31
|
+
constructor() {
|
|
32
|
+
/** The identity of this version (with which the renderer tells whether it has been
|
|
33
|
+
* transferred) */
|
|
34
|
+
Object.defineProperty(this, "id", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true,
|
|
38
|
+
value: DrapePackBuilder.nextId++
|
|
39
|
+
});
|
|
40
|
+
Object.defineProperty(this, "edges", {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
writable: true,
|
|
44
|
+
value: new Float32Array(4 * 4096)
|
|
45
|
+
});
|
|
46
|
+
Object.defineProperty(this, "edgeCount", {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
configurable: true,
|
|
49
|
+
writable: true,
|
|
50
|
+
value: 0
|
|
51
|
+
});
|
|
52
|
+
Object.defineProperty(this, "runs", {
|
|
53
|
+
enumerable: true,
|
|
54
|
+
configurable: true,
|
|
55
|
+
writable: true,
|
|
56
|
+
value: new Float32Array(4 * 2048)
|
|
57
|
+
});
|
|
58
|
+
Object.defineProperty(this, "runCount", {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
configurable: true,
|
|
61
|
+
writable: true,
|
|
62
|
+
value: 0
|
|
63
|
+
});
|
|
64
|
+
Object.defineProperty(this, "cells", {
|
|
65
|
+
enumerable: true,
|
|
66
|
+
configurable: true,
|
|
67
|
+
writable: true,
|
|
68
|
+
value: new Float32Array(4 * 4096)
|
|
69
|
+
});
|
|
70
|
+
Object.defineProperty(this, "cellCount", {
|
|
71
|
+
enumerable: true,
|
|
72
|
+
configurable: true,
|
|
73
|
+
writable: true,
|
|
74
|
+
value: 0
|
|
75
|
+
});
|
|
76
|
+
Object.defineProperty(this, "styles", {
|
|
77
|
+
enumerable: true,
|
|
78
|
+
configurable: true,
|
|
79
|
+
writable: true,
|
|
80
|
+
value: new Float32Array(0)
|
|
81
|
+
});
|
|
82
|
+
Object.defineProperty(this, "elementCount", {
|
|
83
|
+
enumerable: true,
|
|
84
|
+
configurable: true,
|
|
85
|
+
writable: true,
|
|
86
|
+
value: 0
|
|
87
|
+
});
|
|
88
|
+
/**
|
|
89
|
+
* The version of the selection (when it changes, the style table is sent again)
|
|
90
|
+
*
|
|
91
|
+
* Edges, runs and cells are append-only so sending only the added rows is enough, but the
|
|
92
|
+
* selection rewrites rows that have already been sent. The renderer tells a rewrite apart by
|
|
93
|
+
* this version.
|
|
94
|
+
*/
|
|
95
|
+
Object.defineProperty(this, "selectionVersion", {
|
|
96
|
+
enumerable: true,
|
|
97
|
+
configurable: true,
|
|
98
|
+
writable: true,
|
|
99
|
+
value: 0
|
|
100
|
+
});
|
|
101
|
+
/** The number of elements with the selection mark raised (for diagnostics) */
|
|
102
|
+
Object.defineProperty(this, "markedCount", {
|
|
103
|
+
enumerable: true,
|
|
104
|
+
configurable: true,
|
|
105
|
+
writable: true,
|
|
106
|
+
value: 0
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** Builds the style table (only when the element order changes) */
|
|
110
|
+
setElements(elements) {
|
|
111
|
+
const styles = new Float32Array(Math.max(1, elements.length) * DRAPE_STYLE_TEXELS * 4);
|
|
112
|
+
for (let f = 0; f < elements.length; f++) {
|
|
113
|
+
const at = f * DRAPE_STYLE_TEXELS * 4;
|
|
114
|
+
const element = elements[f];
|
|
115
|
+
styles[at] = element.fill[0];
|
|
116
|
+
styles[at + 1] = element.fill[1];
|
|
117
|
+
styles[at + 2] = element.fill[2];
|
|
118
|
+
styles[at + 3] = element.fill[3];
|
|
119
|
+
styles[at + 4] = element.stroke[0];
|
|
120
|
+
styles[at + 5] = element.stroke[1];
|
|
121
|
+
styles[at + 6] = element.stroke[2];
|
|
122
|
+
styles[at + 7] = element.stroke[3];
|
|
123
|
+
// The width has already been converted into physical pixels at dataset time
|
|
124
|
+
styles[at + 8] = element.strokeWidthPx;
|
|
125
|
+
styles[at + 9] = element.kind;
|
|
126
|
+
styles[at + 10] = element.source;
|
|
127
|
+
styles[at + 11] = element.widthZoom;
|
|
128
|
+
}
|
|
129
|
+
this.styles = styles;
|
|
130
|
+
this.elementCount = elements.length;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Rewrites the marks of the selection highlight
|
|
134
|
+
*
|
|
135
|
+
* What is rewritten is only one texel of the style table (`DRAPE_SELECTION_TEXEL`); the
|
|
136
|
+
* index (edges, runs, cells) is not touched at all. The selection changes with a single
|
|
137
|
+
* click, whereas rebuilding the index takes several hundred milliseconds for 8,172
|
|
138
|
+
* administrative boundaries, so it cannot be rebuilt on every selection.
|
|
139
|
+
*
|
|
140
|
+
* @returns Whether anything actually changed (it is transferred again only when it did)
|
|
141
|
+
*/
|
|
142
|
+
setSelection(elements, selected) {
|
|
143
|
+
let changed = false;
|
|
144
|
+
let marked = 0;
|
|
145
|
+
const count = Math.min(elements.length, this.elementCount);
|
|
146
|
+
for (let f = 0; f < count; f++) {
|
|
147
|
+
const key = elements[f].selectionKey;
|
|
148
|
+
const on = key !== '' && selected.has(key) ? 1 : 0;
|
|
149
|
+
if (on === 1)
|
|
150
|
+
marked++;
|
|
151
|
+
const at = (f * DRAPE_STYLE_TEXELS + DRAPE_SELECTION_TEXEL) * 4;
|
|
152
|
+
if (this.styles[at] === on)
|
|
153
|
+
continue;
|
|
154
|
+
this.styles[at] = on;
|
|
155
|
+
changed = true;
|
|
156
|
+
}
|
|
157
|
+
this.markedCount = marked;
|
|
158
|
+
if (changed)
|
|
159
|
+
this.selectionVersion++;
|
|
160
|
+
return changed;
|
|
161
|
+
}
|
|
162
|
+
/** Piles one tile onto the end */
|
|
163
|
+
addTile(bins) {
|
|
164
|
+
const edgeBase = this.edgeCount;
|
|
165
|
+
const runBase = this.runCount;
|
|
166
|
+
const cellOffset = this.cellCount;
|
|
167
|
+
const edgeTexels = bins.edges.length / 4;
|
|
168
|
+
this.edges = ensureCapacity(this.edges, (this.edgeCount + edgeTexels) * 4);
|
|
169
|
+
this.edges.set(bins.edges, edgeBase * 4);
|
|
170
|
+
this.edgeCount += edgeTexels;
|
|
171
|
+
const runTexels = bins.runs.length / 4;
|
|
172
|
+
this.runs = ensureCapacity(this.runs, (this.runCount + runTexels) * 4);
|
|
173
|
+
for (let i = 0; i < runTexels; i++) {
|
|
174
|
+
const at = (runBase + i) * 4;
|
|
175
|
+
this.runs[at] = bins.runs[i * 4];
|
|
176
|
+
this.runs[at + 1] = bins.runs[i * 4 + 1] + edgeBase;
|
|
177
|
+
this.runs[at + 2] = bins.runs[i * 4 + 2];
|
|
178
|
+
this.runs[at + 3] = bins.runs[i * 4 + 3];
|
|
179
|
+
}
|
|
180
|
+
this.runCount += runTexels;
|
|
181
|
+
const cellTexels = bins.grid * bins.grid;
|
|
182
|
+
this.cells = ensureCapacity(this.cells, (this.cellCount + cellTexels) * 4);
|
|
183
|
+
for (let c = 0; c < cellTexels; c++) {
|
|
184
|
+
const at = (cellOffset + c) * 4;
|
|
185
|
+
this.cells[at] = bins.cells[c * 2] + runBase;
|
|
186
|
+
this.cells[at + 1] = bins.cells[c * 2 + 1];
|
|
187
|
+
this.cells[at + 2] = 0;
|
|
188
|
+
this.cells[at + 3] = 0;
|
|
189
|
+
}
|
|
190
|
+
this.cellCount += cellTexels;
|
|
191
|
+
return cellOffset;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
Object.defineProperty(DrapePackBuilder, "nextId", {
|
|
195
|
+
enumerable: true,
|
|
196
|
+
configurable: true,
|
|
197
|
+
writable: true,
|
|
198
|
+
value: 1
|
|
199
|
+
});
|
|
200
|
+
/** Doubles the capacity and copies when it is not enough */
|
|
201
|
+
function ensureCapacity(array, needed) {
|
|
202
|
+
if (array.length >= needed)
|
|
203
|
+
return array;
|
|
204
|
+
let size = Math.max(1024, array.length);
|
|
205
|
+
while (size < needed)
|
|
206
|
+
size *= 2;
|
|
207
|
+
const out = new Float32Array(size);
|
|
208
|
+
out.set(array);
|
|
209
|
+
return out;
|
|
210
|
+
}
|
|
211
|
+
/** The set used when nothing is selected (so that one is not created every time) */
|
|
212
|
+
const EMPTY_SELECTION = new Set();
|
|
213
|
+
/** Whether the selection sets are the same (judged by the size and the elements) */
|
|
214
|
+
function sameSelection(a, b) {
|
|
215
|
+
if (a === b)
|
|
216
|
+
return true;
|
|
217
|
+
if (a.size !== b.size)
|
|
218
|
+
return false;
|
|
219
|
+
for (const key of a) {
|
|
220
|
+
if (!b.has(key))
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
return true;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* The current time (in ms)
|
|
227
|
+
*/
|
|
228
|
+
function nowMs() {
|
|
229
|
+
return typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* The store of the tile indices
|
|
233
|
+
*/
|
|
234
|
+
export class DrapeTileStore {
|
|
235
|
+
constructor() {
|
|
236
|
+
Object.defineProperty(this, "active", {
|
|
237
|
+
enumerable: true,
|
|
238
|
+
configurable: true,
|
|
239
|
+
writable: true,
|
|
240
|
+
value: null
|
|
241
|
+
});
|
|
242
|
+
Object.defineProperty(this, "pending", {
|
|
243
|
+
enumerable: true,
|
|
244
|
+
configurable: true,
|
|
245
|
+
writable: true,
|
|
246
|
+
value: null
|
|
247
|
+
});
|
|
248
|
+
Object.defineProperty(this, "frame", {
|
|
249
|
+
enumerable: true,
|
|
250
|
+
configurable: true,
|
|
251
|
+
writable: true,
|
|
252
|
+
value: 0
|
|
253
|
+
});
|
|
254
|
+
/** The keys of the features currently selected (drapeSelectionKey in `binning.ts`) */
|
|
255
|
+
Object.defineProperty(this, "selection", {
|
|
256
|
+
enumerable: true,
|
|
257
|
+
configurable: true,
|
|
258
|
+
writable: true,
|
|
259
|
+
value: EMPTY_SELECTION
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Announces the element order
|
|
264
|
+
*
|
|
265
|
+
* When the version changes, a new version is started. The old version can keep being drawn
|
|
266
|
+
* as it is.
|
|
267
|
+
*/
|
|
268
|
+
sync(revision, elements, quadBreaks = [], entryStarts = new Map(), aboveStoreStart = elements.length) {
|
|
269
|
+
if (this.active && this.active.revision === revision) {
|
|
270
|
+
if (this.pending)
|
|
271
|
+
this.pending = null;
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
if (this.pending?.revision === revision)
|
|
275
|
+
return;
|
|
276
|
+
const state = createState(revision, elements, quadBreaks, entryStarts, aboveStoreStart);
|
|
277
|
+
// The current selection is copied into the version that was just started too (without
|
|
278
|
+
// this, the highlight drops for exactly one frame right after the element order changes)
|
|
279
|
+
state.builder.setSelection(state.elements, this.selection);
|
|
280
|
+
if (this.active)
|
|
281
|
+
this.pending = state;
|
|
282
|
+
else
|
|
283
|
+
this.active = state;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Announces the targets of the selection highlight (the rendering side calls it every frame)
|
|
287
|
+
*
|
|
288
|
+
* It does nothing when the contents are the same. Scanning all the elements every frame with
|
|
289
|
+
* the same set would be a wasted scan per frame for 8,172 administrative boundaries. How
|
|
290
|
+
* they are drawn is held in the per-version style table, so the same selection is copied
|
|
291
|
+
* into the version under construction (pending) as well.
|
|
292
|
+
*/
|
|
293
|
+
setSelection(selected) {
|
|
294
|
+
if (sameSelection(this.selection, selected))
|
|
295
|
+
return;
|
|
296
|
+
// A copy is held so that it does not waver if the caller later rewrites the set it
|
|
297
|
+
// passes around
|
|
298
|
+
this.selection = new Set(selected);
|
|
299
|
+
if (this.active)
|
|
300
|
+
this.active.builder.setSelection(this.active.elements, this.selection);
|
|
301
|
+
if (this.pending)
|
|
302
|
+
this.pending.builder.setSelection(this.pending.elements, this.selection);
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Prepares the indices of the tiles of the view
|
|
306
|
+
*
|
|
307
|
+
* @param tiles The terrain tiles of the view
|
|
308
|
+
* @param budgetMs The time that may be used in this frame (at least one tile is always
|
|
309
|
+
* built; at 0 or less, not a single one is built)
|
|
310
|
+
* @param zoom The current zoom (used to estimate the line width, which decides the margin of
|
|
311
|
+
* the index)
|
|
312
|
+
*/
|
|
313
|
+
prepare(tiles, budgetMs, zoom = 0) {
|
|
314
|
+
this.frame++;
|
|
315
|
+
const target = this.pending ?? this.active;
|
|
316
|
+
if (!target) {
|
|
317
|
+
return {
|
|
318
|
+
complete: false,
|
|
319
|
+
pending: false,
|
|
320
|
+
overflow: false,
|
|
321
|
+
built: 0,
|
|
322
|
+
maxTileEdges: 0,
|
|
323
|
+
maxEdgesPerCell: 0,
|
|
324
|
+
maxRunsPerCell: 0,
|
|
325
|
+
truncatedCells: 0,
|
|
326
|
+
unfitTiles: 0,
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
const start = nowMs();
|
|
330
|
+
// The screen is shared among the tiles, so the more tiles there are the fewer pixels
|
|
331
|
+
// each one has
|
|
332
|
+
const maxCellWork = drapeCellWorkBudget(tiles.length);
|
|
333
|
+
let built = 0;
|
|
334
|
+
for (const tile of tiles) {
|
|
335
|
+
const key = drapeTileKey(tile);
|
|
336
|
+
const hit = target.entries.get(key);
|
|
337
|
+
if (hit) {
|
|
338
|
+
hit.lastUsed = this.frame;
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
// A budget of 0 or less is an explicit skip meaning "build not a single one"
|
|
342
|
+
// (the deferral while the camera is moving). With a normal budget at least one is
|
|
343
|
+
// always built (so that progress does not stall).
|
|
344
|
+
if (budgetMs <= 0)
|
|
345
|
+
continue;
|
|
346
|
+
if (built > 0 && nowMs() - start >= budgetMs)
|
|
347
|
+
continue;
|
|
348
|
+
const bins = binTile(target.elements, tile, { maxCellWork, zoom });
|
|
349
|
+
const cellOffset = target.builder.addTile(bins);
|
|
350
|
+
target.entries.set(key, {
|
|
351
|
+
unfit: bins.overflow,
|
|
352
|
+
grid: bins.grid,
|
|
353
|
+
cellOffset,
|
|
354
|
+
bins,
|
|
355
|
+
lastUsed: this.frame,
|
|
356
|
+
});
|
|
357
|
+
built++;
|
|
358
|
+
}
|
|
359
|
+
// The new version replaces the old one once it covers the view better.
|
|
360
|
+
//
|
|
361
|
+
// The principle is "draw with the old version until it is ready", but when the old version
|
|
362
|
+
// does not cover the current view at all (the zoom or the place moved a lot), waiting for
|
|
363
|
+
// the old version only leaves the fill missing. Comparing the number of tiles covered
|
|
364
|
+
// picks "whichever can draw more" in either case.
|
|
365
|
+
if (this.pending && this.active) {
|
|
366
|
+
const covered = (state) => {
|
|
367
|
+
let n = 0;
|
|
368
|
+
for (const tile of tiles)
|
|
369
|
+
if (state.entries.has(drapeTileKey(tile)))
|
|
370
|
+
n++;
|
|
371
|
+
return n;
|
|
372
|
+
};
|
|
373
|
+
if (covered(this.pending) >= covered(this.active)) {
|
|
374
|
+
this.active = this.pending;
|
|
375
|
+
this.pending = null;
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
const active = this.active;
|
|
379
|
+
if (active) {
|
|
380
|
+
this.compactIfNeeded(active, tiles);
|
|
381
|
+
// Whether there are still tiles not built in the current version
|
|
382
|
+
let activeMissing = 0;
|
|
383
|
+
let unfit = 0;
|
|
384
|
+
let maxTileEdges = 0;
|
|
385
|
+
let maxEdgesPerCell = 0;
|
|
386
|
+
let maxRunsPerCell = 0;
|
|
387
|
+
let truncatedCells = 0;
|
|
388
|
+
for (const tile of tiles) {
|
|
389
|
+
const entry = active.entries.get(drapeTileKey(tile));
|
|
390
|
+
if (!entry) {
|
|
391
|
+
activeMissing++;
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
if (entry.unfit)
|
|
395
|
+
unfit++;
|
|
396
|
+
maxTileEdges = Math.max(maxTileEdges, entry.bins.edgeEstimate);
|
|
397
|
+
maxEdgesPerCell = Math.max(maxEdgesPerCell, entry.bins.maxEdgesPerCell);
|
|
398
|
+
maxRunsPerCell = Math.max(maxRunsPerCell, entry.bins.maxRunsPerCell);
|
|
399
|
+
truncatedCells += entry.bins.truncatedCells;
|
|
400
|
+
}
|
|
401
|
+
// Once the tiles that do not go through the analytic evaluation exceed a quarter of the
|
|
402
|
+
// view, the whole map is handed to the vertex displacement path (a zoomed-out view falls
|
|
403
|
+
// into this case; each tile is so wide that dropping a single one loses half the
|
|
404
|
+
// picture). In a pitched view a single coarse tile in the distance can fall out, and
|
|
405
|
+
// that one tile is simply not drawn (it is a strip at the corner of the screen, and the
|
|
406
|
+
// rest can be kept on the analytic evaluation)
|
|
407
|
+
return {
|
|
408
|
+
complete: activeMissing === 0,
|
|
409
|
+
pending: activeMissing > 0 || this.pending !== null,
|
|
410
|
+
overflow: tiles.length > 0 && unfit * 4 > tiles.length,
|
|
411
|
+
built,
|
|
412
|
+
maxTileEdges,
|
|
413
|
+
maxEdgesPerCell,
|
|
414
|
+
maxRunsPerCell,
|
|
415
|
+
truncatedCells,
|
|
416
|
+
unfitTiles: unfit,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
return {
|
|
420
|
+
complete: false,
|
|
421
|
+
pending: true,
|
|
422
|
+
overflow: false,
|
|
423
|
+
built,
|
|
424
|
+
maxTileEdges: 0,
|
|
425
|
+
maxEdgesPerCell: 0,
|
|
426
|
+
maxRunsPerCell: 0,
|
|
427
|
+
truncatedCells: 0,
|
|
428
|
+
unfitTiles: 0,
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
/** The version used for rendering */
|
|
432
|
+
get pack() {
|
|
433
|
+
return this.active?.builder ?? null;
|
|
434
|
+
}
|
|
435
|
+
/** The number of elements of the version used for rendering */
|
|
436
|
+
get elementCount() {
|
|
437
|
+
return this.active?.elements.length ?? 0;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* The breaks in the stacking order of the version used for rendering (the positions of the
|
|
441
|
+
* images)
|
|
442
|
+
*
|
|
443
|
+
* It returns those of the version being drawn right now, not of the version that was just
|
|
444
|
+
* collected. While a rebuild is in progress the old version keeps being drawn, so making
|
|
445
|
+
* only the breaks new would make the indices disagree with the element list and the
|
|
446
|
+
* segmented rendering would paint a different element or paint nothing.
|
|
447
|
+
*/
|
|
448
|
+
get quadBreaks() {
|
|
449
|
+
return this.active?.quadBreaks ?? [];
|
|
450
|
+
}
|
|
451
|
+
/** The starting position of each entry of the stack, in the version being drawn */
|
|
452
|
+
get entryStarts() {
|
|
453
|
+
return this.active?.entryStarts ?? EMPTY_ENTRY_STARTS;
|
|
454
|
+
}
|
|
455
|
+
/** The index at which the datasets above the stack begin, in the version being drawn */
|
|
456
|
+
get aboveStoreStart() {
|
|
457
|
+
return this.active?.aboveStoreStart ?? this.elementCount;
|
|
458
|
+
}
|
|
459
|
+
/** The position of one tile */
|
|
460
|
+
entryOf(tile) {
|
|
461
|
+
return this.active?.entries.get(drapeTileKey(tile));
|
|
462
|
+
}
|
|
463
|
+
/** Throws everything away */
|
|
464
|
+
clear() {
|
|
465
|
+
this.active = null;
|
|
466
|
+
this.pending = null;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Once the amount retained exceeds the upper bound, keeps only the tiles of the view and
|
|
470
|
+
* repacks
|
|
471
|
+
*
|
|
472
|
+
* The bins are still held, so it takes only a repacking of the arrays, not a rebuild.
|
|
473
|
+
*/
|
|
474
|
+
compactIfNeeded(state, tiles) {
|
|
475
|
+
if (state.entries.size <= MAX_CACHED_TILES &&
|
|
476
|
+
state.builder.edgeCount <= DRAPE_MAX_EDGE_TEXELS) {
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
const keep = new Set(tiles.map(drapeTileKey));
|
|
480
|
+
const builder = new DrapePackBuilder();
|
|
481
|
+
builder.setElements(state.elements);
|
|
482
|
+
// The repacked builder rebuilds the style table, so the selection marks are copied again
|
|
483
|
+
// as well. Forgetting to copy them means setSelection returns early as long as the set
|
|
484
|
+
// does not change and the highlight never comes back (it shows up as a selection that
|
|
485
|
+
// "disappears when you zoom")
|
|
486
|
+
builder.setSelection(state.elements, this.selection);
|
|
487
|
+
const entries = new Map();
|
|
488
|
+
for (const [key, entry] of state.entries) {
|
|
489
|
+
if (!keep.has(key))
|
|
490
|
+
continue;
|
|
491
|
+
const cellOffset = builder.addTile(entry.bins);
|
|
492
|
+
entries.set(key, { ...entry, cellOffset });
|
|
493
|
+
}
|
|
494
|
+
const replaced = {
|
|
495
|
+
revision: state.revision,
|
|
496
|
+
elements: state.elements,
|
|
497
|
+
quadBreaks: state.quadBreaks,
|
|
498
|
+
entryStarts: state.entryStarts,
|
|
499
|
+
aboveStoreStart: state.aboveStoreStart,
|
|
500
|
+
builder,
|
|
501
|
+
entries,
|
|
502
|
+
overflow: state.overflow,
|
|
503
|
+
};
|
|
504
|
+
// If it still does not fit after repacking, the view itself exceeds the budget. The
|
|
505
|
+
// degradation flag is raised and it is handed to the vertex displacement path
|
|
506
|
+
if (builder.edgeCount > DRAPE_MAX_EDGE_TEXELS)
|
|
507
|
+
replaced.overflow = true;
|
|
508
|
+
if (this.active === state)
|
|
509
|
+
this.active = replaced;
|
|
510
|
+
if (this.pending === state)
|
|
511
|
+
this.pending = replaced;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
/** Starts a version */
|
|
515
|
+
function createState(revision, elements, quadBreaks, entryStarts, aboveStoreStart) {
|
|
516
|
+
const builder = new DrapePackBuilder();
|
|
517
|
+
builder.setElements(elements);
|
|
518
|
+
return {
|
|
519
|
+
revision,
|
|
520
|
+
elements,
|
|
521
|
+
quadBreaks,
|
|
522
|
+
entryStarts,
|
|
523
|
+
aboveStoreStart,
|
|
524
|
+
builder,
|
|
525
|
+
entries: new Map(),
|
|
526
|
+
overflow: false,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
const EMPTY_ENTRY_STARTS = new Map();
|