@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,168 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { expandBBox } from './store-retained-bbox.js';
|
|
4
|
+
/**
|
|
5
|
+
* Upper limit of the number of vertices that one update may put into the incremental update of
|
|
6
|
+
* the coordinate texture
|
|
7
|
+
*
|
|
8
|
+
* A change beyond this (moving vertices in bulk, cut and paste) rebuilds the whole chunk.
|
|
9
|
+
* The incremental update targets the case where "one vertex drag moves only a few points".
|
|
10
|
+
*/
|
|
11
|
+
export const MAX_PATCHED_VERTICES = 8;
|
|
12
|
+
/**
|
|
13
|
+
* Extracts the line renderer if it supports partial updates of the coordinate texture
|
|
14
|
+
*/
|
|
15
|
+
export function asCoordPatcher(line) {
|
|
16
|
+
const candidate = line;
|
|
17
|
+
return typeof candidate.patchRetainedBatchCoords === 'function'
|
|
18
|
+
? candidate
|
|
19
|
+
: null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Computes the diff of a coordinate list (the indices of the vertices that moved)
|
|
23
|
+
*
|
|
24
|
+
* A vertex drag is an update where "the number of vertices is the same and only a few values
|
|
25
|
+
* differ". Anything else (vertices added or removed, many of them moved) cannot be applied as a
|
|
26
|
+
* diff, so null is returned.
|
|
27
|
+
*
|
|
28
|
+
* The comparison is done in a single pass. If the element references are the same, that vertex
|
|
29
|
+
* has not moved (the Store reuses the arrays of the vertices it does not change). The values are
|
|
30
|
+
* looked at only when the references differ.
|
|
31
|
+
*
|
|
32
|
+
* @param maxChanged Upper limit of the number of changed vertices allowed as a diff
|
|
33
|
+
* @returns The indices of the vertices that moved (an empty array when none moved). null when
|
|
34
|
+
* the number of vertices differs or the upper limit is exceeded
|
|
35
|
+
*/
|
|
36
|
+
export function computeCoordinateDiff(prev, next, maxChanged) {
|
|
37
|
+
if (!Array.isArray(prev) || !Array.isArray(next))
|
|
38
|
+
return null;
|
|
39
|
+
if (prev.length !== next.length)
|
|
40
|
+
return null;
|
|
41
|
+
const changed = [];
|
|
42
|
+
for (let i = 0; i < next.length; i++) {
|
|
43
|
+
const a = prev[i];
|
|
44
|
+
const b = next[i];
|
|
45
|
+
if (a === b)
|
|
46
|
+
continue;
|
|
47
|
+
if (!a || !b)
|
|
48
|
+
return null;
|
|
49
|
+
if (a[0] === b[0] && a[1] === b[1])
|
|
50
|
+
continue;
|
|
51
|
+
// Beyond the upper limit it is not handled as a diff
|
|
52
|
+
if (changed.length >= maxChanged)
|
|
53
|
+
return null;
|
|
54
|
+
changed.push(i);
|
|
55
|
+
}
|
|
56
|
+
return changed;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Computes the "feature → position in the coordinate texture" of a line chunk
|
|
60
|
+
*
|
|
61
|
+
* The coordinate texture is packed with the coordinates in the order of the items returned by
|
|
62
|
+
* collectLineItems. Therefore this must count in the same order and with the same exclusion rule
|
|
63
|
+
* as collectLineItems (fewer than 2 vertices are not pushed).
|
|
64
|
+
*
|
|
65
|
+
* Only the types where one feature becomes one item and the coordinate list goes in as it is
|
|
66
|
+
* (LineString / Freehand) are recorded. A MultiLineString splits into several items and its
|
|
67
|
+
* indices interleave, so it is not a target of the diff (only the coordinate count is advanced).
|
|
68
|
+
*/
|
|
69
|
+
export function computeLineCoordSlots(features) {
|
|
70
|
+
const slots = new Map();
|
|
71
|
+
let offset = 0;
|
|
72
|
+
for (const feature of features) {
|
|
73
|
+
if (feature.type === 'MultiLineString') {
|
|
74
|
+
for (const part of feature.coordinates ?? []) {
|
|
75
|
+
if (!part || part.length < 2)
|
|
76
|
+
continue;
|
|
77
|
+
offset += part.length;
|
|
78
|
+
}
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const coords = feature.coordinates;
|
|
82
|
+
if (!coords || coords.length < 2)
|
|
83
|
+
continue;
|
|
84
|
+
if (feature.type === 'LineString' || feature.type === 'Freehand') {
|
|
85
|
+
slots.set(feature.id, { offset, count: coords.length });
|
|
86
|
+
}
|
|
87
|
+
offset += coords.length;
|
|
88
|
+
}
|
|
89
|
+
return slots;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Queues a vertex movement as a diff patch against the retained batch
|
|
93
|
+
*
|
|
94
|
+
* It can be queued only when all of the following hold. If even one of them fails, false is
|
|
95
|
+
* returned and the caller rebuilds the whole chunk (rebuilding too much still renders
|
|
96
|
+
* correctly).
|
|
97
|
+
*
|
|
98
|
+
* - A type whose coordinate list goes into the coordinate texture as one contiguous run
|
|
99
|
+
* (LineString / Freehand)
|
|
100
|
+
* - No other item that affects the appearance (properties = the input of the style rules) has
|
|
101
|
+
* changed
|
|
102
|
+
* - The number of vertices is unchanged and between 1 and MAX_PATCHED_VERTICES vertices moved
|
|
103
|
+
* - The chunk it belongs to has a retained line batch and is not waiting for a rebuild
|
|
104
|
+
* - The renderer used for drawing supports partial updates of the coordinate texture
|
|
105
|
+
*
|
|
106
|
+
* The drag being committed (up) does not trigger another rebuild. The patch queued by the last
|
|
107
|
+
* movement becomes the committed value as it is.
|
|
108
|
+
*
|
|
109
|
+
* @param chunk The chunk that carries the feature (undefined when there is none)
|
|
110
|
+
* @param line The line renderer used most recently (null before the first draw)
|
|
111
|
+
*/
|
|
112
|
+
export function queueCoordPatch(chunk, feature, previous, line) {
|
|
113
|
+
if (feature.type !== 'LineString' && feature.type !== 'Freehand')
|
|
114
|
+
return false;
|
|
115
|
+
// properties is the input of the style rules, so a change there can change the color
|
|
116
|
+
if (previous.properties !== feature.properties)
|
|
117
|
+
return false;
|
|
118
|
+
if (!chunk)
|
|
119
|
+
return false;
|
|
120
|
+
if (chunk.kind !== 'line' || !chunk.line || chunk.dirty || !chunk.lineOffsets)
|
|
121
|
+
return false;
|
|
122
|
+
const slot = chunk.lineOffsets.get(feature.id);
|
|
123
|
+
if (!slot)
|
|
124
|
+
return false;
|
|
125
|
+
const coords = feature.coordinates;
|
|
126
|
+
// If the vertex count differs from when the index table was built, the positions of the
|
|
127
|
+
// following features are off as well
|
|
128
|
+
if (!Array.isArray(coords) || coords.length !== slot.count)
|
|
129
|
+
return false;
|
|
130
|
+
const changed = computeCoordinateDiff(previous.coordinates, coords, MAX_PATCHED_VERTICES);
|
|
131
|
+
if (!changed)
|
|
132
|
+
return false;
|
|
133
|
+
// An update where no vertex moved (a change of locked, for example) is not treated as a diff;
|
|
134
|
+
// the chunk is rebuilt as before (erring on the conservative side)
|
|
135
|
+
if (changed.length === 0)
|
|
136
|
+
return false;
|
|
137
|
+
// With a renderer that has no partial update, a queued diff could never be applied
|
|
138
|
+
if (!line || !asCoordPatcher(line))
|
|
139
|
+
return false;
|
|
140
|
+
const patches = chunk.pendingCoordPatches ?? [];
|
|
141
|
+
chunk.pendingCoordPatches = patches;
|
|
142
|
+
for (const i of changed) {
|
|
143
|
+
const coord = coords[i];
|
|
144
|
+
patches.push({ coordIndex: slot.offset + i, lngLat: [coord[0], coord[1]] });
|
|
145
|
+
chunk.bbox = expandBBox(chunk.bbox, coord);
|
|
146
|
+
}
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Applies the queued vertex diff to the coordinate texture
|
|
151
|
+
*
|
|
152
|
+
* It is not called for a chunk thinned away off-screen, but the patches stay queued, so they
|
|
153
|
+
* are all applied on the first frame where the chunk comes into view.
|
|
154
|
+
*/
|
|
155
|
+
export function flushCoordPatches(chunk, line) {
|
|
156
|
+
const patches = chunk.pendingCoordPatches;
|
|
157
|
+
if (!patches || !chunk.line)
|
|
158
|
+
return;
|
|
159
|
+
chunk.pendingCoordPatches = null;
|
|
160
|
+
const patcher = asCoordPatcher(line);
|
|
161
|
+
if (!patcher) {
|
|
162
|
+
// Safety net for the case where the renderer was swapped for one without partial updates.
|
|
163
|
+
// This frame keeps the stale picture, but the next frame rebuilds it.
|
|
164
|
+
chunk.dirty = true;
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
patcher.patchRetainedBatchCoords(chunk.line, patches);
|
|
168
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Immediate-mode drawing of the chunks that cannot be retained
|
|
3
|
+
*
|
|
4
|
+
* Dashed lines, images, point shapes without instancing support, custom types and features with
|
|
5
|
+
* a companion are drawn one at a time through the immediate-mode draw target, in the same order
|
|
6
|
+
* as the layer loop of render.ts.
|
|
7
|
+
*/
|
|
8
|
+
import type { ProjectionData } from 'maplibre-gl';
|
|
9
|
+
import type { CustomFeatureHandler, CustomRendererDrawContext } from '../../extension/index.js';
|
|
10
|
+
import type { Store } from '../../store/store.js';
|
|
11
|
+
import type { Feature, Layer } from '../../store/types.js';
|
|
12
|
+
import { type FeatureCompanionRegistry } from '../feature-companion.js';
|
|
13
|
+
import type { RetainedRendererSet } from '../renderers/retained.js';
|
|
14
|
+
/**
|
|
15
|
+
* Draw target used when falling back to immediate mode (the same shape as BatchManager)
|
|
16
|
+
*/
|
|
17
|
+
export interface StoreImmediateTarget {
|
|
18
|
+
beginFrame(projectionData: ProjectionData, zoom: number, layer?: Layer): void;
|
|
19
|
+
processFeature(feature: Feature, isSelected: boolean): boolean;
|
|
20
|
+
endFrame(): void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Dependencies of drawLayer
|
|
24
|
+
*/
|
|
25
|
+
export interface StoreRetainedDrawDeps {
|
|
26
|
+
/** The full set of renderers of retained mode */
|
|
27
|
+
renderers: RetainedRendererSet;
|
|
28
|
+
/** Immediate-mode draw target that draws the features which cannot be retained */
|
|
29
|
+
batchManager: StoreImmediateTarget;
|
|
30
|
+
/** Renderers of the custom feature types (type name → renderer) */
|
|
31
|
+
customRenderers: Map<string, CustomFeatureHandler['renderer']>;
|
|
32
|
+
/** Draw context passed to a custom renderer */
|
|
33
|
+
customRendererContext: CustomRendererDrawContext;
|
|
34
|
+
/** Providers of companion drawing and companion hits (those of this draw instance) */
|
|
35
|
+
companions: FeatureCompanionRegistry;
|
|
36
|
+
/**
|
|
37
|
+
* Returns the set of feature ids inside the expanded viewport (a spatial index query)
|
|
38
|
+
*
|
|
39
|
+
* Used to thin immediate chunks per feature. It is not called in a frame that draws no
|
|
40
|
+
* immediate chunk at all (the caller must memoize it within the frame). When omitted, an
|
|
41
|
+
* immediate chunk is thinned by the chunk bbox alone.
|
|
42
|
+
*/
|
|
43
|
+
getVisibleIds?: () => ReadonlySet<string>;
|
|
44
|
+
/**
|
|
45
|
+
* Re-establishes the blend state of our own rendering (a wrapper around `applyDrawBlendState`)
|
|
46
|
+
*
|
|
47
|
+
* The renderer of a custom feature type is an external implementation and may come back having
|
|
48
|
+
* rewritten the blend function for its own purposes. Left alone, everything drawn later in the
|
|
49
|
+
* same frame would be composited wrongly, so it is called right after control comes back.
|
|
50
|
+
* When omitted nothing is re-established (the path of tests that have no GL).
|
|
51
|
+
*/
|
|
52
|
+
restoreBlendState?: () => void;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Draws a list of features in immediate mode
|
|
56
|
+
*
|
|
57
|
+
* It draws with the same steps as the current immediate mode (the layer loop of render.ts).
|
|
58
|
+
* A custom type is drawn after the batch has been flushed, to keep the draw order.
|
|
59
|
+
*
|
|
60
|
+
* @param store Where the features are looked up again (hidden ones are skipped)
|
|
61
|
+
* @param visibleIds Feature ids inside the expanded viewport (no thinning when omitted)
|
|
62
|
+
*/
|
|
63
|
+
export declare function drawFeaturesImmediate(store: Store, featureIds: string[], layer: Layer | undefined, projectionData: ProjectionData, zoom: number, deps: StoreRetainedDrawDeps, visibleIds?: ReadonlySet<string>): void;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { isLocallyHidden } from '../../store/local-visibility.js';
|
|
4
|
+
import { drawFeatureCompanionsInFrame, } from '../feature-companion.js';
|
|
5
|
+
/**
|
|
6
|
+
* Draws a list of features in immediate mode
|
|
7
|
+
*
|
|
8
|
+
* It draws with the same steps as the current immediate mode (the layer loop of render.ts).
|
|
9
|
+
* A custom type is drawn after the batch has been flushed, to keep the draw order.
|
|
10
|
+
*
|
|
11
|
+
* @param store Where the features are looked up again (hidden ones are skipped)
|
|
12
|
+
* @param visibleIds Feature ids inside the expanded viewport (no thinning when omitted)
|
|
13
|
+
*/
|
|
14
|
+
export function drawFeaturesImmediate(store, featureIds, layer, projectionData, zoom, deps, visibleIds) {
|
|
15
|
+
const { batchManager, customRenderers, customRendererContext } = deps;
|
|
16
|
+
batchManager.beginFrame(projectionData, zoom, layer);
|
|
17
|
+
for (const id of featureIds) {
|
|
18
|
+
if (visibleIds && !visibleIds.has(id))
|
|
19
|
+
continue;
|
|
20
|
+
const feature = store.getFeature(id);
|
|
21
|
+
if (!feature?.visible || isLocallyHidden(feature, store))
|
|
22
|
+
continue;
|
|
23
|
+
// Companion drawing (feature companion): drawn right before the feature itself, that is,
|
|
24
|
+
// one z below it. classifyFeature splits a feature that has a companion out into an
|
|
25
|
+
// immediate chunk, so going through here makes the z order in retained mode identical to
|
|
26
|
+
// immediate mode.
|
|
27
|
+
drawFeatureCompanionsInFrame(deps.companions, feature, batchManager, projectionData, zoom, layer, customRendererContext, deps.restoreBlendState);
|
|
28
|
+
const customRenderer = customRenderers.get(feature.type);
|
|
29
|
+
if (customRenderer) {
|
|
30
|
+
// To keep the draw order (painter's algorithm), the core batch that has accumulated is
|
|
31
|
+
// flushed first and only then the custom feature is drawn immediately.
|
|
32
|
+
batchManager.endFrame();
|
|
33
|
+
customRenderer.draw({
|
|
34
|
+
id: feature.id,
|
|
35
|
+
type: feature.type,
|
|
36
|
+
coordinates: feature.coordinates,
|
|
37
|
+
properties: feature.properties,
|
|
38
|
+
style: feature.style,
|
|
39
|
+
}, projectionData, zoom, customRendererContext);
|
|
40
|
+
// Re-establish the blend state that the external renderer may have rewritten
|
|
41
|
+
deps.restoreBlendState?.();
|
|
42
|
+
batchManager.beginFrame(projectionData, zoom, layer);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
batchManager.processFeature(feature, false);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
batchManager.endFrame();
|
|
49
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detection of the changes that invalidate every retained chunk
|
|
3
|
+
*
|
|
4
|
+
* Some inputs of the retained batches do not arrive as a change of the Store: the set of locally
|
|
5
|
+
* hidden features (updated in place), the registry of companion drawing and the generations of
|
|
6
|
+
* the terrain. They are checked once per frame, and any change discards the whole cache.
|
|
7
|
+
*/
|
|
8
|
+
import type { Layer, StateChanges } from '../../store/types.js';
|
|
9
|
+
import type { FeatureCompanionRegistry } from '../feature-companion.js';
|
|
10
|
+
import type { TerrainContext } from '../terrain/context.js';
|
|
11
|
+
/**
|
|
12
|
+
* Snapshots of the inputs that invalidate every chunk
|
|
13
|
+
*
|
|
14
|
+
* Each method records the current value and reports whether it changed since the previous call.
|
|
15
|
+
* The first call only records (there is no cache yet, so nothing has to be discarded).
|
|
16
|
+
*/
|
|
17
|
+
export declare class RetainedInvalidationWatch {
|
|
18
|
+
/** Previous snapshot of the set of locally hidden features */
|
|
19
|
+
private hiddenSnapshot;
|
|
20
|
+
private hiddenSnapshotReady;
|
|
21
|
+
/**
|
|
22
|
+
* Previous generation of the companion drawing (feature companion) registry
|
|
23
|
+
*
|
|
24
|
+
* Registering or unregistering a provider can change the result of classifyFeature, so the
|
|
25
|
+
* cached classification is discarded whenever the generation changes.
|
|
26
|
+
*/
|
|
27
|
+
private companionGeneration;
|
|
28
|
+
/**
|
|
29
|
+
* Previous generation of the terrain subdivision
|
|
30
|
+
*
|
|
31
|
+
* The fill and the outline of a polygon bake the subdivision step into the vertex data. When
|
|
32
|
+
* the step changes (terrain switched on or off, a zoom threshold crossed) they have to be
|
|
33
|
+
* rebuilt. A line is split on the GPU side and bakes nothing, so it would not need a rebuild,
|
|
34
|
+
* but the generation only changes on a zoom crossing or when terrain is switched, so discarding
|
|
35
|
+
* everything is acceptable.
|
|
36
|
+
*/
|
|
37
|
+
private terrainGeneration;
|
|
38
|
+
/**
|
|
39
|
+
* Previous generation of the cells of the globe
|
|
40
|
+
*
|
|
41
|
+
* On the globe the fill and the outline of a polygon bake the cut along the Mercator plane
|
|
42
|
+
* (`view/globe-subdivision.ts`). The generation changes when the globe starts or stops being
|
|
43
|
+
* drawn and when the zoom crosses an integer that changes a cell.
|
|
44
|
+
*/
|
|
45
|
+
private globeGeneration;
|
|
46
|
+
/**
|
|
47
|
+
* Generation of the baked anchor elevation (-1 when not built yet)
|
|
48
|
+
*
|
|
49
|
+
* A point batch bakes the ground elevation into each instance. Unless it is rebuilt when a DEM
|
|
50
|
+
* tile arrives and the elevation changes, only the points are left behind at the old height.
|
|
51
|
+
*/
|
|
52
|
+
private anchorElevationGeneration;
|
|
53
|
+
/**
|
|
54
|
+
* Whether the set of locally hidden features changed
|
|
55
|
+
*
|
|
56
|
+
* The Store updates the same Set in place, so a reference comparison is impossible. The hidden
|
|
57
|
+
* set is usually small, so it is compared by count first and then by every element.
|
|
58
|
+
*/
|
|
59
|
+
locallyHiddenChanged(current: ReadonlySet<string>): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Whether providers of companion drawing were added or removed
|
|
62
|
+
*
|
|
63
|
+
* When the registrations change, the classification "a feature with a companion goes into an
|
|
64
|
+
* immediate chunk" can change. Comparing the generation is a single integer, so with no change
|
|
65
|
+
* the cost per frame is effectively zero.
|
|
66
|
+
*/
|
|
67
|
+
companionsChanged(companions: FeatureCompanionRegistry): boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Whether a generation of the terrain changed
|
|
70
|
+
*
|
|
71
|
+
* There are three things to look at: the subdivision step of the terrain and the cells of the
|
|
72
|
+
* globe (the split points of polygons and lines change), and the anchor elevation (the ground
|
|
73
|
+
* height baked into the points changes). DEM tiles arrive asynchronously, so the last advances
|
|
74
|
+
* several times after the first frame.
|
|
75
|
+
*/
|
|
76
|
+
terrainChanged(terrain: TerrainContext): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Forgets the snapshot of the hidden set (the next call records it again)
|
|
79
|
+
*
|
|
80
|
+
* The generations are kept: a disposed cache still knows the generations it last saw.
|
|
81
|
+
*/
|
|
82
|
+
resetLocallyHidden(): void;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Whether an update of a layer changed only its opacity
|
|
86
|
+
*
|
|
87
|
+
* The opacity is applied at draw time (a uniform of the retained batches, a factor of the drape
|
|
88
|
+
* source), so such an update needs no rebuild. Any other field that differs, including one this
|
|
89
|
+
* function does not know, counts as a change (the safe side).
|
|
90
|
+
*/
|
|
91
|
+
export declare function isOpacityOnlyLayerChange(previous: Layer, layer: Layer): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Whether a change of the layers consists only of opacity updates (nothing created, deleted or
|
|
94
|
+
* reordered, and every update is {@link isOpacityOnlyLayerChange})
|
|
95
|
+
*/
|
|
96
|
+
export declare function isOpacityOnlyLayersChange(layers: NonNullable<StateChanges['layers']>): boolean;
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
import { getAnchorElevationGeneration } from '../terrain/anchor.js';
|
|
4
|
+
/**
|
|
5
|
+
* Snapshots of the inputs that invalidate every chunk
|
|
6
|
+
*
|
|
7
|
+
* Each method records the current value and reports whether it changed since the previous call.
|
|
8
|
+
* The first call only records (there is no cache yet, so nothing has to be discarded).
|
|
9
|
+
*/
|
|
10
|
+
export class RetainedInvalidationWatch {
|
|
11
|
+
constructor() {
|
|
12
|
+
/** Previous snapshot of the set of locally hidden features */
|
|
13
|
+
Object.defineProperty(this, "hiddenSnapshot", {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
configurable: true,
|
|
16
|
+
writable: true,
|
|
17
|
+
value: new Set()
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(this, "hiddenSnapshotReady", {
|
|
20
|
+
enumerable: true,
|
|
21
|
+
configurable: true,
|
|
22
|
+
writable: true,
|
|
23
|
+
value: false
|
|
24
|
+
});
|
|
25
|
+
/**
|
|
26
|
+
* Previous generation of the companion drawing (feature companion) registry
|
|
27
|
+
*
|
|
28
|
+
* Registering or unregistering a provider can change the result of classifyFeature, so the
|
|
29
|
+
* cached classification is discarded whenever the generation changes.
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(this, "companionGeneration", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
configurable: true,
|
|
34
|
+
writable: true,
|
|
35
|
+
value: -1
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Previous generation of the terrain subdivision
|
|
39
|
+
*
|
|
40
|
+
* The fill and the outline of a polygon bake the subdivision step into the vertex data. When
|
|
41
|
+
* the step changes (terrain switched on or off, a zoom threshold crossed) they have to be
|
|
42
|
+
* rebuilt. A line is split on the GPU side and bakes nothing, so it would not need a rebuild,
|
|
43
|
+
* but the generation only changes on a zoom crossing or when terrain is switched, so discarding
|
|
44
|
+
* everything is acceptable.
|
|
45
|
+
*/
|
|
46
|
+
Object.defineProperty(this, "terrainGeneration", {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
configurable: true,
|
|
49
|
+
writable: true,
|
|
50
|
+
value: -1
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Previous generation of the cells of the globe
|
|
54
|
+
*
|
|
55
|
+
* On the globe the fill and the outline of a polygon bake the cut along the Mercator plane
|
|
56
|
+
* (`view/globe-subdivision.ts`). The generation changes when the globe starts or stops being
|
|
57
|
+
* drawn and when the zoom crosses an integer that changes a cell.
|
|
58
|
+
*/
|
|
59
|
+
Object.defineProperty(this, "globeGeneration", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
value: -1
|
|
64
|
+
});
|
|
65
|
+
/**
|
|
66
|
+
* Generation of the baked anchor elevation (-1 when not built yet)
|
|
67
|
+
*
|
|
68
|
+
* A point batch bakes the ground elevation into each instance. Unless it is rebuilt when a DEM
|
|
69
|
+
* tile arrives and the elevation changes, only the points are left behind at the old height.
|
|
70
|
+
*/
|
|
71
|
+
Object.defineProperty(this, "anchorElevationGeneration", {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
configurable: true,
|
|
74
|
+
writable: true,
|
|
75
|
+
value: -1
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Whether the set of locally hidden features changed
|
|
80
|
+
*
|
|
81
|
+
* The Store updates the same Set in place, so a reference comparison is impossible. The hidden
|
|
82
|
+
* set is usually small, so it is compared by count first and then by every element.
|
|
83
|
+
*/
|
|
84
|
+
locallyHiddenChanged(current) {
|
|
85
|
+
if (!this.hiddenSnapshotReady) {
|
|
86
|
+
this.hiddenSnapshot = new Set(current);
|
|
87
|
+
this.hiddenSnapshotReady = true;
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (current.size === this.hiddenSnapshot.size) {
|
|
91
|
+
let same = true;
|
|
92
|
+
for (const id of current) {
|
|
93
|
+
if (!this.hiddenSnapshot.has(id)) {
|
|
94
|
+
same = false;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
if (same)
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
this.hiddenSnapshot = new Set(current);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Whether providers of companion drawing were added or removed
|
|
106
|
+
*
|
|
107
|
+
* When the registrations change, the classification "a feature with a companion goes into an
|
|
108
|
+
* immediate chunk" can change. Comparing the generation is a single integer, so with no change
|
|
109
|
+
* the cost per frame is effectively zero.
|
|
110
|
+
*/
|
|
111
|
+
companionsChanged(companions) {
|
|
112
|
+
const generation = companions.generation();
|
|
113
|
+
if (generation === this.companionGeneration)
|
|
114
|
+
return false;
|
|
115
|
+
// On the first time there is no cache at all, so nothing has to be discarded
|
|
116
|
+
const first = this.companionGeneration === -1;
|
|
117
|
+
this.companionGeneration = generation;
|
|
118
|
+
return !first;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Whether a generation of the terrain changed
|
|
122
|
+
*
|
|
123
|
+
* There are three things to look at: the subdivision step of the terrain and the cells of the
|
|
124
|
+
* globe (the split points of polygons and lines change), and the anchor elevation (the ground
|
|
125
|
+
* height baked into the points changes). DEM tiles arrive asynchronously, so the last advances
|
|
126
|
+
* several times after the first frame.
|
|
127
|
+
*/
|
|
128
|
+
terrainChanged(terrain) {
|
|
129
|
+
let changed = false;
|
|
130
|
+
const generation = terrain.renderState.generation;
|
|
131
|
+
if (generation !== this.terrainGeneration) {
|
|
132
|
+
const first = this.terrainGeneration === -1;
|
|
133
|
+
this.terrainGeneration = generation;
|
|
134
|
+
if (!first)
|
|
135
|
+
changed = true;
|
|
136
|
+
}
|
|
137
|
+
if (terrain.globeGeneration !== this.globeGeneration) {
|
|
138
|
+
const first = this.globeGeneration === -1;
|
|
139
|
+
this.globeGeneration = terrain.globeGeneration;
|
|
140
|
+
if (!first)
|
|
141
|
+
changed = true;
|
|
142
|
+
}
|
|
143
|
+
const anchorGeneration = getAnchorElevationGeneration(terrain);
|
|
144
|
+
if (anchorGeneration !== this.anchorElevationGeneration) {
|
|
145
|
+
const first = this.anchorElevationGeneration === -1;
|
|
146
|
+
this.anchorElevationGeneration = anchorGeneration;
|
|
147
|
+
if (!first)
|
|
148
|
+
changed = true;
|
|
149
|
+
}
|
|
150
|
+
return changed;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Forgets the snapshot of the hidden set (the next call records it again)
|
|
154
|
+
*
|
|
155
|
+
* The generations are kept: a disposed cache still knows the generations it last saw.
|
|
156
|
+
*/
|
|
157
|
+
resetLocallyHidden() {
|
|
158
|
+
this.hiddenSnapshot = new Set();
|
|
159
|
+
this.hiddenSnapshotReady = false;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Whether an update of a layer changed only its opacity
|
|
164
|
+
*
|
|
165
|
+
* The opacity is applied at draw time (a uniform of the retained batches, a factor of the drape
|
|
166
|
+
* source), so such an update needs no rebuild. Any other field that differs, including one this
|
|
167
|
+
* function does not know, counts as a change (the safe side).
|
|
168
|
+
*/
|
|
169
|
+
export function isOpacityOnlyLayerChange(previous, layer) {
|
|
170
|
+
if (previous.opacity === layer.opacity)
|
|
171
|
+
return false;
|
|
172
|
+
const keys = new Set([...Object.keys(previous), ...Object.keys(layer)]);
|
|
173
|
+
for (const key of keys) {
|
|
174
|
+
if (key === 'opacity')
|
|
175
|
+
continue;
|
|
176
|
+
if (previous[key] !== layer[key])
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Whether a change of the layers consists only of opacity updates (nothing created, deleted or
|
|
183
|
+
* reordered, and every update is {@link isOpacityOnlyLayerChange})
|
|
184
|
+
*/
|
|
185
|
+
export function isOpacityOnlyLayersChange(layers) {
|
|
186
|
+
if (layers.created?.length || layers.deleted?.length || layers.orderChanged)
|
|
187
|
+
return false;
|
|
188
|
+
const updated = layers.updated ?? [];
|
|
189
|
+
if (updated.length === 0)
|
|
190
|
+
return false;
|
|
191
|
+
return updated.every(({ layer, previous }) => isOpacityOnlyLayerChange(previous, layer));
|
|
192
|
+
}
|